资讯专栏INFORMATION COLUMN

PG之使用pg_resetxlog访问被修改数据

IT那活儿 / 2657人阅读
PG之使用pg_resetxlog访问被修改数据

作为pg的初学者,遇到一个问题,在oracle中delete数据时,可以通过rollback命令来还原数据,而在pg中delete数据时,它会自动提交,那我们如何找回被修改的数据呢?


基于初学者的热情,立马在网上搜索了一番,类似oracle,pg也有一套自己独有的日志系统xlog,相当于oracle的redo。Pg可以通过pg_resetxlog命令来重置事务id,回到修改数据时的那个事务id,那么问题来了,我们怎样找到修改数据时的那个事务id呢?


又立马在网上遨游了一番,发现了一个好东西pageinspect,这是一个pgsql的extension模块,这个模块可以查看数据库底层page的内容,进而可以找到修改数据那个时刻的事务id。


下面我们看下postgres数据库里的xlog系统是怎样的?


[
PostgreSQL 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,查询被修改的数据。


[
Pageinspect的安装
]


1、源码编译

pageinspect的源码在postgre源码包的contrib目录下


Pageinspect目录下有makefile文件,直接使用make命令进行编译,会生成一个pageinspect.so的文件,然后使用makeinstall命令,把相关文件安装到$PGHOM目录下


2、创建pageinspect extension

进入psql,直接使用createextension pageinspect创建pageinspect模块



[
使用pg_resetxlog重置事务id,访问被修改的数据
]

创建一个测试表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

相关文章

  • 让 TiDB 访问多种数据源 | TiDB Hackathon 优秀项目分享

    摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...

    OBKoro1 评论0 收藏0
  • 让 TiDB 访问多种数据源 | TiDB Hackathon 优秀项目分享

    摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...

    张红新 评论0 收藏0
  • 让 TiDB 访问多种数据源 | TiDB Hackathon 优秀项目分享

    摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...

    JasonZhang 评论0 收藏0
  • 让 TiDB 访问多种数据源 | TiDB Hackathon 优秀项目分享

    摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...

    cartoon 评论0 收藏0
  • 让 TiDB 访问多种数据源 | TiDB Hackathon 优秀项目分享

    摘要:拿到返回结果进一步的进行计算处理。比较痛苦的经历不支持,我们就只好写内置函数,就把另外一个模块拖下来,自己修改加上语法,然后在加上自己设计的内置函数。其次就是涉及的的源码模块很多,从优化器执行器内置函数以及各种各样的结构。 本文作者是来自 CC 组的兰海同学,他们的项目《让 TiDB 访问多种数据源》在本届 TiDB Hackathon 2018 中获得了二等奖。该项目可以让 TiDB...

    lewinlee 评论0 收藏0
  • CDH5 安装相关问题

    摘要:为了避免由系统引起的不必要的安全漏洞,中的初始设置十分严格,可以像下面这样增加设置这个例子允许私有网络使用加密的密码连接到所有用户和所有数据库。 CDH5 相关 安装 安装manager wget http://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin chmod +x cl...

    wemallshop 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<