PostgreSQL12中实现增量备份与任意时间点恢复
在postgres中,能够使用简单的逻辑备份工具pg_dump做某个数据库的完整备份
问题
如果数据库在运行过程中发生故障, 使用逻辑备份只能将数据库还原到备份时刻, 无法恢复到故障发生前的那个时刻;
由于误操作修改或删除了重要数据, 需要还原到误操作前的那个时刻
解决方案
增量备份和任意时间点恢复
实现增量备份的思路是
1. 记录数据库系统的操作记录(WAL归档)
2. 在某一时刻进行一次完整的数据库备份
3. 需要恢复时,还原上一次完整的数据库备份,根据操作记录恢复数据库至指定的某个时刻(即可以实现PITR 时间点恢复)
操作
1、配置数据库、vim postgresql.conf
wal_level = replica archive_mode = on archive_command = 'cp %p /home/test/archive/%f && echo %f >> /home/test/archive/archive.list'
wal_keep_segments=1024
2、重启数据库
pg_ctl -D /home/test/data/ -l /home/test/log restart
3、此后数据库的操作都会记录wal日志文件到/home/test/archive目录下
[test@localhost bin]$ ls /home/test/archive/ 000000010000000000000001 000000010000000000000002 000000010000000000000003 000000010000000000000004 archive.list
4、创建基础备份,可以使用pg_basebackup
pg_basebackup -D /home/test/back -Fp -v -P -Upostgres -R
5、测试数据准备
postgres=# create table t2(a int); CREATE TABLE postgres=# insert into t2 values (generate_series(1,1000000)); INSERT 0 1000000
记录时间:2020年 05月 09日 星期六 21:46:57 CST
postgres=# create table t3(a int); CREATE TABLE postgres=# insert into t3 values (generate_series(1,1000000)); INSERT 0 1000000
6、假定数据库故障,停止数据库,备份故障data并将基础备份的back替换为新data
mv data data_back mv back data
7、修改data目录下postgresql.auto.conf
restore_command = 'cp /home/test/archive/%f %p > /home/test/archive/recovery.log 2>&1 ' recovery_target_time = '2020-05-09 21:46:57'
recovery_target_time表示要恢复到的时间点
8、启动数据库
/usr/pgsql-12/bin/./pg_ctl -D data/ start
9、查看数据,可知t3未被恢复
[test@localhost ~]$ psql -Upostgres psql (12.2) 输入 "help" 来获取帮助信息. postgres=# \dt 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+------+--------+---------- public | t1 | 数据表 | postgres public | t2 | 数据表 | postgres (2 行记录)
日志信息:
2020-05-09 21:40:15.638 CST [13422] 日志: 数据库上次关闭时间为 2020-05-08 23:24:35 CST 2020-05-09 21:40:15.686 CST [13420] 日志: 数据库系统准备接受连接 2020-05-09 22:05:18.986 CST [23055] 日志: 数据库系统中断;上一次的启动时间是在2020-05-09 21:53:25 CST 2020-05-09 22:05:19.003 CST [23055] 日志: 正在进入备用模式 2020-05-09 22:05:19.019 CST [23055] 日志: 从归档中恢复日志文件 "000000010000000000000009" 2020-05-09 22:05:19.040 CST [23055] 日志: redo 在 0/9000060 开始 2020-05-09 22:05:19.041 CST [23055] 日志: 在0/9000138上已到达一致性恢复状态 2020-05-09 22:05:19.042 CST [23053] 日志: 数据库系统准备接受只读请求的连接 2020-05-09 22:05:19.055 CST [23055] 日志: 从归档中恢复日志文件 "00000001000000000000000A" 2020-05-09 22:05:19.384 CST [23055] 日志: 从归档中恢复日志文件 "00000001000000000000000B" 2020-05-09 22:05:19.837 CST [23055] 日志: 从归档中恢复日志文件 "00000001000000000000000C" 2020-05-09 22:05:20.343 CST [23055] 日志: 从归档中恢复日志文件 "00000001000000000000000D" 2020-05-09 22:05:20.986 CST [23055] 日志: 恢复停止在事物 494 提交之前, 时间 2020-05-09 21:47:16.174754+08 2020-05-09 22:05:20.986 CST [23055] 日志: 恢复操作已暂停 2020-05-09 22:05:20.986 CST [23055] 提示: 执行 pg_wal_replay_resume() 以继续.
the end;
但行好事,莫问前程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