将架构、数据和元数据从源数据库迁移到目标数据库时,您需要确保所有信息都准确迁移。Database Migration Service 提供了一种高保真机制,可将数据库对象(包括架构、数据和元数据)从一个 PostgreSQL 数据库迁移到另一个 PostgreSQL 数据库。
在迁移过程中,数据和限制条件会分阶段进行迁移。 在初始快照加载期间,数据会先迁移,之后会在初始加载完成后在目标实例上重新创建限制条件(如主键、外键和索引)。
以下数据、架构和元数据组件会在数据库迁移过程中进行迁移:
数据
所选迁移数据库中的所有表和架构,但以下系统架构除外:
- 信息架构 (
information_schema) - 任何以
pg_开头的架构(例如pg_catalog、pg_toast)
如需详细了解这些系统架构,请参阅已知限制。
在迁移过程中,您可以向迁移作业添加数据库或从中移除数据库。移除数据库会停止该数据库的复制,但不会删除目标实例上已迁移的数据库。如需了解详情,请参阅修改迁移作业。
- 信息架构 (
架构
对象命名
主键
数据类型
列的序号位置
默认值
是否可为 null
身份和序列属性
二级索引
元数据
存储过程
函数
触发器
视图
外键限制条件
持续迁移
在持续迁移期间,数据操纵语言 (DML) 更改(例如对具有主键或副本标识的表执行的 INSERT、UPDATE 和 DELETE 操作)会自动复制。
如果在迁移过程中源数据库发生任何数据定义语言 (DDL) 更改,您必须更新目标实例,以确保数据库保持兼容。您可以通过以下方式执行 DDL 更改:
手动执行 DDL:停止对源数据库的写入操作,在源数据库上运行 DDL 命令,并在目标数据库上运行匹配的 DDL 命令。在目标数据库上运行 DDL 命令之前,请向应用更改的 Cloud SQL 用户授予
cloudsqlexternalsync角色。使用
pglogical复制 DDL 命令:您可以使用pglogical.replicate_ddl_command在复制流中的一致点对源数据库和目标数据库运行 DDL。执行此命令的用户必须在源实例和目标实例上具有匹配的凭据,并且必须是超级用户或已修改对象的所有者。
以下标签页提供了使用 pglogical.replicate_ddl_command 执行常见 DDL 操作的示例 SQL 命令:
具有主键的表
向具有主键的表添加列
SELECT pglogical.replicate_ddl_command( 'ALTER TABLE [SCHEMA].[TABLE_NAME] ADD COLUMN surname varchar(20)', '{default}' );
更改包含主键的表的名称
SELECT pglogical.replicate_ddl_command( 'ALTER TABLE [SCHEMA].[TABLE_NAME] RENAME TO [NEW_NAME_FOR_TABLE]', '{default}' );
创建包含主键的表
在源数据库上运行以下命令:
SELECT pglogical.replicate_ddl_command( command := 'CREATE TABLE [SCHEMA].[TABLE_NAME] (id INTEGER PRIMARY KEY, name VARCHAR);', replication_sets := ARRAY['default'] ); SELECT pglogical.replication_set_add_table('default', '[SCHEMA].[TABLE_NAME]');
没有主键的表
向没有主键的表添加列
SELECT pglogical.replicate_ddl_command( 'ALTER TABLE [SCHEMA].[TABLE_NAME] ADD COLUMN surname varchar(20)', '{default_insert_only}' );
更改没有主键的表的名称
SELECT pglogical.replicate_ddl_command( 'ALTER TABLE [SCHEMA].[TABLE_NAME] RENAME TO [NEW_NAME_FOR_TABLE]', '{default_insert_only}' );
创建没有主键的表
在源数据库上运行以下命令:
SELECT pglogical.replicate_ddl_command( command := 'CREATE TABLE [SCHEMA].[TABLE_NAME] (id INTEGER PRIMARY KEY, name VARCHAR);', replication_sets := ARRAY['default_insert_only'] ); SELECT pglogical.replication_set_add_table('default_insert_only', '[SCHEMA].[TABLE_NAME]');
哪些内容不会迁移
用户和权限:用户登录凭证和角色不会迁移。 如需在目标实例上配置用户,请使用 Google Cloud 控制台中的用户标签页,或使用 SQL 客户端管理用户。如需了解详情,请参阅 Cloud SQL 文档中的 创建和管理用户。
不受支持的扩展程序:Database Migration Service 不会迁移 Cloud SQL 不支持的扩展程序。这些扩展程序的存在不会阻止迁移作业,但引用不受支持的扩展程序的应用可能会遇到错误。如需查看受支持的扩展程序列表,请参阅 Cloud SQL 文档中的 PostgreSQL 扩展程序。
大型对象:PostgreSQL 大型对象(引用
pg_largeobject的数据类型oid)不会通过逻辑解码进行复制。没有主键的表:Database Migration Service 会迁移初始快照,并在 CDC 阶段复制
INSERT语句。对于UPDATE和DELETE语句:标准迁移:标准迁移要求您的表具有主键,以便复制
UPDATE和DELETE语句。快速启动迁移:对于快速启动迁移,如果您将副本标识设置为
INDEX或FULL,则无需主键即可复制UPDATE和DELETE操作。配置REPLICA IDENTITY FULL会增加预写式日志 (WAL) 卷和资源开销。建议您在可行的情况下添加主键。如需了解详情,请参阅 PostgreSQL 副本身份文档和 快速入门迁移指南。
物化视图:Database Migration Service 会迁移具体化视图定义,但不会迁移底层缓存数据。如需在目标数据库中填充物化视图,请在迁移后运行
REFRESH MATERIALIZED VIEW view_name。序列状态:在持续 CDC 期间,目标实例上的序列(例如
last_value)的当前值可能与源实例不同。序列值会在最终升级步骤中同步。自定义表空间:Cloud SQL 不支持自定义表空间。在自定义表空间中定义的对象会自动重新映射到 Cloud SQL 中的默认
pg_default表空间。
后续步骤
如需了解完整的限制详情,请参阅已知限制。
如需开始迁移演示,请参阅 Cloud SQL for PostgreSQL 迁移入门。