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

PostgreSQL 闪回操作汇总

6041

闪回分两种:物理闪回 和 在线闪回
物理闪回:主要通过PITR的方式将数据库实例恢复到故障前一刻,需借助全量备份+连续归档日志
在线闪回:保证数据库正常运行的情况下,依然能将误操作数据追回

这篇文章主要整理PostgreSQL数据库在线闪回的实现方式

基于novacuum

PG数据库的事物号数量是有限制的,要想使用此方式达到恢复数据的效果,需要保证误操作的事务没有被回收及清除,这需要提前设置一下相关的数据库参数,但这些参数往往会有一些副作用,需要权衡。

延迟vacuum操作,有表膨胀的风险
vacuum_defer_cleanup_age = 1000000 (默认值是0)

事务未被freeze
vacuum_freeze_min_age = 50000000

开启事物提交时间
track_commit_timestamp = on(默认值是off,开启这个参数会分配专门的内存来跟踪事务结束时间)

增加autovacuum的延时,让其执行不频繁
autovacuum_naptime = 5min

pg_dirtyread

这是一个脏读插件,可以在vacuum操作之前的把误操作delete/update甚至是drop column的以操作流水的方式记录下来,用于数据恢复,但当执行truncate 操作时脏读流水同步清理的,无法恢复。

链接地址:https://github.com/ChristophBerg/pg_dirtyread
实践链接:https://www.modb.pro/db/376858

基于xlog

pg_waldump

pg_xlogdump是pg10之前版本的名称,从pg10开始改名为pg_waldump,pg_waldump是以可读的形式显示一个PostgreSQL数据库集簇的预写式日志,更多的是调试和教学的目的,你可以看到一个事务的事务号、执行的动作、事务状态以及事务的结束时间,但是并不能将执行的操作解析成可见的undo sql,所以pg_waldump本身没有办法实现故障恢复的功能,更多的是借助全备+归档文件,通过pitr恢复到更精准的位置。

链接地址:https://www.postgresql.org/docs/current/pgwaldump.html

WalMiner

WalMiner是从PostgreSQL的WAL(write ahead logs)日志的解析工具,旨在挖掘wal日志所有的有用信息,从waL日志中解析出SQL(DML和少量DDL),可用于误操作和数据页损坏的场景。与传统的logical decode插件相比,walminer不要求logical日志级别且解析方式较为灵活。WalMiner依赖于数据库的FPW,需要数据库开启full_page_writes参数。

链接地址:https://gitee.com/movead/XLogMiner
实践参考:https://www.modb.pro/db/377608

外挂形式

外挂的方式更多的是利用回收站或者触发器的形式,对数据库做drop 操作的时候,通过重命名表的方式,保留一个备份。但这也就意味着提前做好准备工作,做到事前预防。

pgtrashcan

未更新,对pg10以后的版本不支持,但是思路可以参考
https://github.com/petere/pgtrashcan

基于trigger

参考德哥文章:https://github.com/digoal/blog/blob/master/201504/20150429_01.md?spm=a2c6h.12873639.0.0.b75210d1G3J22g&file=20150429_01.md

总结

对于PG在线闪回,WalMiner 和 pg_dirtyread 是比较常用的,但由于pg_dirtyread需要前期做准备,且对PG的副作用比较大, WalMiner挖掘日志的方式反而更实用一些。

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

文章被以下合辑收录

评论