概览
将架构、数据和元数据从源数据库迁移到目标数据库时,您需要确保所有这些信息都已准确迁移。Database Migration Service 提供了一种高保真迁移方式,可将数据库对象(包括架构、数据和元数据)从一个数据库迁移到另一个数据库。
在迁移过程中,数据和限制条件会分别迁移。数据会先迁移,在初始完整转储和加载后,系统会在实例上重新创建主键、外键和索引等限制条件。以下所有数据、架构和元数据组件都会作为数据库迁移的一部分进行迁移:
数据
所有数据库和架构中的所有表,但以下架构除外:
- 信息架构
information_schema - 以
pg开头的任何架构(例如pg_catalog)
如需详细了解这些架构,请参阅已知限制。
- 信息架构
架构
命名
主键
数据类型
序数位置
默认值
是否可为 null
自动递增属性
二级索引
元数据
存储过程
函数
触发器
视图
外键限制条件
持续迁移
在持续迁移期间,只有数据操纵语言 (DML) 更改会自动更新。管理数据定义语言 (DDL) 更改以确保源数据库和目标数据库保持兼容是用户的责任,可通过两种方式来实现:
-
停止写入源数据库,并在源数据库和目标数据库中运行 DDL 命令。在目标数据库上运行 DDL 命令之前,请向应用 DDL 更改的 Cloud SQL 用户授予
cloudsqlexternalsync。如需启用数据查询或更改,请向相关 Cloud SQL 用户授予cloudsqlexternalsync角色。 - 使用
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]' );
- 将
哪些内容不会迁移
如需向 Cloud SQL 目标实例添加用户,请前往相应实例,然后从用户标签页添加用户,或从 PostgreSQL 客户端添加用户。详细了解如何创建和管理 PostgreSQL 用户。
Database Migration Service 不会迁移 Cloud SQL 不支持的扩展程序。这些扩展程序的存在不会阻止迁移,但为了确保迁移过程顺利,请验证您的对象或应用是否未引用任何不受支持的扩展程序。我们建议您先从源数据库中移除这些扩展程序和引用,然后再继续操作。
大型对象无法复制,因为 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表空间。