使用傾印和還原來升級您的 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
小型至中型資料庫 (10 GB – 100 GB) X X
大型資料庫 (> 100 GB) X
可以承受升級的停機時間 (無論資料庫大小為何) X
能滿足 DMS 必要條件,包括重新開機嗎? X
可以在升級程序期間,避免 DDL 和未記錄的資料表產生嗎? X

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

注意

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

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

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

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

其他詳細資料和考量

  • 您可以從入口網站選取 [連接字串],以尋找來源和目標資料庫的連接字串。
  • 您可能會在伺服器中執行一個以上的資料庫。 您可以連線到來源伺服器,並執行 \l 來尋找資料庫清單。
  • 在目標資料庫伺服器中建立對應的資料庫,或將 -C 選項新增至建立資料庫的 pg_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 Key Vault 以安全地儲存您的秘密。

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

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 和 psql_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。 例如,如果使用者名稱為 pg,則連接字串中的單一伺服器使用者名稱會是 pg@pg-95,但若是彈性伺服器,您只要使用 pg 即可。

升級/移轉後

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

postgres=> analyze;
ANALYZE

下一步

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

重要

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