pg_resetwal工具是个很有用的工具,我们使用它来修改控制文件的一些信息,可能用的最多的地方是应急清理wal日志并更新lsn信息。但是pg_resetwal这个功能你可能没听说过,可以使用pg_resetwal修改当前事务号来达到查看死元组的信息,这些死元组随着事务号的推进可能会像“幽灵”一样出现,然后消失,通过这种方法可以找回以前的行记录信息。下面具体来看看。

创建一张表,插入三条数据

postgres=# create table test(id int);
CREATE TABLE
postgres=# insert into test values(1);
INSERT 0 1
postgres=# insert into test values(2);
INSERT 0 1
postgres=# insert into test values(3);
INSERT 0 1

查看表的xmin相关信息,xmin代表插入的事务号

postgres=# select xmin,xmax,* from test;xmin | xmax | id
------+------+----510 |    0 |  1511 |    0 |  2512 |    0 |  3
(3 rows)

模拟删除id=2的记录

postgres=# delete from test where id=2;
DELETE 1
postgres=# select xmin,xmax,* from test;xmin | xmax | id
------+------+----510 |    0 |  1512 |    0 |  3
(2 rows)

关闭数据库,使用pg_resetwal设置下一个事务号

[postgres@HWFBS01 ~]$ pg_ctl stop
waiting for server to shut down....... done
server stopped
[postgres@HWFBS01 ~]$ pg_resetwal -x 511 -D /pgdata/pginst1/
Write-ahead log reset

启动数据库,查看test表内容

[postgres@HWFBS01 ~]$ pg_ctl start -l logfile
waiting for server to start.... done
server started
[postgres@HWFBS01 ~]$ psql
psql (13.0)
Type "help" for help.postgres=# select xmin,xmax,* from test;xmin | xmax | id
------+------+----510 |    0 |  1
(1 row)

竟然发现id=3的记录莫名消失了,其实也很好理解,因为当前xid=511,xid=512的事务是未来的事务,未来的事务插入的数据对当前事务不可见。

现在模拟xid向前推进,再查看表记录

postgres=# select txid_current();txid_current
--------------511
(1 row)postgres=# select xmin,xmax,* from test;xmin | xmax | id
------+------+----510 |    0 |  1511 |  513 |  2
(2 rows)

发现之前删除的id=2的记录竟然惊奇的出现了,怎么来理解呢?因为id=2的记录是xid=513的事务号删除的,而这个事务对于当前xid=511的事务是不可见的,所以xid=513的删除对当前事务来说并未删除,还能看到。

继续模拟xid向前推进

postgres=# select txid_current();txid_current
--------------512
(1 row)postgres=# select xmin,xmax,* from test;  xmin | xmax | id
------+------+----510 |    0 |  1511 |  513 |  2512 |    0 |  3
(3 rows)

因为当前xid已经推进到512,那么对于以前512号事务插入的id=3的记录此时就变成可见了。

继续推进

postgres=# select txid_current();       txid_current
--------------513
(1 row)postgres=# select xmin,xmax,* from test;xmin | xmax | id
------+------+----510 |    0 |  1512 |    0 |  3
(2 rows)

xid来到513时,之前513号事务删除的id=2的元组也消失了。

所以这是一个很有意思的现象,和pg的mvcc机制有关,在某些非常规的情况下可以使用这种方法来应急找到还没来得及被vacuum掉的死元组记录内容。

各位伙伴们好,詹帅本帅搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)

推荐阅读

牛逼!Python常用数据类型的基本操作(长文系列第①篇)

牛逼!Python的判断、循环和各种表达式(长文系列第②篇)

牛逼!Python函数和文件操作(长文系列第③篇)

牛逼!Python错误、异常和模块(长文系列第④篇)

