在PostgreSQL中,有多种流行的PostgreSQL备份工具,比如pg_dump、pg_basebackup、pgBackRest、pg_rman等,防止数据丢失的第一道防线就是备份,接下里给大家介绍PostgreSQL一些备份恢复的新姿势哈!
1. 块级别恢复
PostgreSQL在全量备份之后,增量备份则需要借助归档的方式,刚发布的PostgreSQL 17在pg_basebackup中新增了一个pg_combinebackup命令用于合并备份,可以实现块级别的增量备份。
使用这个特性需要在数据库打开参数summarize_wal为on,PG17的pg_basebackup命令生成的备份文件多了一个backup_manifest文件,该文件记录的是每个checkpoint周期的WAL日志中记录的变动的block等信息,用于增量备份。
1. 设置参数 ALTER system SET summarize_wal = ON; SELECT pg_reload_conf(); 2.全量备份 pg_basebackup -Fp -D /backup/FULL_BK 3.增量备份 pg_basebackup -Fp -D /backup/INCREMENTAL_01 \ -i /backup/FULL_BK/backup_manifest 注:-i参数指定上一个备份的backup_manifest文件 4.继续增量备份 pg_basebackup -Fp -D /backup/INCREMENTAL_02 \ -i /backup/INCREMENTAL_01/backup_manifest
那么接下来我们就可以合并增量备份,实现数据库的恢复了,但是要注意合并的备份要保证顺序和连续性哈
1.合并目前所有备份 cd /backup pg_combinebackup FULL_BK INCREMENTAL_01 INCREMENTAL_02 \ -o ALL-FULL 2.合并全量备份和部分增量备份 同时也可以选择合并到指定增量备份的,那么我们就这么做 cd /backup pg_combinebackup FULL_BK INCREMENTAL_01 -o ALL-FULL 3.可以直接启动合并后的备份数据库 pg_ctl start -D /backup/ALL-FULL -o '-p 5433'
在这里我们要注意的是,合并备份时,需要全量备份处于第一位,并且增量备份需要保持顺序和连续性。pg_combinebackup工具并不会做文件缺失等验证性工作,所以在合并备份之前要先使用pg_verifybackup工具对备份进行提前验证。
2. PIRT恢复
在PostgreSQL中,PITR(Point-In-Time Recovery)是一种恢复技术,它允许你将数据库恢复到某个特定时间点或事务的状态。
接下来就给大家来分享一下基于时间点的恢复,当然还可以指定还原点或者指定到特定的事物
1.开启WAL归档 vim $PGDATA/postgresql.conf wal_level='replica' archive_mode='on' archive_command='cp %p /backup/pgarch' 2.备份 pg_basebackup -Ft -Pv -Xf -z -Z5 -p5432 -D /pdback 3.初始化数据 create table test01(id int primary key,name varchar(20)); insert into test01 values(1,'a'),(2,'b'),(3,'c'); 先查看一下当前的时间戳 切换一下wal日志,确保最新的wal日志同步到归档目录 select current timestamp;current timestamp 2024-12-07 14:14:29.975833+08 4.误操作将数据删除 select * from test01; delete from test01; select pg_switch_wal(); 5.基于时间点恢复 清理原数据库的目录里面的数据, 将备份的数据拷贝回数据库的目录中 rm -rf $PGDATA/* cp -r /home/postgres/backup/* $PGDATA vi $PGDATA/postgresql.auto.conf restore_command='cp /backup/pgarch/%f %p' recovery_target_time='2024-12-07 14:14:29.975833+08' recovery_target_timeline='latest'
最后启动数据库后,数据库会在指定的时间点停止. 此时数据库可以进行联机,但是要注意解除暂停状态,否则pg数据库处于只读状态。 select pg_wal_replay_resume();
3.神奇的pg_receivewal
pg_receivewal是一个PostgreSQL工具,用于接收并应用 WAL(Write-Ahead Log)归档文件。它通常与pg_start_backup 和 pg_basebackup 一起使用,进行数据的增量备份。
它可以接受连续的wal日志,是基于流复制的方式进行增量备份,非常的方便哈
1.使用pg_basebackup创建一个新的备份 pg_basebackup -U username -h localhost -D /path/to/new_backup 2.使用pg_receivewal捕获WAL文件 pg_receivewal -D /path/to/new_backup/wal -h localhost -U username -v 3.在新备份上使用recovery.conf进行恢复 echo "restore_command = 'cp /path/to/new_backup/wal/%f %p'" > /path/to/new_backup/recovery.conf # 启动PostgreSQL服务 service postgresql start
总结
PostgreSQL通过合理选择备份策略、定期执行备份任务、测试备份恢复流程,可以确保数据库在面临意外情况时能够迅速有效地进行恢复,保障数据的安全性和可用性。
