日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用pg_resetwal时空穿梭找回“幽灵”元组

發布時間:2024/9/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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时空穿梭找回“幽灵”元组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。