闪回分两种:物理闪回 和 在线闪回
物理闪回:主要通过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挖掘日志的方式反而更实用一些。




