全部产品
Search
文档中心

云原生数据库 PolarDB:DDL变更规则与实践

更新时间:Aug 27, 2026

对已建立搜索视图(Search View)或ETL存储过程(sync_by_sql)的源表进行DDL操作时,不同类型的变更对同步链路的影响不同。本文介绍各类DDL操作的影响规则,以及需要重建时的最佳实践。

源表DDL变更影响

DDL 操作可以参考PolarDB MySQL版DDL操作指南,下表列出了当源表执行的常见 DDL 操作,对同步链路的具体影响。

变更类别

具体操作

同步是否正常

说明

列变更

删除列

是

存量数据中仍会保留被删除字段的值,增量数据中该字段的值将为null。

增加列

是

新增字段不会被自动同步至链路中。如需在链路增加字段,请参考AutoETL变更实践。

修改列类型

视类型而定

类型兼容(如INT修改为TINYINT):增量数据可以正常同步。

类型不兼容:会导致链路不可用,需重建链路。

重命名列

否

链路使用创建时的列名。重命名列后链路不识别修改后的源表字段,需重建链路。

其他(调整列顺序、修改默认值、修改注释、扩展VARCHAR长度、修改字符集、修改自增属性、修改NULL约束等)

是

这些操作不影响链路的同步。

索引变更

增加、删除或修改二级索引

是

二级索引的变更不影响链路的同步。

删除或修改主键索引

否

链路依赖源表的主键进行数据同步。变更主键后需重建链路。

表变更

TRUNCATE TABLE

否

链路无法感知TRUNCATE操作。如需清空表数据并同步至PolarSearch,请使用DELETE FROM替代。

RENAME TABLE

否

链路不识别新的表名,增量数据同步停止。

其他(OPTIMIZE TABLE、修改ROW_FORMAT、修改KEY_BLOCK_SIZE、更新统计信息、修改表字符集、修改表注释等)

是

这些操作不影响链路的同步。

分区表变更

转换为分区表、增加分区、合并分区、重新分配分区、分析分区、检查分区、优化分区、重建分区、转换为非分区表、局部索引等

是

这些操作不影响链路的同步。

删除分区(DROP PARTITION)、删除表空间(DROP TABLESPACE)、截断分区(TRUNCATE PARTITION)

否

链路无法感知这些操作。如需删除数据并同步至PolarSearch,请使用DELETE FROM替代。

交换分区(EXCHANGE PARTITION)、修复分区(REPAIR PARTITION)、导入表空间(IMPORT TABLESPACE)

否

链路无法感知指定分区数据的直接替换或修复,其他分区数据不受影响。建议执行后需重建链路。

AutoETL变更实践

当需要变更搜索视图或ETL存储过程的同步结构(如新增同步字段)时,请先确认该变更能否原地完成:

  • 支持原地变更时,直接更新搜索视图或ETL存储过程的SQL定义,同步从原有位点继续,无需重新全量同步。

  • 不支持原地变更时,采用“新索引 + 新链路”的方式重建,待新搜索视图或ETL存储过程的数据同步完成并验证无误后,再将业务查询流量切换至新的索引。

是否支持原地变更

下表列出常见的搜索视图或ETL存储过程变更及其是否支持原地变更。

变更类型

适用场景

是否可原地变更

说明

修改运行参数

单表同步 / 多表汇聚

可原地变更

仅调整同步资源与并发的参数不改变计算语义,可原地变更。

修改WHERE过滤条件

单表同步 / 多表汇聚

可原地变更

修改过滤条件不会修改已同步到PolarSearch节点的存量数据,如需清理请配合重建。

增加同步列

单表同步

可原地变更

新增列仅对增量数据生效,历史数据不回填。需全量回填请走重建。

减少同步列

单表同步

可原地变更

PolarSearch节点中被移除的列停止更新。

修改PolarSearch节点索引的主键

单表同步 / 多表汇聚

不可,需重建

主键同时是PolarSearch的document ID,不兼容。

增加/删除 JOIN 源表,或修改 JOIN 类型

多表汇聚

不可,需重建

同步结构改变,需重新全量计算。

增加/删除 GROUP BY 或聚合函数

多表汇聚

不可,需重建

聚合结构改变,历史聚合结果无法沿用。

增加/删除 UNION / UNION ALL 分支

多表汇聚

不可,需重建

同步结构改变,需重新全量计算。

单表同步与多表汇聚相互转换

单表同步 / 多表汇聚

不可,需重建

同步逻辑整体改变。

主键 / JOIN 关联列 / 分组列的字段类型变更

单表同步 / 多表汇聚

不可,需重建

关键列类型变更后无法沿用原有同步状态。

原地变更

在原有链路变更 SQL 逻辑,使用原有的链路状态启动链路。更多信息请参见搜索视图(Search View) - 变更搜索视图与ETL存储过程(sync_by_sql) - 变更同步链路。

  • 搜索视图语法:

    ALTER SEARCH VIEW view_name UPDATE
      [WITH (option_list)]
      [TO (column_list, PRIMARY KEY (pk_column_list))]
      AS new_select_statement;
  • ETL 存储过程语法:

    SET esl_link_options = "<new_option_list>";
    -- new_sync_sql 为空时保留旧的 sync sql
    CALL dbms_etl.update_sync_link('<sync_id>', '<new_sync_sql>'); 

“新索引 + 新链路”变更

“新索引 + 新链路”的方式是最为通用的变更方式,链路在新链路重新扫描数据写入到PolarSearch节点中,待新搜索视图或ETL存储过程的数据同步完成并验证无误后,再将业务查询流量切换至新的索引。

示例:

为shop.user表新增字段并重建搜索视图。假设原搜索视图将shop.user表(含id, name, phone, gmt_create字段)同步至user_v1索引。现需新增membership_level字段,并确保线上查询不受影响。

  1. 创建新索引:在PolarSearch节点中创建一个名为user_v2的新索引,并在其映射关系中包含新字段membership_level。

    PUT user_v2
    {
      "mappings": {
        "properties": {
          "id":               { "type": "keyword" },
          "name":             { "type": "text", "fields": { "keyword": { "type": "keyword" } } },
          "phone":            { "type": "keyword" },
          "gmt_create":       { "type": "date" },
          "membership_level": { "type": "integer" }
        }
      }
    }
  2. 修改源表:在源端PolarDB MySQL版的user表中增加新列。

    ALTER TABLE shop.user ADD COLUMN membership_level TINYINT NOT NULL DEFAULT 0 COMMENT '会员等级';
  3. 新建搜索视图:创建一个新的搜索视图,将shop.user表的数据同步到user_v2索引。

    CREATE SEARCH VIEW user_v2 AS SELECT id, name, phone, gmt_create, membership_level FROM shop.user;
  4. 验证与切换:通过SHOW SEARCH VIEW STATUS查看新搜索视图的状态,待同步时延降至约0~1秒后,验证新索引中的数据是否正确。确认无误后,将业务查询流量切换到新的user_v2索引。

  5. 清理旧资源:观察新搜索视图运行稳定后,删除旧的搜索视图和PolarSearch中的user_v1索引。

    DROP SEARCH VIEW user_v1;