使用pg_resetwal时空穿梭找回“幽灵”元组
pg_resetwal工具是個(gè)很有用的工具,我們使用它來修改控制文件的一些信息,可能用的最多的地方是應(yīng)急清理wal日志并更新lsn信息。但是pg_resetwal這個(gè)功能你可能沒聽說過,可以使用pg_resetwal修改當(dāng)前事務(wù)號(hào)來達(dá)到查看死元組的信息,這些死元組隨著事務(wù)號(hào)的推進(jìn)可能會(huì)像“幽靈”一樣出現(xiàn),然后消失,通過這種方法可以找回以前的行記錄信息。下面具體來看看。
創(chuàng)建一張表,插入三條數(shù)據(jù)
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相關(guān)信息,xmin代表插入的事務(wù)號(hào)
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)關(guān)閉數(shù)據(jù)庫,使用pg_resetwal設(shè)置下一個(gè)事務(wù)號(hào)
[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啟動(dòng)數(shù)據(jù)庫,查看test表內(nèi)容
[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)竟然發(fā)現(xiàn)id=3的記錄莫名消失了,其實(shí)也很好理解,因?yàn)楫?dāng)前xid=511,xid=512的事務(wù)是未來的事務(wù),未來的事務(wù)插入的數(shù)據(jù)對(duì)當(dāng)前事務(wù)不可見。
現(xiàn)在模擬xid向前推進(jìn),再查看表記錄
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)發(fā)現(xiàn)之前刪除的id=2的記錄竟然驚奇的出現(xiàn)了,怎么來理解呢?因?yàn)閕d=2的記錄是xid=513的事務(wù)號(hào)刪除的,而這個(gè)事務(wù)對(duì)于當(dāng)前xid=511的事務(wù)是不可見的,所以xid=513的刪除對(duì)當(dāng)前事務(wù)來說并未刪除,還能看到。
繼續(xù)模擬xid向前推進(jìn)
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)因?yàn)楫?dāng)前xid已經(jīng)推進(jìn)到512,那么對(duì)于以前512號(hào)事務(wù)插入的id=3的記錄此時(shí)就變成可見了。
繼續(xù)推進(jìn)
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時(shí),之前513號(hào)事務(wù)刪除的id=2的元組也消失了。
所以這是一個(gè)很有意思的現(xiàn)象,和pg的mvcc機(jī)制有關(guān),在某些非常規(guī)的情況下可以使用這種方法來應(yīng)急找到還沒來得及被vacuum掉的死元組記錄內(nèi)容。
各位伙伴們好,詹帥本帥搭建了一個(gè)個(gè)人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請(qǐng)移步小程序體驗(yàn)一下哦!(歡迎提建議)
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)
牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)
牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)
總結(jié)
以上是生活随笔為你收集整理的使用pg_resetwal时空穿梭找回“幽灵”元组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单实用,Python代码调试利器
- 下一篇: 神器!微软发布 Python 的 JIT