使用pg_resetwal时空穿梭找回“幽灵”元组
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时空穿梭找回“幽灵”元组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单实用,Python代码调试利器
- 下一篇: B 站,强的离谱!