迁移准确度

将架构、数据和元数据从源数据库迁移到目标数据库时,您需要确保所有信息都准确迁移。Database Migration Service 提供了一种高保真机制,可将数据库对象(包括架构、数据和元数据)从一个 PostgreSQL 数据库迁移到另一个 PostgreSQL 数据库。

在迁移过程中,数据和限制条件会分阶段进行迁移。 在初始快照加载期间,数据会先迁移,之后会在初始加载完成后在目标实例上重新创建限制条件(如主键、外键和索引)。

以下数据、架构和元数据组件会在数据库迁移过程中进行迁移:

数据

  • 所选迁移数据库中的所有表和架构,但以下系统架构除外:

    • 信息架构 (information_schema)
    • 任何以 pg_ 开头的架构(例如 pg_catalog、pg_toast)

    如需详细了解这些系统架构,请参阅已知限制。

    在迁移过程中,您可以向迁移作业添加数据库或从中移除数据库。移除数据库会停止该数据库的复制,但不会删除目标实例上已迁移的数据库。如需了解详情,请参阅修改迁移作业。

架构

  • 对象命名

  • 主键

  • 数据类型

  • 列的序号位置

  • 默认值

  • 是否可为 null

  • 身份和序列属性

  • 二级索引

元数据

  • 存储过程

  • 函数

  • 触发器

  • 视图

  • 外键限制条件

持续迁移

在持续迁移期间,数据操纵语言 (DML) 更改(例如对具有主键或副本标识的表执行的 INSERT、UPDATE 和 DELETE 操作)会自动复制。

如果在迁移过程中源数据库发生任何数据定义语言 (DDL) 更改,您必须更新目标实例,以确保数据库保持兼容。您可以通过以下方式执行 DDL 更改:

  1. 手动执行 DDL:停止对源数据库的写入操作,在源数据库上运行 DDL 命令,并在目标数据库上运行匹配的 DDL 命令。在目标数据库上运行 DDL 命令之前,请向应用更改的 Cloud SQL 用户授予 cloudsqlexternalsync 角色。

  2. 使用 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 表空间。

后续步骤