你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

可以使用 pg_dump 将 PostgreSQL 数据库提取到转储文件中。 还原数据库的方法取决于所选转储的格式。 如果转储采用纯格式(这是默认值 -Fp,因此不需要指定特定选项),则还原它的唯一选项是使用 psql,因为它输出纯文本文件。 对于其他三种转储方法:应使用自定义、目录和 tar,pg_restore

重要

本文中提供的说明和命令旨在在 bash 终端中执行。 这包括适用于 Linux 的 Windows 子系统(WSL)、Azure Cloud Shell 和其他兼容 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_dump & psql - 使用单一文本文件:非常适合较小的数据库,此选项使用单个文本文件进行转储和还原过程。
    • pg_dump & pg_restore - 使用多个核心:对于较大的数据库,此方法更高效,因为它使用多个核心来处理转储和还原过程。

    Screenshot showing two possible dump methods.

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

先决条件

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

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

  • 一个 Azure Database for PostgreSQL 服务器,其中包含允许访问的防火墙规则。
  • pg_dump、psqlpg_restorepg_dumpall,如果要使用已安装的角色和权限、命令行实用工具进行迁移。
  • 决定转储的位置:选择要从中执行转储的位置。 它可以从各种位置完成,例如单独的 VM、cloud shell(其中已安装命令行实用工具,但可能不在适当的版本中),因此始终检查使用版本(例如),psql --version或你自己的笔记本电脑。 请记住 PostgreSQL 服务器与运行转储或还原的位置之间的距离和延迟。

重要

pg_dumppg_dumpallpg_restorepsql必须使用与要从中导出数据或将数据导入到的数据库服务器相同的主版本或更高主版本的实用工具和实用工具。 否则可能会导致数据迁移失败。 如果目标服务器的主版本高于源服务器,请使用与目标服务器相同的主版本或高于目标服务器的实用工具。

注意

请务必注意, 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使用 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

例如,如果有一个名为“用户”的服务器 mydemoservermyuser请运行以下命令:

pg_dumpall -r --no-role-passwords -h mydemoserver.postgres.database.azure.com -U myuser > roles.sql

清理角色转储

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

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

  • 排除特定于服务的用户:排除单一服务器服务用户,例如 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_superuser行、azure_pg_adminazuresu和行以及从ALTER ROLE语句中删除NOSUPERUSERNOBYPASSRLS属性的行CREATE ROLE replicationALTER ROLE replication

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

若要将本地或 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.azure.com -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 命令,从而有效地将角色和用户还原到目标数据库。

例如,如果有一个名为“用户”的服务器 mydemoservermyuser请运行以下命令:

psql -f roles.sql -h mydemoserver.postgres.database.azure.com -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.azure.com -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.azure.com -U myuser 2> errors.log

还原后检查

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

优化迁移过程

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

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

后续步骤