暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL你疯了么,备份恢复竟然可以这么玩?

305

在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通过合理选择备份策略、定期执行备份任务、测试备份恢复流程,可以确保数据库在面临意外情况时能够迅速有效地进行恢复,保障数据的安全性和可用性。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论