使用傾印和還原升級 PostgreSQL 資料庫
適用於:適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器
重要
適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器位於淘汰路徑上。 強烈建議您升級至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。 如需移轉至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的詳細資訊,請參閱單一伺服器 適用於 PostgreSQL 的 Azure 資料庫 發生什麼事?。
注意
本文件中說明的概念適用於 適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器和 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。
您可以使用下列方法,將資料庫移轉至較高主要版本伺服器,以升級部署在 適用於 PostgreSQL 的 Azure 資料庫 中的 PostgreSQL 伺服器。
- 使用 PostgreSQL 的離線方法pg_dump和pg_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_dump 和 pg_restore。
搭配使用傾印和還原與 適用於 PostgreSQL 的 Azure 資料庫的必要條件
若要逐步執行本操作指南,您需要:
- 來源 PostgreSQL 資料庫伺服器,執行您要升級的引擎版本較低。
- 目標 PostgreSQL 資料庫伺服器,具有所需的主要版本 適用於 PostgreSQL 的 Azure 資料庫 伺服器 - 單一伺服器或 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。
- PostgreSQL 用戶端系統,用來執行傾印和還原命令。 建議使用較高的資料庫版本。 例如,如果您要從 PostgreSQL 9.6 版升級至 11 版,請使用 PostgreSQL 第 11 版用戶端。
- 它可以是已安裝 PostgreSQL 的 Linux 或 Windows 用戶端,以及已安裝 pg_dump 和 pg_restore 命令行公用程式。
- 或者,您可以使用 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 等命令時提供密碼。 同樣地,您可以設定其他變數,例如PGUSER
PGSSLMODE
等等,請參閱 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 執行。
請確定資料庫存在於目標伺服器中使用
\l
命令。 如果資料庫不存在,請建立資料庫。psql "host=myTargetServer port=5432 dbname=postgres user=myUser password=###### sslmode=mySSLmode"
postgres> \l postgres> create database myTargetDB;
使用管道以單一命令行執行傾印並還原。
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
升級(移轉)程式完成後,您就可以使用目標伺服器來測試應用程式。
針對伺服器內的所有資料庫重複此程式。
例如,下表說明使用串流傾印方法進行移轉所需的時間。 範例數據會使用 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 分鐘的時間。
針對來源伺服器中的每個資料庫,在目標伺服器上建立對應的資料庫。
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
以目錄格式執行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
然後,在目標伺服器上還原備份。
$ 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 升級版本,再直接用於生產環境。 這包括比較舊版版本來源與較新版本目標之間的伺服器參數。 請確定它們相同,並檢查新版本中新增的任何新參數。 您可以在這裡找到版本之間的差異。