作为pg的初学者,遇到一个问题,在oracle中delete数据时,可以通过rollback命令来还原数据,而在pg中delete数据时,它会自动提交,那我们如何找回被修改的数据呢?
基于初学者的热情,立马在网上搜索了一番,类似oracle,pg也有一套自己独有的日志系统xlog,相当于oracle的redo。Pg可以通过pg_resetxlog命令来重置事务id,回到修改数据时的那个事务id,那么问题来了,我们怎样找到修改数据时的那个事务id呢?
又立马在网上遨游了一番,发现了一个好东西pageinspect,这是一个pgsql的extension模块,这个模块可以查看数据库底层page的内容,进而可以找到修改数据那个时刻的事务id。
下面我们看下postgres数据库里的xlog系统是怎样的?
在10之前,postgresql的日志系统是XLOG,在之后的版本是WAL。什么是WAL(write-ahead-logging)呢?
顾名思义,就是写在前面的日志,就是事务和数据故障的一个保护,防止出现故障而导致数据丢失。任何修改数据库数据的操作都会自动生成一条记录,并将其记录到日志文件中。这里的日志就是xlog,所有的日志都会写在$PGDATA/pg_xlog目录下面。
和oracle一样,postgresql数据库也会发生日志切换。首先,用户可以通过命令执行主动进行日志切换,这是用户主动切换;当一个日志文件写满之后,数据库会自动进行日志切换,这是日志切换最普遍的现象,日志写满需要新的日志;当日志文件发生切换时,系统将执行检查点操作。
和oracle一样,日志文件也有几种状态,CURRENT表示当前正在使用的日志文件,ACTIVE表示这个日志文件处于激活的状态,不能再次被使用,NOACTIVE表示这个日志文件可以被重用。当日志checkpoint完成或归档完成时,这个日志文件就可以重用了,这是日志的重用条件。
然后,数据库日志文件的信息都存在系统视图里,通过查询sys_redologs视图可以看到。
了解了数据库xlog的概念后,接下来我们看下pageinspect的安装过程,然后怎样使用pg_resetxlog命令重置事务id,查询被修改的数据。
1、源码编译
pageinspect的源码在postgre源码包的contrib目录下
Pageinspect目录下有makefile文件,直接使用make命令进行编译,会生成一个pageinspect.so的文件,然后使用makeinstall命令,把相关文件安装到$PGHOM目录下
2、创建pageinspect extension
进入psql,直接使用createextension pageinspect创建pageinspect模块
创建一个测试表test,insert几条数据,然后执行delete,并查询当前的事务id,用于后面恢复到最新状态
那么,我们怎样找回被修改的数据呢?接下来,就需要使用前面安装的pageinspect模块来分析test表的情况
从这里可以看到,删除的数据的事务号是1855
为了不让数据库保持数据静止状态,需要立刻关闭数据库服务,并且配置关闭auto_vacuumm,保护好原来的数据,防止被vacuum,修改$PGDATA目录下postgresql.conf配置文件,autovacuum= off
然后将数据库的事务id重置到1856,就是刚刚删除数据时的事务id
启动数据库postgresql服务,将删除的数据备份
关闭数据库服务,并重新将postgresql.conf配置文件中的autovacuum还原
使用pg_resetxlog命令重置到最新的事务id,并启动数据库服务,然后进入psql,可以看到被删除的数据已经找回了
参考文档:
https://www.cnblogs.com/plairst/p/9378552.html
http://postgres.cn/docs/9.4/pageinspect.html
http://postgres.cn/docs/9.4/app-pgresetxlog.html
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130071.html
摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...
摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...
阅读 1347·2023-01-11 13:20
阅读 1685·2023-01-11 13:20
阅读 1133·2023-01-11 13:20
阅读 1860·2023-01-11 13:20
阅读 4101·2023-01-11 13:20
阅读 2705·2023-01-11 13:20
阅读 1386·2023-01-11 13:20
阅读 3598·2023-01-11 13:20