概览
将架构、数据和元数据从源数据库迁移到目标数据库时,您需要确保准确迁移所有这些信息。Database Migration Service 提供了一种高保真度的方式,可将数据库对象(包括架构、数据和元数据)从一个数据库迁移到另一个数据库。
在数据库迁移过程中,系统会迁移以下所有数据、架构和元数据组件:
数据
- 所有数据库和架构中的所有表,但以下架构除外: - 信息架构 information_schema
- 以 pg开头的任何架构(例如pg_catalog)
 - 如需详细了解这些架构,请参阅已知限制。 
- 信息架构 
架构
- 命名 
- 主键 
- 数据类型 
- 序数位置 
- 默认值 
- 是否可为 NULL 
- 自动递增属性 
- 二级索引 
元数据
- 存储过程 
- 函数 
- 触发器 
- 查看次数 
- 外键约束条件 
持续迁移
在持续迁移期间,只有数据操纵语言 (DML) 更改会自动更新。管理数据定义语言 (DDL) 更改,以确保源数据库和目标数据库保持兼容,是用户的责任,可通过两种方式来实现:
- 
    
       停止写入源数据库,并在源数据库和目标数据库中运行 DDL 命令。在目标数据库运行 DDL 命令之前,向进行 DDL 更改的 AlloyDB 用户授予 alloydbexternalsync。如需启用数据查询或更改,请向相关 AlloyDB 用户授予alloydbexternalsync角色。
- 使用 pglogical.replicate_ddl_command,可允许 DDL 在源数据库和目标数据库上同时运行。运行此命令的用户在源端和目标端必须使用相同的用户名,并且应为要迁移的工件(例如表、序列、视图或数据库)的超级用户或所有者。以下是使用 pglogical.replicate_ddl_command的一些示例。您需要进行如下替换: - 将 [SCHEMA]替换为您要使用的表架构的名称
- 将 [TABLE_NAME]替换为表名称
- 执行重命名操作时,将 [NEW_NAME_FOR_TABLE]替换为表的新名称
 向具有主键的数据库表添加列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] 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}' ); 更改没有主键的数据库表的名称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'] ); 
- select pglogical.replication_set_add_table('default', '[SCHEMA].[TABLE_NAME]'); 
 创建没有主键的数据库表运行以下命令: - 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]' ); 
 
- 将 
哪些内容不会迁移
- 无法复制大型对象,因为 PostgreSQL 的逻辑解码功能不支持对大型对象进行解码更改。对于列类型为 - oid且引用大型对象的表,系统会同步行并复制新行。但是,尝试访问目标数据库中的大型对象(使用- lo_get读取、使用- lo_export导出,或检查给定- oid的清单- pg_largeobject)会失败,并显示一条消息,提示大型对象不存在。
- 对于没有主键的表,Database Migration Service 支持在变更数据捕获 (CDC) 阶段迁移初始快照和 - INSERT语句。您应手动迁移- UPDATE和- DELETE语句。
- Database Migration Service 不会迁移具体化视图中的数据,只会迁移视图架构。如需填充视图,请运行以下命令: - REFRESH MATERIALIZED VIEW view_name。
- 新目标上的 - SEQUENCE状态(例如- last_value)可能会与来源- SEQUENCE状态不同。
- 目标 Cloud SQL 实例不支持自定义表空间。自定义表空间中的所有数据都会迁移到 Cloud SQL 中的默认 - pg_default表空间。