使用转储和还原迁移 PostgreSQL 数据库

适用于:Azure Database for PostgreSQL - 单一服务器 Azure Database for PostgreSQL - 灵活服务器

可以使用 pg_dump 将 PostgreSQL 数据库提取到转储文件中。 还原数据库的方法根据所选转储的格式来决定。 如果转储采用纯文本格式(这是默认的 -Fp,因此无需指定特定选项),那么只能使用 psql 来还原它,因为它输出纯文本文件。 对于其他 3 种转储方法(自定义、目录和 tar),请使用 pg_restore

重要

本文中提供的说明和命令旨在在 bash 终端中执行。 这包括适用于 Linux 的 Windows 子系统 (WSL) 等环境和其他与 bash 兼容的接口。 请确保使用 bash 终端按照步骤操作,并执行本指南中详述的命令。 使用其他类型的终端或 shell 环境可能会导致命令行为的差异,并且可能不会产生预期的结果。

在本文中,我们将重点介绍纯文本格式(默认)和目录格式。 目录格式非常有用,因为通过它可使用多个核心进行处理,这可以显著提高效率,尤其是对于大型数据库。

Azure 门户通过“连接”边栏选项卡简化了此过程,它提供针对服务器定制的预配置命令,并将值替换为用户数据。 请务必注意,“连接”边栏选项卡仅适用于 Azure Database for PostgreSQL 灵活服务器,不适用于单一服务器。 此功能的使用方式如下:

  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_dumppsql - 使用单个文本文件:非常适合较小的数据库,此选项使用单个文本文件执行转储和还原过程。
    • pg_dumppg_restore - 使用多个核心:对于较大的数据库,此方法更高效,因为它使用多个核心来处理转储和还原过程。

    Screenshot showing two possible dump methods.

  4. 复制和粘贴命令:门户提供现成可用的 pg_dumppsqlpg_restore 命令。 这些命令附带已根据所选服务器和数据库替换的值。 复制并粘贴这些命令。

先决条件

如果使用的是单一服务器,或者无权访问灵活服务器门户,请阅读此文档页。 它包含的信息与门户上灵活服务器的“连接”边栏选项卡中显示的信息类似。

若要逐步执行本操作方法指南,需要:

  • 一个 Azure Database for PostgreSQL 服务器,其中包含允许访问的防火墙规则。
  • pg_dumppsqlpg_restorepg_dumpall,以免你想要使用已安装的角色和权限、命令行实用工具进行迁移。
  • 决定转储的位置:选择要从中执行转储的位置。 可以从各种位置完成转储,例如单独的 VM 或你自己的笔记本电脑。 请始终记住,PostgreSQL 服务器与运行转储或还原的位置之间的距离和延迟。

重要

必须使用 pg_dumppsqlpg_restorepg_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.chinacloudapi.cn -U myuser > roles.sql

如果使用单一服务器,则用户名包括服务器名称组件。 因此不要使用 myuser,而是要使用 myuser@mydemoserver

从灵活服务器转储角色

在灵活服务器环境中,增强的安全性意味着用户无权访问存储角色密码的 pg_authid 表。 此限制会影响如何执行角色转储,因为标准 pg_dumpall -r 命令尝试访问此表来获取密码,但由于缺少权限而失败。

从灵活服务器转储角色时,必须在 pg_dumpall 命令中包含 --no-role-passwords 选项。 此选项可防止 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.chinacloudapi.cn -U myuser > roles.sql

清理角色转储

迁移输出文件时,roles.sql 可能包括新环境中不适用或不允许的某些角色和属性。 需要考虑的操作如下:

  • 删除只能由超级用户设置的属性:如果迁移到没有超级用户权限的环境,请从角色转储中删除 NOSUPERUSERNOBYPASSRLS 等属性。

  • 排除特定于服务的用户:排除单一服务器服务用户,例如 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

此命令会删除包含 azure_superuserazure_pg_adminazuresu 的行以及以 CREATE ROLE replicationALTER ROLE replication 开头的行,并从 ALTER ROLE 语句中移除 NOSUPERUSERNOBYPASSRLS 属性。

创建一个包含要加载的数据的转储文件

若要将本地或 VM 中现有的 PostgreSQL 数据库导出到 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.chinacloudapi.cn -U myuser > testdb_dump.sql

如果使用单一服务器,则用户名包括服务器名称组件。 因此不要使用 myuser,而是要使用 myuser@mydemoserver

将数据还原到目标数据库中

还原角色和用户

在还原数据库对象之前,请确保已正确转储并清理角色。 如果要在同一服务器上的数据库中迁移,可能没有必要转储和还原角色。 但是,对于跨不同服务器或环境的迁移,此步骤至关重要。

若要将角色和用户还原到目标数据库中,请使用以下命令:

psql -f roles.sql -h <server_name> -U <user_name>

<server_name> 替换为目标服务器的名称,将 <user_name> 替换为用户名。 此命令使用 psql 实用工具来执行 roles.sql 文件中包含的 SQL 命令,从而有效地将角色和用户还原到目标数据库。

例如,如果你有一个名为 mydemoserver 的服务器和一个名为 myuser 的用户,请运行以下命令:

psql -f roles.sql -h mydemoserver.postgres.database.chinacloudapi.cn -U myuser

如果使用单一服务器,则用户名包括服务器名称组件。 因此不要使用 myuser,而是要使用 myuser@mydemoserver

注意

如果单一服务器或要从中迁移的本地服务器上已有同名的用户,并且目标服务器上也有同名用户,则请注意,此还原过程可能会更改这些角色的密码。 因此,需要执行的后续命令可能都需要更新后的密码。 如果源服务器是灵活服务器,则此要求不适用,因为由于增强的安全措施,灵活服务器不支持为用户转储密码。

创建新的 数据库

在还原数据库之前,可能需要创建新的空数据库。 为此,你正在使用的用户必须具有 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.chinacloudapi.cn -U myuser
    

    如果使用单一服务器,则用户名包括服务器名称组件。 因此不要使用 myuser,而是要使用 myuser@mydemoserver

  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.chinacloudapi.cn -U myuser 2> errors.log

还原后检查

还原过程完成后,请务必查看 errors.log 文件,了解可能发生的任何错误。 此步骤对于确保已还原数据的完整性和完成性至关重要。 解决日志文件中找到的任何问题,以保持数据库的可靠性。

优化迁移过程

使用大型数据库时,转储和还原过程可能耗时很长,并且可能需要优化来确保效率和可靠性。 请务必了解可能影响这些操作的性能的各种因素,并采取措施来优化这些操作。

有关优化转储和还原过程的详细指导,请参阅 pg_dump 和 pg_restore 的最佳做法一文。 此资源提供有利于处理大型数据库的综合信息和策略。

后续步骤