将本地 PostgreSQL 数据库迁移到 Azure
一家公司决定迁移到 Azure Database for PostgreSQL 后,下一步就是计划如何迁移本地数据库以及如何选择用于移动其数据的工具。
了解 Azure Database for PostgreSQL 如何在 Azure 上支持和缩放 PostgreSQL 后,现在需要考虑如何迁移现有的本地数据库。
在此单元中,你将了解如何使用 Azure 门户创建 Azure Database for PostgreSQL 服务的实例。 如果需要创建此服务的多个实例,则可以使用 Azure CLI 来编写进程的脚本。
创建 Azure Database for PostgreSQL 灵活服务器
在 Azure 门户中,在搜索框中键入“Azure Database for PostgreSQL 灵活服务器”,然后选择“Azure Database for PostgreSQL 灵活服务器”。
在“灵活服务器”主边栏选项卡上,选择“创建”,输入服务的详细信息。 这些详细信息包括:
资源组 。 服务器的资源组。
服务器名称。 必须是包含 3 到 63 个字符的唯一名称,仅包含小写字母、数字和连字符。
区域。 服务器的区域。
PostgreSQL 版本:选择与要迁移的本地数据库相对应的版本。
工作负载类型。 请根据工作负载选择选项。
-
- 计算 + 存储。 选择“配置服务器”来设置定价层,并指定服务所需的资源。 第 1 课中介绍了这些选项。 请记住,如果选择“常规用途”或“内存优化”定价层,则可在以后增加和减少虚拟处理器核心数。 但是,不能减少存储量;创建服务器后,存储量只会增加。
管理员用户名。 使用管理员权限创建的用户帐户的名称。 Azure 会创建一些帐户供自己使用。 不能使用“azure_superuser”、“azure_pg_admin”、“admin”、“administrator”、“root”、“guest”、“public”或任何以“pg_”开头的名称。
密码。 必须介于 8 到 128 个字符之间。 它必须包含大写字母和小写字母、数字和非字母数字字符的组合。
单击“查看 + 创建”以部署服务。 部署将需要几分钟的时间。
部署服务后,选择“连接安全性”选项并添加适当的防火墙规则以允许客户端进行连接,如第 1 课的“客户端连接”主题中所述。 同时必须选择“允许访问 Azure 服务”选项。
使用 Azure CLI 创建 Azure Database for PostgreSQL 实例
你可以使用 az postgres flexible-server create
命令创建 Azure Database for PostgreSQL 的实例。 以下语句显示了创建灵活服务器实例的示例。 大多数参数都一目了然,但以下参数除外:
- sku-name。 通过定价层(B 表示基本、GP 表示常规用途、MO 表示内存优化)、计算代系(Gen4 或 Gen5)和虚拟 CPU 核心数的组合构造此参数。 在以下示例中,服务器是使用常规用途定价层和 4 个 Gen5 代系的 CPU 核心创建的。
- storage-size。 这是所需的磁盘存储量,以兆字节为单位进行指定。 以下示例分配 10 GB:
az postgres flexible-server create \ --location northeurope --resource-group testGroup \ --name testserver --admin-user username --admin-password password \ --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \ --tags "key=value" --version 13 --high-availability Enabled --zone 1 \ --standby-zone 3
执行联机迁移
可以使用 Azure 数据库迁移服务执行从本地 PostgreSQL 安装到 Azure Database for PostgreSQL 的联机迁移。
在联机方案中,Azure 数据库迁移服务将所有现有数据复制到 Azure,然后从源数据库持续执行同步操作。 对本地系统执行的任何新事务都会复制到 Azure 中的新数据库。 此过程将一直持续,直到你将客户端应用程序重新配置为使用 Azure 中的新数据库,此时你会终止同步操作。
配置源服务器并导出架构
执行联机迁移的第一步是准备源服务器以支持完全预写日志记录。 在源服务器上,编辑 postgresql.config 文件并配置以下预写日志记录参数。 若要更改这些参数,可重启服务器,仅在预计系统处于静止状态时执行此操作:
wal_level = logical
max_replication_slots = 5
max_wal_senders = 10
重启服务器后,使用 pg_dump 实用工具导出源数据库的架构:
pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql
最后,创建数据库使用的所有扩展的列表。 你将需要在目标数据库中启用这些扩展。 为此,请使用 \dx plsql 命令,或运行以下查询:
SELECT *
FROM pg_extension;
创建目标数据库并导入架构
下一阶段是在 Azure Database for PostgreSQL 服务中创建目标数据库。 可以使用熟悉的工具(如 pgAdmin)连接到服务器,或者可以使用以下示例中的 Azure CLI:
az postgres db create \
--name [database name] \
--server-name [server name] \
--resource-group [azure resource group]
在目标数据库上,启用源数据库使用的任何扩展。
将架构导入到目标数据库。 在保存 db_schema.sql 文件的计算机上,运行以下命令:
psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql
删除目标数据库中的所有外键引用。 需要执行此步骤,因为数据不一定会按任何特定顺序进行迁移,这可能会导致引用完整性冲突,从而导致迁移过程失败。 但是,你应该记录所有外键,因为稍后需要重新创建它们。 使用 psql 实用工具运行以下 SQL 语句,以查找数据库中的所有外键,并生成用于删除这些外键的脚本:
SELECT Queries.tablename
,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
,concat('alter table ', Queries.tablename, ' ',
STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
FROM
(SELECT
tc.table_schema,
tc.constraint_name as foreignkey,
tc.table_name as tableName,
kcu.column_name,
ccu.table_schema AS foreign_table_schema,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
GROUP BY Queries.tablename;
禁用目标数据库中的任何触发器,这样做有两个原因:
- 有助于在复制数据后优化迁移过程。
- 触发器通常用于实现形式复杂的引用完整性,并且出于前面所述的原因,此类型的完整性检查在传输数据时可能会失败。 使用以下 SQL 语句来查找数据库中的所有触发器,并生成一个用于禁用它们的脚本:
SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name) FROM information_schema.triggers;
注意
可以使用 psql 中的 \df+ 命令查找触发器的文本。
创建 Azure 数据库迁移服务实例
在 Azure 门户中,现在可创建 Azure 数据库迁移服务的实例。
在创建 Azure 数据库迁移服务实例之前,必须向订阅注册 Microsoft.DataMigration 资源提供程序。 你可以按如下所示进行操作:
- 在 Azure 门户的左侧菜单栏中,选择“所有服务”。
- 在“所有服务”页面上,选择“订阅”。
- 在“订阅”页面上,选择你的订阅。
- 在“订阅”页的“设置”下,选择“资源提供程序”。
- 在“按名称筛选”框中,键入“DataMigration”,然后选择“Microsoft.DataMigration”。
- 选择“注册”,然后等待“状态”更改为“已注册”。 可能需要选择“刷新”才能查看要更改的状态。
注册资源提供程序后,可以创建服务。 选择左侧菜单栏的“Create a resource”命令,并搜索“Azure 数据库迁移服务”。
在“创建迁移服务”页上,输入服务实例的名称,并指定订阅(应是向其注册资源提供程序的相同订阅)、资源组和位置。 还必须提供虚拟网络,因为数据库迁移服务依赖于为此虚拟网络创建的防火墙来提供必要的保护。 如果要从 Azure 虚拟机迁移数据库,则可以将数据库迁移服务放置在这些虚拟机所使用的同一虚拟网络中。 定价层决定了可用于服务的虚拟处理器核心数。 如果要执行联机迁移,则必须选择“高级”层;“标准”层仅支持脱机迁移。
等待服务部署完毕,然后再继续操作。 此操作将需要几分钟的时间。
使用数据库迁移服务创建迁移项目
现在可以使用数据库迁移服务实例来执行联机迁移。 为此,需要创建新的数据库迁移项目。 转到迁移服务实例页面,然后选择“新建迁移项目”。
在“新建迁移项目”页上,将源服务器类型设置为“PostgreSQL”,将目标服务器类型设置为“Azure Database for PostgreSQL”,然后选择“联机数据迁移”。 “活动类型”页列出了必须在源服务器上执行以启用联机迁移的步骤。 “新建迁移项目”页面底部的文本介绍了将架构迁移到目标的过程。
验证是否已完成这些步骤,然后选择“创建并运行活动”
创建并运行迁移活动
新的迁移项目将启动一个向导,引导你完成该过程。 请提供以下详细信息:
- 在“添加源详细信息”页上,添加源服务器的地址、源数据库以及可连接到此数据库并检索数据的帐户。 此帐户必须具有执行迁移的 SUPERUSER 特权。
- 在“目标详细信息”页上,指定 Azure Database for PostgreSQL 服务的地址、要将数据迁移到其中的数据库以及具有管理权限的帐户的详细信息。
- 在“映射到目标数据库”页上,选择源数据库和目标数据库。 既可迁移单个数据库,也可迁移多个数据库。
- 在“迁移设置”页面上,指定要配置的任何其他设置,例如要并行加载的最大表数目。
- 在“迁移摘要”页上,输入活动的名称,然后选择“运行迁移”。
随即会显示“活动状态”页,其中显示了迁移进度以及发生的任何错误。 如果迁移失败,请更正问题,然后重试该活动。 如果正在执行联机迁移,则在传输完现有数据后,状态会更改为“直接转换可供执行”。 但是,活动会继续运行,以传输应用程序仍在积极使用原始数据库时出现的所有其他更改。
恢复外键和触发器
此时,已传输完数据,应用程序可以开始使用它了。 你应重新创建在迁移数据之前删除的外键,并恢复所有触发器。 如果某些应用程序仍连接到原始数据库,则预写日志记录可确保 Azure 中的目标数据库保持最新状态。 外键和触发器不会对预写日志记录造成不利影响。
直接转换到新数据库
当所有应用程序都切换到新数据库时,可以完成迁移过程,并直接转换到新数据库。 在“活动状态”页上,选择要迁移的数据库的名称,以查看所执行工作的摘要。
选择“启动直接转换”。 你会看到一个页面,要求你确认操作是否已完成。 此时,将用尽源数据库的预写日志中的所有剩余条目,并且更新将停止。 不会传播对源数据库进行的任何进一步更改。
执行脱机迁移
脱机迁移会在特定时间点拍摄源数据库的“快照”,并将该数据复制到目标数据库。 在拍摄快照后对源数据所做的任何更改都不会反映在目标数据库中。
如果要执行到 Azure Database for PostgreSQL 或在其他位置(例如 Azure 虚拟机)运行的 PostgreSQL 服务器的脱机迁移,则至少有两个选项:
- 使用 pg_dump 实用工具从源数据库导出架构和数据,然后使用 psql 实用工具将架构和数据导入目标数据库。 借助此技术,可以在将架构和数据传输到目标数据库之前对其进行修改、重格式化和清理(如有必要)。
- 同样使用 pg_dump 从源数据库中转储数据,然后使用 pg_restore 将数据还原到目标数据库中。 此技术比使用导出和导入更快,但是转储数据所采用的格式不易更改。 如果无需调整架构或数据,请使用此方法。
注意
当前无法使用 Azure 数据库迁移服务来执行 PostgreSQL 数据库的脱机迁移。
使用导出和导入进行迁移
执行以下步骤,通过使用导出和导入方法来迁移数据库。
使用 bash 提示符中的 pg_dump 命令导出架构:
pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
使用 pg_dump 命令将数据导出到其他文件:
pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
此时,db_schema.sql 和 db_data.sql 是使用文本编辑器修改的 SQL 脚本。
在 Azure Database for PostgreSQL 中创建目标数据库。 可通过 Azure CLI 完成此操作:
az postgres db create \ --name [database name] \ --server-name [server name] \ --resource-group [azure resource group]
使用 psql 命令将架构导入到目标数据库:
psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
使用 psql 命令将数据导入到目标数据库:
psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
使用备份和还原进行迁移
以下步骤介绍了使用备份和还原迁移数据库的过程。
备份数据库 - 在 bash 提示符中,运行以下命令。 指定具有备份数据库所需特权的用户名:
pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
在 Azure Database for PostgreSQL 中创建目标数据库:
az postgres db create \ --name [database name] \ --server-name [server name] \ --resource-group [azure resource group] \
使用 bash 提示符中的 pg_restore 命令将备份还原到新数据库中。 在 Azure Database for PostgreSQL 服务中指定具有管理权限的用户名:
pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak