Postgresql

PostgreSQL“凍結”/“解凍”命令等價物

  • June 11, 2013

在 Derby(一個用 Java 編寫的嵌入式數據庫,主要用於測試或原型設計)中,有可以在線上備份期間使用的“凍結”和“解凍”命令。“凍結”只會導致所有數據庫訪問阻塞,直到呼叫“解凍”。這對於使用外部程序進行備份很有用,如果外部程序比使用 Derby 的內部備份解決方案快得多,您可能會這樣做。對於我的案例,我可以使用一些內置的文件系統實用程序幾乎立即拍攝快照,因此它是一個恆定時間操作(不是O(length of DB files))。

我正在將一個已經超過 Derby 的應用程序遷移到 PostgreSQL,我想知道那裡是否有任何類似的東西可以用來停止所有連接。另外,我更願意從我的應用程序內部知道我的序列化點是什麼,這樣我就不會陷入某種尷尬的狀態,因此能夠暫停/恢復所有其他訪問對我來說真的很不錯。

由於 PostgreSQL 有一個事務日誌,我可以在不“凍結”的情況下拍攝快照,但快照需要通過 PostgreSQL 的恢復機制執行才能使用它,否則儲存在磁碟上的內容與我拉取的內容相同普通文件系統上的外掛。這種解決方案並不理想。

編輯我了解到這pg_start_backup()很接近,但它不會導致傳入事務阻塞,直到匹配呼叫pg_stop_backup(),迫使我做一個時間點恢復回到pg_start_backup()從文件系統快照返回的事務 id。不必真正關閉 PostgreSQL 來獲得它會很好(也許有一個偽關閉命令可以保持連接打開?)。

沒有與您想要的完全等價的東西。選項包括:

原子文件系統快照

如果您使用的是原子文件系統快照,則無需凍結數據庫。如果你強制CHECKPOINT第一次,它可能會使恢復更快一點,但僅此而已。當您拍攝文件系統快照並複制它,然後開始複製時,對於 PostgreSQL,它就好像它崩潰並開始備份一樣。這很好,它是碰撞安全的,並且旨在以這種方式工作。

這種方法只有在快照是原子的情況下才有效——它們都在同一個虛擬瞬間。您無法獲得跨多個文件系統的原子快照(至少在 Linux 上),因此如果您的數據庫被拆分為多個表空間或 WAL 位於堆的單獨磁碟上,則您不能使用這種方法。

pg_start_backup/pg_stop_backup

如果你不能做一個原子快照,你可以啟用 WAL 歸檔、執行pg_start_backup、複製數據庫、執行pg_stop_backup和擷取最後生成的 WAL 歸檔。

它有點複雜,但它可以為您提供一致的備份,而無需停止寫入,也不需要文件系統級別的原子快照。

pg_basebackup

使用pg_start_backupand的替代方法pg_stop_backuppg_basebackup通過PostgreSQL複製協議使用--xlog-method=stream. 這只需要一個PostgreSQL 複製連接,不需要停止數據庫,並且非常無縫。

--xlog-method=stream僅在最近的版本中添加,並且pg_basebackup它本身是相當新的。

pg_dump

我最初沒有提到它,因為您正在尋找外部工具,但總是有pg_dump,它獲取SERIALIZABLE數據庫的快照並將其轉儲。數據庫繼續正常執行(它仍然可以接受寫入),並且從您開始轉儲開始,轉儲在內部完全一致。

寫靜止

停止所有傳入事務不會停止 PostgreSQL 寫入。它仍然VACUUM與 autovacuum、要執行的檢查點、要寫入的統計資訊等有關。

在這一點上,Pg 中沒有停止所有寫入的功能。添加它可能會很好,但我不知道有人在做它。

一些文件系統,如 XFS,支持文件系統級別的寫入凍結;這會導致所有寫入阻塞,直到釋放凍結。凍結所有文件系統然後複製所有文件系統是安全的。

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