使用傾印和還原升級 PostgreSQL 資料庫

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器位於淘汰路徑上。 強烈建議您升級至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。 如需移轉至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的詳細資訊,請參閱單一伺服器 適用於 PostgreSQL 的 Azure 資料庫 發生什麼事?

注意

本文件中說明的概念適用於 適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器和 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。

您可以使用下列方法,將資料庫移轉至較高主要版本伺服器,以升級部署在 適用於 PostgreSQL 的 Azure 資料庫 中的 PostgreSQL 伺服器。

  • 使用 PostgreSQL 的離線方法pg_dumppg_restore,這會導致數據遷移停機。 本文件說明升級/移轉的這個方法。
  • 使用 資料移轉服務 (DMS) 的在線方法。 此方法提供停機時間降低的移轉,並讓目標資料庫與來源保持同步,而且您可以選擇何時進行移轉。 不過,使用 DMS 需要解決幾個必要條件和限制。 如需詳細資料,請參閱 DMS 文件
  • 使用 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器就地主要版本升級方法。就地主要版本升級功能只要按兩下即可執行伺服器的主要版本升級。 這可簡化升級程式,將存取伺服器的使用者和應用程式中斷降至最低。 就地升級是升級實例主要版本的較簡單方式,因為它們會在升級后保留伺服器名稱和目前伺服器的其他設定,而且不需要數據遷移或變更應用程式 連接字串。 就地升級的速度比資料移轉更快,而且停機時間更短。

下表根據資料庫大小和案例提供一些建議。

資料庫/案例 傾印/還原(離線) DMS (在線)
您有小型資料庫,而且可以承受升級的停機時間 X
小型資料庫 (< 10 GB) X X
中小型 DB (10 GB – 100 GB) X X
大型資料庫 (> 100 GB) X
可以承受升級的停機時間(不論資料庫大小為何) X
可以解決 DMS 必要條件,包括重新啟動嗎? X
在升級程式期間,可以避免 DCL 和未記錄的數據表? X

本指南提供一些離線移轉方法和範例,示範如何從來源伺服器移轉至執行較高版本的PostgreSQL的目標伺服器。

注意

PostgreSQL 傾印和還原可以透過多種方式執行。 您可以選擇使用本指南中提供的其中一種方法進行移轉,或選擇任何符合您需求的替代方式。 如需具有其他參數的詳細傾印和還原語法,請參閱文章 pg_dumppg_restore

搭配使用傾印和還原與 適用於 PostgreSQL 的 Azure 資料庫的必要條件

若要逐步執行本操作指南,您需要:

  • 來源 PostgreSQL 資料庫伺服器,執行您要升級的引擎版本較低。
  • 目標 PostgreSQL 資料庫伺服器,具有所需的主要版本 適用於 PostgreSQL 的 Azure 資料庫 伺服器 - 單一伺服器適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
  • PostgreSQL 用戶端系統,用來執行傾印和還原命令。 建議使用較高的資料庫版本。 例如,如果您要從 PostgreSQL 9.6 版升級至 11 版,請使用 PostgreSQL 第 11 版用戶端。
    • 它可以是已安裝 PostgreSQL 的 Linux 或 Windows 用戶端,以及已安裝 pg_dumppg_restore 命令行公用程式。
    • 或者,您可以使用 Azure Cloud Shell,或在 Azure 入口網站上方的功能表欄上選取 Azure Cloud Shell。 您必須先登入您的帳戶 az login ,才能執行傾印和還原命令。
  • 您的 PostgreSQL 用戶端最好是在與來源和目標伺服器相同的區域中執行。

其他詳細數據和考慮

  • 您可以從入口網站中選取「連線 字串」,找到來源和目標資料庫的 連接字串。
  • 您可能會在伺服器中執行多個資料庫。 您可以連線到來源伺服器並執行 \l來尋找資料庫清單。
  • 在目標資料庫伺服器中建立對應的資料庫,或將 選項新增 -Cpg_dump 建立資料庫的命令。
  • 您不得升級 azure_maintenance 或範本資料庫。 如果您已對範本資料庫進行任何變更,您可以選擇移轉變更,或在目標資料庫中進行這些變更。
  • 請參閱上述數據表,以判斷資料庫適合此移轉模式。
  • 如果您想要使用 Azure Cloud Shell,請注意會話會在 20 分鐘後逾時。 如果您的資料庫大小為 < 10 GB,您可能可以在沒有會話逾時的情況下完成升級。否則,您可能必須以其他方式讓會話保持開啟,例如在 10-15 分鐘內按下任何按鍵一次。

本指南中使用的範例資料庫

在本指南中,下列來源和目標伺服器和資料庫名稱可用來說明範例。

