使用傾印和還原移轉 PostgreSQL 資料庫
適用於:適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
您可以使用 pg_dump 將 PostgreSQL 資料庫擷取至傾印檔案。 還原資料庫的方法取決於您選擇的傾印格式。 如果您的傾印採用純文本格式(這是預設值 -Fp
,因此不需要指定任何特定選項),則唯一使用 psql 還原它的選項,因為它會輸出純文本檔。 針對其他三個傾印方法:應該使用自定義、目錄和 tar,pg_restore。
重要
本文中提供的指示和命令是設計成在bash終端機中執行。 這包括 Windows 子系統 Linux 版(WSL)、Azure Cloud Shell 和其他 bash 相容的介面等環境。 請確定您使用bash終端機來遵循這些步驟,並執行本指南中詳述的命令。 使用不同類型的終端機或殼層環境可能會導致命令行為的差異,而且可能不會產生預期的結果。
在本文中,我們將焦點放在純文本 (預設值) 和目錄格式。 目錄格式很有用,因為它可讓您使用多個核心來處理,這可以大幅提升效率,尤其是大型資料庫。
Azure 入口網站 透過 [連線] 刀鋒窗口簡化此程式,方法是提供針對伺服器量身打造的預先設定命令,並將值取代為您的用戶數據。 請務必注意,連線 刀鋒視窗僅適用於 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,不適用於單一伺服器。 以下是您可以使用這項功能的方式:
存取 Azure 入口網站:首先,移至 [Azure 入口網站],然後選擇 [連線] 刀鋒視窗。
選取您的資料庫:在 [連線] 刀鋒視窗中,您會找到資料庫的下拉式清單。 選取您想要從中執行傾印的資料庫。
選擇適當的方法:根據您的資料庫大小,您可以選擇兩種方法:
pg_dump
&psql
- 使用單一文本文件:適用於較小的資料庫,此選項會針對傾印和還原程式使用單一文本檔。pg_dump
&pg_restore
- 使用多個核心:對於較大的資料庫,此方法更有效率,因為它使用多個核心來處理傾印和還原程式。
複製並貼上命令:入口網站可讓您準備好使用
pg_dump
和psql
或pg_restore
命令。 這些命令隨附的值已根據您選擇的伺服器和資料庫來取代。 複製並貼上這些命令。
必要條件
如果您使用單一伺服器,或沒有彈性伺服器入口網站的存取權,請閱讀本文件頁面。 其中包含的信息類似於入口網站上彈性伺服器的 [連線] 刀鋒視窗中所呈現的資訊。
若要逐步執行本操作指南,您需要:
- 適用於 PostgreSQL 的 Azure 資料庫 伺服器,包括允許存取的防火牆規則。
- pg_dump、psql、pg_restore和pg_dumpall,以防您想要使用已安裝的角色和許可權、命令行公用程式進行移轉。
- 決定傾印的位置:選擇您要執行傾印的位置。 它可以從不同的位置完成,例如個別的 VM、 Cloud Shell (其中已安裝命令行公用程式,但可能不在適當的版本中,因此請一律使用 或
psql --version
您自己的膝上型電腦檢查版本。 請記住 PostgreSQL 伺服器與您執行傾印或還原的位置之間的距離和延遲。
重要
請務必使用pg_dump
、psql
pg_restore
、 和 pg_dumpall
公用程式,這些公用程式是相同主要版本或比您要匯出數據或匯入數據至之資料庫伺服器更高的主要版本。 若無法這麼做,可能會導致數據遷移失敗。 如果您的目標伺服器的主要版本高於來源伺服器,請使用相同主要版本或高於目標伺服器的公用程式。
注意
請務必注意, pg_dump
一次只能匯出一個資料庫。 無論您選擇的方法為何,不論使用單一檔案還是多個核心,都適用這項限制。
使用 傾印使用者和角色 pg_dumpall -r
pg_dump
用來將PostgreSQL資料庫擷取至傾印檔案。 不過,請務必瞭解 pg_dump
這不會傾印角色或使用者定義,因為這些物件會被視為PostgreSQL環境中的全域物件。 若要進行完整的移轉,包括使用者和角色,您必須使用 pg_dumpall -r
。
此命令可讓您從 PostgreSQL 環境擷取所有角色和用戶資訊。 如果您要在相同伺服器上的資料庫內移轉,請放心略過此步驟,並移至 [建立新的資料庫 ] 區段。
pg_dumpall -r -h <server name> -U <user name> > roles.sql
例如,如果您有名為 mydemoserver
的伺服器,且名為 myuser
的用戶會執行下列命令:
pg_dumpall -r -h mydemoserver.postgres.database.azure.com -U myuser > roles.sql
如果您使用單一伺服器,您的使用者名稱會包含伺服器名稱元件。 因此,請使用 ,myuser@mydemoserver
而不是 myuser
。
從彈性伺服器傾印角色
在彈性伺服器環境中,增強式安全性措施表示用戶無法存取pg_authid數據表,也就是儲存角色密碼的位置。 此限制會影響您執行角色傾印的方式,因為標準 pg_dumpall -r
命令會嘗試存取此數據表的密碼,並因為許可權不足而失敗。
從彈性伺服器傾印角色時,請務必 --no-role-passwords
在命令中包含 pg_dumpall
選項。 此選項可防止 pg_dumpall
嘗試存取 pg_authid
資料表,因為安全性限制而無法讀取該數據表。
若要從彈性伺服器成功傾印角色,請使用下列命令:
pg_dumpall -r --no-role-passwords -h <server name> -U <user name> > roles.sql
例如,如果您有名為 mydemoserver
的伺服器,則為 名為 myuser
的使用者,請執行下列命令:
pg_dumpall -r --no-role-passwords -h mydemoserver.postgres.database.azure.com -U myuser > roles.sql
清除角色傾印
移轉輸出檔案 roles.sql
時,可能包含新環境中不適用或允許的特定角色和屬性。 以下是您需要考慮的事項:
拿掉只能由超級使用者設定的屬性:如果移轉至您沒有超級使用者許可權的環境,請移除角色傾印中的 和
NOBYPASSRLS
等NOSUPERUSER
屬性。排除服務特定使用者:排除單一伺服器服務使用者,例如
azure_superuser
或azure_pg_admin
。 這些是服務特有的,而且會在新的環境中自動建立。
使用下列 sed
命令來清除角色傾印:
sed -i '/azure_superuser/d; /azure_pg_admin/d; /azuresu/d; /^CREATE ROLE replication/d; /^ALTER ROLE replication/d; /^ALTER ROLE/ {s/NOSUPERUSER//; s/NOBYPASSRLS//;}' roles.sql
這個指令會移除包含 、、、行開頭為 CREATE ROLE replication
和的行,並從語句中移除 NOSUPERUSER
和 NOBYPASSRLS
屬性。 azuresu
azure_pg_admin
azure_superuser
ALTER ROLE
ALTER ROLE replication
建立包含要載入之數據的傾印檔案
若要將現有的 PostgreSQL 資料庫在內部部署或 VM 中匯出至 sql 腳本檔案,請在現有的環境中執行下列命令:
pg_dump <database name> -h <server name> -U <user name> > <database name>_dump.sql
例如,如果您有名為 mydemoserver
的伺服器、名為 myuser
的使用者和名為 testdb
的資料庫,請執行下列命令:
pg_dump testdb -h mydemoserver.postgres.database.azure.com -U myuser > testdb_dump.sql
如果您使用單一伺服器,您的使用者名稱會包含伺服器名稱元件。 因此,請使用 ,myuser@mydemoserver
而不是 myuser
。
將數據還原至目標資料庫
還原角色和使用者
還原資料庫物件之前,請確定您已正確傾印並清除角色。 如果您要在相同伺服器上的資料庫內移轉,則不需要傾印角色和還原角色。 不過,若要跨不同伺服器或環境進行移轉,此步驟非常重要。
若要將角色和使用者還原至目標資料庫,請使用下列命令:
psql -f roles.sql -h <server_name> -U <user_name>
取代為目標伺服器名稱,並以<user_name>
您的使用者名稱取代 <server_name>
。 此命令會 psql
使用 公用程式來執行檔案中包含的 roles.sql
SQL 命令,有效地將角色和使用者還原至目標資料庫。
例如,如果您有名為 mydemoserver
的伺服器,則為 名為 myuser
的使用者,請執行下列命令:
psql -f roles.sql -h mydemoserver.postgres.database.azure.com -U myuser
如果您使用單一伺服器,您的使用者名稱會包含伺服器名稱元件。 因此,請使用 ,myuser@mydemoserver
而不是 myuser
。
注意
如果您已經在您要移轉的單一伺服器或內部部署伺服器上具有相同名稱的使用者,而且您的目標伺服器,請注意,此還原程式可能會變更這些角色的密碼。 因此,您需要執行的任何後續命令可能需要更新的密碼。 如果您的來源伺服器是彈性伺服器,則不適用,因為彈性伺服器不允許因為增強的安全性措施而為使用者傾印密碼。
建立新的 資料庫
還原資料庫之前,您可能需要建立新的空白資料庫。 若要這樣做,您使用的用戶必須具有 CREATEDB
許可權。 以下是兩種常用的方法:
使用
createdb
公用程式 :程式createdb
允許直接從bash命令行建立資料庫,而不需要登入PostgreSQL或離開作業系統環境。 例如:createdb <new database name> -h <server name> -U <user name>
例如,如果您有名為
mydemoserver
的伺服器、名為myuser
的使用者,以及您要建立的新資料庫為testdb_copy
,請執行下列命令:createdb testdb_copy -h mydemoserver.postgres.database.azure.com -U myuser
如果您使用單一伺服器,您的使用者名稱會包含伺服器名稱元件。 因此,請使用 ,
myuser@mydemoserver
而不是myuser
。使用 SQL 命令若要使用 SQL 命令 建立資料庫,您必須透過命令行介面或資料庫管理工具連線到 PostgreSQL 伺服器。 線上之後,您可以使用下列 SQL 命令來建立新的資料庫:
CREATE DATABASE <new database name>;
將取代 <new database name>
為您想要提供新資料庫的名稱。 例如,若要建立名為 testdb_copy
的資料庫,命令會是:
CREATE DATABASE testdb_copy;
還原傾印
建立目標資料庫之後,您可以從傾印檔案將數據還原到這個資料庫。 在還原期間,將任何錯誤記錄至 errors.log
檔案,並在還原完成後檢查其內容是否有任何錯誤。
psql -f <database name>_dump.sql <new database name> -h <server name> -U <user name> 2> errors.log
例如,如果您有名為 mydemoserver
的伺服器、名為 myuser
的使用者,以及名為 testdb_copy
的新資料庫,請執行下列命令:
psql -f testdb_dump.sql testdb_copy -h mydemoserver.postgres.database.azure.com -U myuser 2> errors.log
還原后檢查
還原程式完成之後,請務必檢閱 errors.log
檔案中可能發生的任何錯誤。 此步驟對於確保還原數據的完整性和完整性至關重要。 解決記錄檔中找到的任何問題,以維護資料庫的可靠性。
優化移轉程式
使用大型資料庫時,傾印和還原程式可能相當冗長,而且可能需要優化以確保效率和可靠性。 請務必注意可能會影響這些作業效能的各種因素,並採取措施將其優化。
如需優化傾印和還原程序的詳細指引,請參閱 pg_dump和pg_restore 的最佳作法一文。 此資源提供可用於處理大型資料庫的完整資訊和策略。
下一步
- pg_dump和pg_restore的最佳做法。
- 如需將資料庫移轉至 適用於 PostgreSQL 的 Azure 資料庫 的詳細資訊,請參閱資料庫移轉指南。