1. 程式人生 > >PostgreSQL數據庫備份和還原

PostgreSQL數據庫備份和還原

gun 支持 sync mas 集群 ati mod 對象 在線

備份數據庫三種方法:
SQL轉儲
文件系統級備份。
持續存檔。

    1. SQL轉儲
      使用SQL命令生成一個文件。
      備份用法: pg_dump dbname>dumpfile

    pg_dump是一個常規的 PostgreSQL客戶端應用程序.
    pg_dump不能以特殊權限運行,必須具有對要備份的所有表的讀訪問權限.
    pg_dump連接受普通客戶端身份驗證機制的約束。
    pg_dump 不轉儲有關角色或表空間的信息。

    恢復用法: psql dbname < dumpfile
    在執行psql恢復之前,需要先創建數據庫。
    在還原SQL轉儲之前,所有擁有對象或被授予對轉儲數據庫中對象的權限的用戶必須已存在。

    恢復時遇到SQL錯誤後, 退出恢復:

    psql --set ON_ERROR_STOP=on dbname<dumpfile

    恢復備份後,在每個數據庫上運行ANALYZE,以便查詢優化器具有有用的統計信息。

  • 1.1 ANALYZE 分析
    ANALYZE收集有關數據庫中表的內容的統計信息,
    select * from pg_statistic;
    ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
    參數:
    VERBOSE: 啟用進度消息的顯示。
    table_name : 要分析的特定表的名稱。
    column_name : 要分析的特定列的名稱。

  • 1.2 使用pg_dumpall

    pg_dumpall備份給定集群中的每個數據庫,還保留集群範圍的數據,如角色和表空間定義。
    用法: pg_dumpall> dumpfile
    恢復: psql -f dumpfilepostgres
    在恢復pg_dumpall轉儲時始終需要具有數據庫超級用戶訪問權限,因為這需要恢復角色和表空間信息。
    使用pg_dumpall --globals-only選項單獨轉儲群集範圍的數據.

  • 1.3 處理大型數據庫:
    使用壓縮轉儲: pg_dump dbname| gzip> filename.gz
    恢復: gunzip -c filename.gz | PSQLdbname
    或者: cat filename.gz | gunzip | PSQLdbname

    使用split: 制作1兆字節的塊: pg_dump dbname| split -b 1m - filename
    使用pg_dump的自定義轉儲格式: pg_dump -Fc dbname>filename
    自定義轉儲格式會在將數據寫入輸出文件時壓縮數據.
    自定義格式轉儲,必須使用pg_restore進行恢復: pg_restore -d dbname filename

    使用pg_dump的並行轉儲功能:
    使用-j參數控制並行度。並行轉儲僅支持“目錄”歸檔格式。
    pg_dump -j num-F d -fout.dir dbname
    使用pg_restore -j並行還原轉儲。這適用於“自定義”或“目錄”歸檔模式的任何歸檔,無論是否已創建pg_dump -j.

    1. 文件系統級備份:
      直接復制PostgreSQL用於在數據庫中存儲數據的文件
      tar -cf backup.tar /services/install/postgresql10/data/

    必須關閉數據庫服務器才能獲得可用的備份,在恢復數據之前關閉服務器。
    文件系統備份僅適用於整個數據庫集群的完整備份和還原。

    使用rsync 執行文件系統備份.需要關閉數據庫服務。
    文件系統備份通常比SQL轉儲大,進行文件系統備份可能會更快。

    1. 連續存檔和時間點恢復(PITR):
      postgresql在數據目錄中維護一個預寫日誌pg_wal。
      日誌記錄對數據庫的數據文件所做的每個更改。此日誌主要用於崩潰安全目的:如果系統崩潰,可以通過“ 重放 ”將數據庫恢復到一致性 自上一個檢查點以來所做的日誌條目。

    將文件系統級備份與WAL文件的備份相結合。
    恢復時,先恢復文件系統備份,然後從備份的WAL文件重放以使系統進入當前狀態。
    優點:
    不需要完全一致的文件系統備份。備份中的不一致都將通過日誌重放進行更正。
    只需繼續存檔WAL文件可實現連續備份。
    可在任何時候停止重放,並擁有當時數據庫的一致快照,支持時間點恢復.

    註意:
    只支持恢復整個數據庫集群。需要大量的歸檔存儲,基本備份很大, 高可靠性的首選備份技術。
    連續歸檔(在線備份) 需要連續的歸檔WAL文件。

  • 3.1 設置WAL歸檔:
    系統將此序列物理劃分為WAL 段文件,通常為16MB.
    段文件的數字名稱反映了它們在抽象WAL序列中的位置.

    啟用WAL歸檔:
    將wal_level配置參數設置為replica
    archive_mode設置為 on
    並指定要在archive_command 配置參數中使用的shell命令
    這些設置在postgresql.conf文件中。

    archive命令僅在已完成的WAL段上調用。
    限制未歸檔數據的使用時間: 設置archive_timeout 以強制服務器至少經常切換到新的WAL段文件。archive_timeout一分鐘左右的設置通常是合理的。

    註意:
    WAL歸檔會恢復對PostgreSQL數據庫中的數據所做的任何修改,但不會恢復對配置文件所做的更改。
    wal_level只能在服務器啟動時更改。archive_command可以使用配置文件重新加載來更改。

  • 3.2 進行基本備份:
    使用pg_basebackup工具. 備份可以是文件或者tar歸檔。
    full_page_writes禁用時,備份運行時性能下降。full_page_writes在備份模式期間有效地強制執行備份。

    使用備份:
    需要保留在文件系統備份期間和之後生成的所有WAL段文件
    基本備份過程會創建一個備份歷史記錄文件,該文件立即存儲在WAL歸檔區域中。此文件以文件系統備份所需的第一個WAL段文件命名。

  • 3.3 使用低級API進行基本備份
    低級基本備份可以以非獨占或獨占的方式進行。建議使用非獨占方法。

    非獨占低級備份是允許其他並發備份運行的備份:
    1.確保已啟用WAL存檔並正常工作。
    2.作為具有運行pg_start_backup的權限的用戶連接到服務器:
    SELECT pg_start_backup(‘label‘,false,false);
    label 用來唯一標識此備份操作的任何字符串。
    false 默認情況下,pg_start_backup時間比較長,因為執行檢查點,並且檢查點所需的I / O將在很長一段時間內展開,默認情況下是檢查點間隔的一半.可以最大限度地減少對查詢處理的影響.
    false : 告訴pg_start_backup發起非排他性基礎備份。

    3. SELECT * FROM pg_stop_backup(false,true);
        終止備份模式
  • 3.4 備份數據目錄:
    pg_dynshmem/,pg_notify/,pg_serial/,pg_snapshots/,pg_stat_tmp/,和pg_subtrans/會在postmaster啟動時進行初始化。
    從備份中省略pg_wal/,postmaster.pid和postmaster.opts,pg_replslot,pg_dynshmem/,pg_notify/,pg_serial/,pg_snapshots/,pg_stat_tmp/,和pg_subtrans等目錄。
    pgsql_tmp可以從備份中省略任何以文件或目錄開頭的文件或目錄。

    服務器停止時,無法使用pg_start_backup或pg_stop_backup。

PostgreSQL數據庫備份和還原