說明
來源伺服器 (v9.5) pg-95.postgres.database.azure.com
來源資料庫 bench5gb
源資料庫大小 5 GB
來源用戶名稱 pg@pg-95
目標伺服器 (v11) pg-11.postgres.database.azure.com
目標資料庫 bench5gb
目標用戶名稱 pg@pg-11

注意

彈性伺服器支援PostgreSQL 11版及更新版本。 此外,彈性伺服器使用者名稱不需要 @dbservername。

使用離線移轉方法來升級資料庫

您可以選擇使用本節所述的其中一個方法來升級。 您可以在執行工作時使用下列秘訣。

  • 如果您針對來源和目標資料庫使用相同的密碼,您可以設定 PGPASSWORD=yourPassword 環境變數。 然後,您不需要在每次執行 psql、pg_dump 和 pg_restore 等命令時提供密碼。 同樣地,您可以設定其他變數,例如 PGUSERPGSSLMODE 等等,請參閱 PostgreSQL 環境變數

  • 如果您的 PostgreSQL 伺服器需要 TLS/SSL 連線(預設在 適用於 PostgreSQL 的 Azure 資料庫 伺服器上),請設定環境變數PGSSLMODE=require,讓pg_restore工具與 TLS 連線。 如果沒有 TLS,可能會讀取錯誤 FATAL: SSL connection is required. Please specify SSL options and retry.

  • 在 Windows 命令行中,先執行 命令 SET PGSSLMODE=require ,再執行 pg_restore 命令。 在 Linux 或 Bash 中執行 命令 export PGSSLMODE=require ,再執行 pg_restore 命令。

重要

本檔中提供的步驟和方法,是提供一些pg_dump/pg_restore命令的範例,而且不會代表執行升級的所有可能方式。 建議您先在測試環境中測試及驗證命令,再將其用於生產環境。

移轉角色

角色(使用者)是全域物件,在還原資料庫之前,必須先個別移轉至新的叢集。 您可以使用 pg_dumpall 二進位檔搭配 -r (--roles-only) 選項來傾印它們。 若要從來源單一伺服器傾印所有具有密碼的角色

pg_dumpall -r --host=mySourceServer --port=5432 --username=myUser@mySourceServer --database=mySourceDB > roles.sql

若要傾印所有角色名稱,而不用來源彈性伺服器的密碼

pg_dumpall -r --no-role-passwords --host=mySourceServer --port=5432 --username=myUser --database=mySourceDB > roles.sql

重要

在 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器使用者不允許存取pg_authid數據表,其中包含資料庫授權標識符的相關信息以及用戶的密碼。 因此,無法擷取用戶的密碼。 請考慮使用 Azure 金鑰保存庫 安全地儲存您的秘密。

roles.sql在目標伺服器中使用 psql 還原內容之前,請編輯和移除 和 NOBYPASSRLS 的參考NOSUPERUSER

psql -f roles.sql --host=myTargetServer --port=5432 --username=myUser --dbname=postgres

不應該預期傾印腳本會在沒有錯誤的情況下完全執行。 特別是,因為腳本會針對來源叢集中現有的每個角色發出 CREATE ROLE,所以對於啟動程式超級使用者,例如azure_pg_admin或azure_superuser,請務必收到「角色已經存在」錯誤。 這個錯誤是無害的,而且可以忽略。 --clean使用 選項可能會產生與不存在對象有關的其他無害錯誤訊息,不過您可以藉由新增 --if-exists來最小化這些錯誤訊息。

方法 1:使用 pg_dump 和 psql

此方法牽涉到兩個步驟。 首先,使用 從來源伺服器 pg_dump傾印 SQL 檔案。 第二個步驟是使用 psql將檔案匯入目標伺服器。 如需詳細資訊, 請參閱使用導出和匯 入文件進行移轉。

方法 2:使用pg_dump和pg_restore

在此升級方法中,您會先使用 pg_dump從來源伺服器建立傾印。 然後使用 將傾印檔案還原至目標伺服器 pg_restore。 如需詳細資訊, 請參閱使用傾印和還原 移轉檔。

方法 3:使用將傾印數據串流至目標資料庫

