Postgresql

PostgreSQL 中是否有某種“撤消”或“倒帶”功能?

  • January 20, 2022

雖然已經很久沒有實際發生了,但是每天都怕自己犯錯,比如不小心刪錯了表,或者刪除了太多的記錄,或者做一些事後馬上意識到的錯誤。

在這種情況下,最好有某種“撤消”或“倒帶”功能。

我當然不是在談論BEGIN...COMMIT/ROLLBACK。我說的是一些東西,我猜它會跟踪過去 X 分鐘內完成的所有事情,並讓您“倒帶”或“撤消”數據庫到最近的狀態,最好以某種使用者友好的方式,例如允許您獲取最近的“送出”列表並在給定點“取消送出”它們。

當然,我有備份,但它們只是每天。如果我現在犯了一個致命的錯誤,我可能能夠恢復到不到 24 小時前的備份,但這意味著我將失去從那時起的所有更改,而且我將如何做這一切都不是很清楚做這個。我基本上會首先恐慌,然後關閉我的系統(包括 PostgreSQL),然後只重新啟動 PG 備份,然後……從我的備份中恢復……充其量是有霧的,但我可以做到。

想像一下,如果我只需要執行以下操作:

REWIND '5 minutes';

然後PG會自動回到5分鐘前的樣子!

那會很甜蜜。即使我很少需要使用它,只要知道它的存在就會讓人鬆一口氣。基本上,就像知道遊輪上有救生艇,而不是意識到沒有救生艇,如果它撞上冰山,你肯定會和船一起倒下。

為了清楚起見,這將是“高於”(或低於?)“交易”概念的一層。交易會像現在一樣發生在這個安全系統/框架的“內部”。

如果不存在這樣的事情,那麼除了“始終非常小心並且不要犯錯誤”之外,最好的解決方案/解決方法是什麼?對我來說,每天進行一次以上的備份是不切實際的,並且逐步/部分備份,坦率地說,它們對我來說是一個很大的謎,每次我嘗試閱讀時我總是放棄它們關於如何設置和使用它們。

PS:我確實找到了一個非常古老的類似問題,但它幾乎沒有答案,也沒有任何有用的答案,而且自 7 多年前以來情況可能已經發生了變化。

你所要求的不存在。我認為如果你經常不得不在一個重要的數據庫中手動執行互動式 SQL 語句,那麼你的操作程序就有問題了。

我們能提供的最好的是:

  • 具有時間點恢復和自動還原過程的線上備份
  • 在您最喜歡的互動式客戶端中將自動送出設置為關閉

這有點危險,因為長時間的事務會威脅到數據庫的健康。確保idle_in_transaction_timeout在伺服器上正確設置。

來自評論:

這通常稱為“時間點恢復”。請參閱一篇相當古老的文章:https ://pgdash.io/blog/postgres-incremental-backup-recovery.html 。這個過程實際上不會“倒帶”,而是恢復到以前的備份,然後“重播”到您想要的時間點。另請參閱e-maj,它提供了與您想要的類似的東西。此答案中提到:選擇性撤消 PostgreSQL 中已送出的事務 -使用者/993

引用自:https://dba.stackexchange.com/questions/280825