使用pg_resetwal时空穿梭找回“幽灵”元组相关推荐

  1. 银河证券CIO唐沛来:部署ITIL服务流程,让时空穿梭

    银河证券CIO唐沛来:部署ITIL服务流程,让时空穿梭 信息化的推进使我国各个行业迅速发展,尤其是我国金融行业中开展比较晚的证券业,一曲"信息化"传奇使证券行业的发展却是" ...

  2. CSS3,JS制作网页动画(时空穿梭,魔方,坠落星星,全屏樱花特效)

    目录 1.整体效果三个页面 2.P1时空穿梭 3.P2主页 4.P3樱花 1.整体效果三个页面 初衷是做一个祝福生日的模板,从第一张到最后一张是三个页面点击跳转依次显示,用gif图制作一些动画效果还是 ...

  3. 酷炫纯CSS代码实现时空穿梭动效

    效果展示: 使用场景,可以用于大数据大屏背景,或者是穿越动画的过渡,下载地址在文章末尾 项目目录结构: html部分: <!doctype html> <html>     & ...

  4. PR片头模板|光线扭曲时空穿梭LOGO片头视频模板

    这是一个光线扭曲时空穿梭超级炫酷视频开场LOGO片头PR模板素材 Premiere片头模板,标志以明亮发光的霓虹虫洞或抽象隧道动画展现,引领你的标志.更改颜色以获得不同的外观或与您的品牌相匹配. Pr ...

  5. Three.js无限3D时空穿梭特效

    可能每个人的童年都有个时空穿梭梦,印象深刻的是第一次看<机器猫>,主角康夫卧室的抽屉就是时空隧道的入口,跳进隧道的那一刻,时间浮光掠影般从身边流过,仿佛进入了异世界. 这次我们用three ...

  6. BZOJ 3434 时空穿梭

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意: 思路: const int mod=10007; const int N=1 ...

  7. 【WC2014】时空穿梭【组合数】【莫比乌斯反演】【整除分块】【暴力多项式】

    题意:TTT 组数据,给一个 nnn 维空间,第 iii 维大小为 [1,mi]∩Z[1,m_i]\cap \Z[1,mi​]∩Z,求大小为 ccc 的严格偏序上升的共线点集个数.答案模 100071 ...

  8. BZOJ3434 [Wc2014]时空穿梭

    摔电脑摔电脑!JZP业界毒瘤! 400题纪念~哇终于上400了的说!!!好不容易欸! 题解什么的还是Orz iwtwiioi 我求组合数的方法明明是O(n)的,为什么这么慢!!!令人报警! 喂,话说这 ...

  9. 时空穿梭 探寻高端存储架构的前世今生

    低端存储拼价格,中端存储拼功能,那么高端存储拼什么?当然是架构.5月8日,浪潮正式推出新一代高端存储AS18000,满足了关键业务对高性能.高可靠性.高可扩展性的核心需求,而这一切的基础就是其独特的架 ...

最新文章

  1. 企业网络推广专员浅析是否网站权重越高企业网络推广效果越好?
  2. Vue_(组件通讯)动态组件结合keep-alive
  3. Android开发之系统信息——获取Android手机中SD卡内存信息
  4. 机器学习之 weka学习(六)最大内存
  5. JDBC笔记-李伟杰版
  6. java 反射创建属性_使用Java反射机制确定基本数据类型属性
  7. thinkphp无法加载控制器:Admin
  8. ssh Permission denied (publickey,password).
  9. win10远程控制+Android,win10实现手机远程控制电脑步骤分享
  10. 通过小白三步装机版安装win10系统教程
  11. 2013电商十大新趋势
  12. 什么是CPU主频、外频、倍频?之间关系是?
  13. 计算机高级语言程序的流程控制结构,汇编语言(四) - 程序结构
  14. 使用webots的MPC的移动机器人轨迹跟踪控制
  15. 【对流氓软件说ByeBye】—— 恶意软件删除工具
  16. 有的人呀,他真的是带不动。。。
  17. NormalEstimation法向量估计理论和代码---PCL源码笔记
  18. 基于jsp+ssm的员工人事工资管理系统
  19. visual studio code怎么改成中文
  20. PYTHON画爱心(利用pycharm)

热门文章

  1. php如何判断提交内容为空,php禁止提交空表单(php空值判断)的方法
  2. java怎么判断字符串是否为空的几种方法(亲测)
  3. Java 基础 - 面向对象(不错N多教程集合)
  4. 微信web开发者工具调试
  5. TP6返回插入数据的自增ID
  6. PHP之composer切换国内源
  7. jQuery获取HTML标签自定义属性值或data值
  8. Oracle中的in 和 not in
  9. 微信机、网络和java的相关知识点
  10. linux wifi关闭5g,TP-Link路由器如何关闭5G无线Wi-Fi信号?