每個提交的事務都會記錄 WAL,以確保持久性。這可確保您的 PostgreSQL 實例可以執行崩潰恢復,并避免丟失任何已提交的事務。當 full_page_writes 設置為 ON 時,PostgreSQL 會將每個磁盤頁面的全部內容以及行級更改寫入 WAL。這對于安全的崩潰恢復非常重要。但是,這可能會將更多數據寫入 WAL。
將 WAL 寫入和包含表/索引的數據目錄相同的磁盤,可能會給繁忙的事務數據庫帶來 I/O 瓶頸。因此,如果您觀察到有大量 WAL 生成(由于大量 DML)導致服務器中的 I/O 等待,我們始終建議您將 WAL 目錄移動到一個新的磁盤。
要將 WAL 移動到一個其他目錄,我們必須重新啟動 PostgreSQL 服務器。這可能會導致停機,因此需要適當規劃。此外,請確保在新的 pg_wal 目錄中規劃有足夠的存儲空間,用于存儲啟用復制槽時給備用數據庫應用的所有 WAL 段。我們必須這樣做,因為當使用復制槽時,尚未確認為備用數據庫已應用的 WAL 段,不會從主數據庫的 pg_wal 目錄中刪除。如果長時間未注意到這種情況,這可能會累積多個 GB 的 WAL 段。
以下步驟可用于將 pg_wal 移動到新位置:
1. 在新磁盤上創建一個新目錄,并將所有權分配給 Postgres:
# mkdir -p /wals# chown postgres:postgres /wals
2. 停止 PostgreSQL 實例(如果該實例已在運行):
$ pg_ctl -D $PGDATA stop -mf
3. 如果您想避免由于大量 WAL 而導致的更長停機時間,請跳過步驟 2 繼續執行步驟 3b。否則,請繼續執行步驟 3a:
3a. 將 pg_wal 中的所有現有 WAL 和 archive_status 目錄,移動到另一個磁盤上的新目錄。確保 pg_wal 為空,并且所有內容都移動到了新目錄:
$ mv $PGDATA/pg_wal/* /wals
3b. 使用 rsync 避免在將大量 WAL 段復制到其他磁盤時出現超長的停機時間:
$ rsync -avzh $PGDATA/pg_wal/ /wals$ pg_ctl -D $PGDATA stop -mf$ rsync -avzh $PGDATA/pg_wal/ /wals
4. 刪除舊的 WAL 目錄后,創建一個符號鏈接:
$ rmdir $PGDATA/pg_wal$ ln -s /wals pg_wal$ ls -alrth pg_wallrwxrwxrwx. 1 postgres postgres 5 Nov 10 00:16 pg_wal -> /wals
5. 立即啟動 PostgreSQL 實例:
$ pg_ctl -D $PGDATA start
這樣,您就成功地將 WAL 目錄移動到了另一個位置。
要移動 pg_wal,我們必須向服務器添加一個新磁盤,并創建將在其中存儲 WAL 段的新目錄。我們還需要確保為目錄授予適當的權限,如步驟 1 所示。由于這需要您關閉 Postgres 服務器以移動 WAL 目錄,因此我們可以使用類似于步驟 2 中所示的命令,來關閉 Postgres。
如果您有大量的 WAL 段,則可以通過跳過此步驟繼續執行步驟 3b,來避免更長的停機時間。如果沒有,您可以使用步驟 3a,簡單地將現有 pg_wal 目錄的所有內容移動到新的目錄。
如果您希望避免超長的停機時間,并希望跳過步驟 2 和 3a,則只需使用步驟 3b,它使用 rsync 將所有現有的 WAL 段從 pg_wal 復制到新的 WAL 目錄。完成后,我們可以簡單地關閉 Postgres,并再次使用 rsync 來復制新生成的 WAL 段。 移動完所有 WAL 段后,刪除舊的 WAL 目錄,并創建指向新目錄的符號鏈接,如步驟 4 所示。
正如我們所看到的,pg_wal 不會從數據目錄中永久刪除。相反,一個指向我們要將 WAL 移動到的新目錄的符號鏈接會創建出來。創建符號鏈接后,我們可以啟動 PostgreSQL,如步驟 5 所示,開始將新生成的 WAL 段寫入新的 WAL 目錄。
如果您有一個具有 1 個主節點和 1 個或多個備節點的高可用集群,則可以以滾動方式或一次性執行所有步驟。在復制集群的每個服務器中具有不同的位置,一直是可以的。 因此,您可以停止所有服務器并執行這些步驟,或者在一臺又一臺服務器上執行這些步驟。
本文鏈接:http://www.tebozhan.com/showinfo-26-87505-0.html壓力很大嗎?可以考慮移動下 WAL 日志目錄
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 從未有過的Kubectl指南