在选择将数据库迁移到 Cloud SQL 之前,请考虑此迁移场景的已知限制。
将 PostgreSQL 数据库用作来源时的已知限制包括:
pglogical扩展程序不支持为 PostgreSQL 12 及更高版本复制 生成的列。对表结构 (DDL) 的更改不会通过标准 DDL 命令进行复制,而只能通过使用用于复制的
pglogical扩展程序执行的命令进行复制。这包括对enum类型的更改。- 例如,
pglogical提供了pglogical.replicate_ddl_command函数,该函数允许在一致的时间点对源数据库和副本运行 DDL。 - 如需为新创建的表复制数据,您必须使用
pglogical.replication_set_add_table命令将新表添加到现有复制集。 - 如需详细了解迁移过程中的 DDL 复制,请参阅迁移保真度。
- 例如,
对于没有主键的表,Database Migration Service 支持在变更数据捕获 (CDC) 阶段迁移初始快照和
INSERT语句。迁移UPDATE和DELETE语句的方式因以下情况而异:- 标准迁移:系统不会为没有主键的表迁移
UPDATE和DELETE语句。您必须在迁移之前为列添加主键,或手动迁移UPDATE和DELETE语句。 - 快速启动迁移:对于快速启动迁移,如果您将副本标识设置为
INDEX或FULL,则无需主键即可复制UPDATE和DELETE操作。配置REPLICA IDENTITY FULL会增加预写式日志 (WAL) 卷和资源开销。建议您在可行的情况下添加主键。如需了解详情,请参阅 PostgreSQL 副本身份文档和 快速入门迁移指南。
- 标准迁移:系统不会为没有主键的表迁移
Database Migration Service 不会迁移物化视图中的数据,只会迁移视图架构。如需在目标数据库中填充视图,请运行:
REFRESH MATERIALIZED VIEW view_name。在持续 CDC 期间,目标上的
SEQUENCE状态(例如last_value)可能与来源不同。序列值会在最终升级步骤中同步。UNLOGGED和TEMPORARY表不会复制,也无法复制。PostgreSQL 逻辑解码不支持大型对象数据类型(
oid引用pg_largeobject)。只能迁移 Cloud SQL for PostgreSQL 支持的扩展程序。 Database Migration Service 不会迁移 Cloud SQL 不支持的扩展程序。这些扩展程序的存在不会阻止迁移,但为了确保顺利迁移,请验证您的应用是否未引用不受支持的扩展程序。如需查看受支持的扩展程序列表,请参阅 Cloud SQL 文档中的 PostgreSQL 扩展程序。
Database Migration Service 不会迁移
pg_cron扩展程序(或该扩展程序中配置的任何 cron 作业),但 Cloud SQL for PostgreSQL 目标数据库支持该扩展程序。如果您在源数据库中使用pg_cron,请在迁移完成后重新安装扩展程序并在目标实例上配置 cron 作业。Database Migration Service 不支持从处于恢复模式的读取副本进行迁移。
Database Migration Service 不支持应用了 AWS SCT 扩展包的 Amazon RDS 来源。
用 C 语言编写的用户定义的函数无法迁移,但在创建 Cloud SQL 支持的扩展程序时安装的函数除外。
如果源数据库中存在其他扩展程序,且 Cloud SQL 不支持其版本,则测试或启动迁移作业将会失败。
迁移作业启动后添加到源实例的数据库不会迁移。
使用 Database Migration Service 进行迁移时,您可以选择特定数据库。所选数据库中的所有表和架构都会迁移,但以下内容除外:
- 信息架构 (
information_schema)。 - 任何以
pg_开头的架构(例如pg_catalog、pg_toast、pgtemp*)。如需查看以pg_开头的 PostgreSQL 目录的完整列表,请参阅 PostgreSQL 文档中的 PostgreSQL 系统目录。 - 用户登录凭证和角色。
- 信息架构 (
如果加密数据库需要客户管理的加密密钥 (CMEK) 才能解密数据,而 Database Migration Service 无权访问这些密钥,则无法迁移这些数据库。不过,使用
pgcrypto扩展程序加密的数据可以迁移,因为 Cloud SQL 支持pgcrypto。Database Migration Service 还支持从加密的 Amazon Aurora 或 Amazon RDS 数据库进行迁移,因为 AWS 会以透明方式处理解密。如需了解详情,请参阅 加密 Amazon Aurora 资源和加密 Amazon RDS 资源。迁移期间的目标数据库操作行为:
可写入的目标数据库:Cloud SQL for PostgreSQL 在迁移期间不会以只读模式运行目标数据库。目标实例由 Database Migration Service 创建时不会降级。
避免对迁移数据执行写入操作:请勿对参与迁移的表或数据库执行写入操作(例如
INSERT、UPDATE、DELETE或 DDL 架构更改)。对迁移数据执行写入操作可能会导致与传入的变更数据捕获 (CDC) 流发生复制冲突。管理数据库用户:您可以随时使用标准
psql命令或通过 Google Cloud 控制台中的 Cloud SQL 创建和管理数据库用户。如需了解详情,请参阅 Cloud SQL 文档中的管理用户。暂停的功能:在持续复制期间,自动备份和时间点恢复 (PITR) 会暂停。此外,在迁移作业升级之前,您无法从目标实例创建 Cloud SQL 只读副本。
触发器行为取决于触发器配置。默认情况下,除非配置了
ALTER EVENT TRIGGER或ALTER TABLE ... ENABLE ALWAYS TRIGGER,否则触发器不会在复制期间在副本上触发。使用
SECURITY DEFINER定义的函数由cloudsqlexternalsync在目标 Cloud SQL 实例上创建,该实例具有提权。通过撤消公共权限并选择性地授予访问权限,限制对敏感SECURITY DEFINER函数的执行权限。Cloud SQL 不支持自定义表空间。自定义表空间中的所有对象都会迁移到 Cloud SQL 中的默认
pg_default表空间。Private Service Connect 接口连接方法仅支持迁移到现有目标实例。如果您想使用专用 IP 连接并迁移到新的目标实例,请使用 VPC 对等互连。
迁移到现有目标实例的限制
- 标准迁移的目标实例降级:对于到现有 Cloud SQL 实例的标准迁移,Database Migration Service 会将独立实例降级,以将其配置为源数据库的外部副本。
- 降级实例不会将 PostgreSQL 引擎置于只读模式,但您必须避免对迁移表执行写入操作,以防止复制冲突。
- 降级实例会暂停自动备份和时间点恢复 (PITR),并阻止添加 Cloud SQL 读取副本,直到提升。
- 在 Google Cloud 控制台中创建迁移作业时,您必须输入目标实例 ID(或运行
gcloud database-migration migration-jobs demote-destination)来确认降级。 -
快速启动迁移使用 PostgreSQL
pgnative逻辑复制,不需要也不执行目标实例降级。
- 现有目标实例只能包含在您创建目标实例时自动设置的默认系统数据库。不支持迁移到包含用户数据的现有目标实例。
如果您因现有目标实例中的额外数据而遇到问题,请清除目标实例中的数据库,然后重试迁移作业。 请参阅 从现有目标实例中清除多余数据。
- 每个目标实例只能配置一个迁移作业。
- 您只能迁移到独立的 Cloud SQL 实例。不支持迁移到 外部服务器副本。
- 升级实例后,您必须开启时间点恢复。
- 如果实例具有自定义备份设置(例如 自定义备份位置),则您必须在提升后再次恢复备份设置。在升级过程中,Cloud SQL 会将备份设置重置为默认值。
- 对于 Terraform 用户:Database Migration Service 会修改目标实例的备份和恢复设置。这可能会导致目标实例设置与用于预配的 Terraform 配置不同。如果您遇到此问题,请参阅 诊断问题中的指南。
配额
- 在任何给定时间,最多可以存在 2000 个连接配置文件和 1000 个迁移作业。如需腾出空间,请删除未使用的迁移作业和连接配置文件。
主要版本升级期间的 PostgreSQL 扩展程序版本兼容性
迁移到更高的 PostgreSQL 主要版本时,Database Migration Service 会使用 pg_restore 实用程序,该实用程序会安装目标 PostgreSQL 主要版本的默认扩展程序版本。您无法为 pg_restore 实用程序指定确切的扩展程序版本。
如果源数据库使用的扩展程序版本与目标 PostgreSQL 主要版本上安装的默认版本不兼容,则迁移可能会因架构不匹配或内部错误而失败。
为避免迁移失败,请验证架构兼容性。在迁移之前,请将源数据库上的扩展程序升级到与目标 PostgreSQL 主要版本兼容的版本。