概览
将架构、数据和元数据从源数据库迁移到目标数据库时,您需要确保准确迁移所有这些信息。Database Migration Service 提供了一种高保真度的方式,可将数据库对象(包括架构、数据和元数据)从一个数据库迁移到另一个数据库。
在数据库迁移过程中,系统会迁移以下所有数据、架构和元数据组件:
数据
所有数据库和架构中的所有表,但以下架构除外:
- 信息架构
information_schema
- 以
pg
开头的任何架构(例如pg_catalog
)
如需详细了解这些架构,请参阅已知限制。
- 信息架构
架构
命名
主键
数据类型
序数位置
默认值
是否可为 NULL
自动递增属性
二级索引
元数据
存储过程
Functions
触发器
视图
外键约束条件
持续迁移
在持续迁移期间,只有数据操纵语言 (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
表空间。