如果您沒有 PostgreSQL 用戶端,或想要使用 Azure Cloud Shell,則可以使用此方法。 資料庫傾印會直接串流至目標資料庫伺服器,而且不會將傾印儲存在用戶端中。 因此,這可與具有有限記憶體的用戶端搭配使用,甚至可以從 Azure Cloud Shell 執行。

  1. 請確定資料庫存在於目標伺服器中使用 \l 命令。 如果資料庫不存在,請建立資料庫。

     psql "host=myTargetServer port=5432 dbname=postgres user=myUser password=###### sslmode=mySSLmode"
    
    postgres> \l   
    postgres> create database myTargetDB;
    
  2. 使用管道以單一命令行執行傾印並還原。

    pg_dump -Fc --host=mySourceServer --port=5432 --username=myUser --dbname=mySourceDB | pg_restore  --no-owner --host=myTargetServer --port=5432 --username=myUser --dbname=myTargetDB
    

    例如,

    pg_dump -Fc --host=pg-95.postgres.database.azure.com --port=5432 --username=pg@pg-95 --dbname=bench5gb | pg_restore --no-owner --host=pg-11.postgres.database.azure.com --port=5432 --username=pg@pg-11 --dbname=bench5gb
    
  3. 升級(移轉)程式完成後,您就可以使用目標伺服器來測試應用程式。

  4. 針對伺服器內的所有資料庫重複此程式。

例如,下表說明使用串流傾印方法進行移轉所需的時間。 範例數據會使用 pgbench 填入。 因為您的資料庫可以有不同的物件數目,其大小與 pgbench 產生的數據表和索引不同,因此強烈建議您測試傾印和還原資料庫,以了解升級資料庫所需的實際時間。

資料庫大小 大約所花費的時間
1 GB 1-2 分鐘
5 GB 8-10 分鐘
10 GB 15-20 分鐘
50 GB 1-1.5 小時
100 GB 2.5-3 小時

方法 4:使用平行傾印和還原

如果您的資料庫中有幾個較大的數據表,而且想要平行處理該資料庫的傾印和還原程式,則可以考慮此方法。 您也需要足夠的記憶體,才能容納備份傾印。 此平行傾印和還原程式可減少完成整個移轉的時間耗用量。 例如,使用方法 1 完成移轉的 50 GB pgbench 資料庫需要 1-1.5 小時的時間,2 使用此方法花費不到 30 分鐘的時間。

  1. 針對來源伺服器中的每個資料庫,在目標伺服器上建立對應的資料庫。

    psql "host=myTargetServer port=5432 dbname=postgres user=myuser password=###### sslmode=mySSLmode"
    
    postgres> create database myDB;
    

    例如,

    psql "host=pg-11.postgres.database.azure.com port=5432 dbname=postgres user=pg@pg-11 password=###### sslmode=require"
    psql (12.3 (Ubuntu 12.3-1.pgdg18.04+1), server 13.3)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    postgres> create database bench5gb;
    postgres> \q
    
  2. 以目錄格式執行pg_dump命令,其中作業數目 = 4(資料庫中的數據表數目)。 使用較大的計算層和更多數據表,您可以將它增加為較高的數位。 該pg_dump會建立目錄來儲存每個作業的壓縮檔案。

    pg_dump -Fd -v --host=sourceServer --port=5432 --username=myUser --dbname=mySourceDB -j 4 -f myDumpDirectory
    

    例如,

    pg_dump -Fd -v --host=pg-95.postgres.database.azure.com --port=5432 --username=pg@pg-95 --dbname=bench5gb -j 4 -f dump.dir
    
  3. 然後,在目標伺服器上還原備份。

    $ pg_restore -v --no-owner --host=myTargetServer --port=5432 --username=myUser --dbname=myTargetDB -j 4 myDumpDir
    

    例如,

    $ pg_restore -v --no-owner --host=pg-11.postgres.database.azure.com --port=5432 --username=pg@pg-11 --dbname=bench5gb -j 4 dump.dir
    

提示

本檔中所述的程式也可以用來升級您的 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。 主要差異在於彈性伺服器目標的 連接字串 沒有 @dbName。 例如,如果使用者名稱是 ,則連接字串中的單一伺服器使用者名稱會是 pgpg@pg-95,而使用彈性伺服器時,您只要使用 即可。pg

升級/移轉後

完成主要版本升級之後,建議您在每個資料庫中執行 ANALYZE 命令來重新整理 pg_statistic 數據表。 否則,您可能會遇到效能問題。

postgres=> analyze;
ANALYZE

下一步

  • 滿意目標資料庫函式之後,您可以卸除舊的資料庫伺服器。
  • 針對 適用於 PostgreSQL 的 Azure 資料庫 - 僅限單一伺服器。 如果您想要使用與來源伺服器相同的資料庫端點,則在刪除舊源資料庫伺服器之後,您可以使用舊的資料庫伺服器名稱來建立讀取複本。 建立穩定復寫狀態之後,您可以停止複本,這會將複本伺服器升階為獨立伺服器。 如需詳細資訊,請參閱 複寫

重要

強烈建議先測試新的 PostgreSQL 升級版本,再直接用於生產環境。 這包括比較舊版版本來源與較新版本目標之間的伺服器參數。 請確定它們相同,並檢查新版本中新增的任何新參數。 您可以在這裡找到版本之間的差異。