使用傾印和還原移轉 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 資料庫 - 彈性伺服器,不適用於單一伺服器。 以下是您可以使用這項功能的方式:

  1. 存取 Azure 入口網站:首先,移至 [Azure 入口網站],然後選擇 [連線] 刀鋒視窗。

    Screenshot showing the placement of Connect blade in Azure portal.

  2. 選取您的資料庫:在 [連線] 刀鋒視窗中,您會找到資料庫的下拉式清單。 選取您想要從中執行傾印的資料庫。

    Screenshot showing the dropdown where specific database can be chosen.

  3. 選擇適當的方法:根據您的資料庫大小,您可以選擇兩種方法:

    • pg_dump & psql - 使用單一文本文件:適用於較小的資料庫,此選項會針對傾印和還原程式使用單一文本檔。
    • pg_dump & pg_restore - 使用多個核心:對於較大的資料庫,此方法更有效率,因為它使用多個核心來處理傾印和還原程式。

    Screenshot showing two possible dump methods.

  4. 複製並貼上命令:入口網站可讓您準備好使用 pg_dumppsqlpg_restore 命令。 這些命令隨附的值已根據您選擇的伺服器和資料庫來取代。 複製並貼上這些命令。

必要條件

如果您使用單一伺服器,或沒有彈性伺服器入口網站的存取權,請閱讀本文件頁面。 其中包含的信息類似於入口網站上彈性伺服器的 [連線] 刀鋒視窗中所呈現的資訊。

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

  • 適用於 PostgreSQL 的 Azure 資料庫 伺服器,包括允許存取的防火牆規則。
  • pg_dump、psqlpg_restorepg_dumpall,以防您想要使用已安裝的角色和許可權、命令行公用程式進行移轉。
  • 決定傾印的位置:選擇您要執行傾印的位置。 它可以從不同的位置完成,例如個別的 VM、 Cloud Shell (其中已安裝命令行公用程式,但可能不在適當的版本中,因此請一律使用 或 psql --version您自己的膝上型電腦檢查版本。 請記住 PostgreSQL 伺服器與您執行傾印或還原的位置之間的距離和延遲。

重要

請務必使用pg_dumppsqlpg_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 時,可能包含新環境中不適用或允許的特定角色和屬性。 以下是您需要考慮的事項:

  • 拿掉只能由超級使用者設定的屬性:如果移轉至您沒有超級使用者許可權的環境,請移除角色傾印中的 和 NOBYPASSRLSNOSUPERUSER屬性。

  • 排除服務特定使用者:排除單一伺服器服務使用者,例如 azure_superuserazure_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 和的行,並從語句中移除 NOSUPERUSERNOBYPASSRLS 屬性。 azuresuazure_pg_adminazure_superuserALTER ROLEALTER 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 許可權。 以下是兩種常用的方法:

  1. 使用 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

  2. 使用 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 的最佳作法一文。 此資源提供可用於處理大型資料庫的完整資訊和策略。

下一步