对已建立搜索视图(Search View)或ETL存储过程(sync_by_sql)的源表进行DDL操作时,不同类型的变更对同步链路的影响不同。本文介绍各类DDL操作的影响规则,以及需要重建时的最佳实践。
源表DDL变更影响
DDL 操作可以参考PolarDB MySQL版DDL操作指南,下表列出了当源表执行的常见 DDL 操作,对同步链路的具体影响。
变更类别 | 具体操作 | 同步是否正常 | 说明 |
列变更 | 删除列 | 是 | 存量数据中仍会保留被删除字段的值,增量数据中该字段的值将为 |
增加列 | 是 | 新增字段不会被自动同步至链路中。如需在链路增加字段,请参考AutoETL变更实践。 | |
修改列类型 | 视类型而定 | 类型兼容(如 类型不兼容:会导致链路不可用,需重建链路。 | |
重命名列 | 否 | 链路使用创建时的列名。重命名列后链路不识别修改后的源表字段,需重建链路。 | |
其他(调整列顺序、修改默认值、修改注释、扩展VARCHAR长度、修改字符集、修改自增属性、修改NULL约束等) | 是 | 这些操作不影响链路的同步。 | |
索引变更 | 增加、删除或修改二级索引 | 是 | 二级索引的变更不影响链路的同步。 |
删除或修改主键索引 | 否 | 链路依赖源表的主键进行数据同步。变更主键后需重建链路。 | |
表变更 |
| 否 | 链路无法感知 |
| 否 | 链路不识别新的表名,增量数据同步停止。 | |
其他( | 是 | 这些操作不影响链路的同步。 | |
分区表变更 | 转换为分区表、增加分区、合并分区、重新分配分区、分析分区、检查分区、优化分区、重建分区、转换为非分区表、局部索引等 | 是 | 这些操作不影响链路的同步。 |
删除分区( | 否 | 链路无法感知这些操作。如需删除数据并同步至PolarSearch,请使用 | |
交换分区( | 否 | 链路无法感知指定分区数据的直接替换或修复,其他分区数据不受影响。建议执行后需重建链路。 |
AutoETL变更实践
当需要变更搜索视图或ETL存储过程的同步结构(如新增同步字段)时,请先确认该变更能否原地完成:
支持原地变更时,直接更新搜索视图或ETL存储过程的SQL定义,同步从原有位点继续,无需重新全量同步。
不支持原地变更时,采用“新索引 + 新链路”的方式重建,待新搜索视图或ETL存储过程的数据同步完成并验证无误后,再将业务查询流量切换至新的索引。
是否支持原地变更
下表列出常见的搜索视图或ETL存储过程变更及其是否支持原地变更。
变更类型 | 适用场景 | 是否可原地变更 | 说明 |
修改运行参数 | 单表同步 / 多表汇聚 | 可原地变更 | 仅调整同步资源与并发的参数不改变计算语义,可原地变更。 |
修改 | 单表同步 / 多表汇聚 | 可原地变更 | 修改过滤条件不会修改已同步到PolarSearch节点的存量数据,如需清理请配合重建。 |
增加同步列 | 单表同步 | 可原地变更 | 新增列仅对增量数据生效,历史数据不回填。需全量回填请走重建。 |
减少同步列 | 单表同步 | 可原地变更 | PolarSearch节点中被移除的列停止更新。 |
修改PolarSearch节点索引的主键 | 单表同步 / 多表汇聚 | 不可,需重建 | 主键同时是PolarSearch的document ID,不兼容。 |
增加/删除 | 多表汇聚 | 不可,需重建 | 同步结构改变,需重新全量计算。 |
增加/删除 | 多表汇聚 | 不可,需重建 | 聚合结构改变,历史聚合结果无法沿用。 |
增加/删除 | 多表汇聚 | 不可,需重建 | 同步结构改变,需重新全量计算。 |
单表同步与多表汇聚相互转换 | 单表同步 / 多表汇聚 | 不可,需重建 | 同步逻辑整体改变。 |
主键 / | 单表同步 / 多表汇聚 | 不可,需重建 | 关键列类型变更后无法沿用原有同步状态。 |
原地变更
在原有链路变更 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字段,并确保线上查询不受影响。
创建新索引:在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" } } } }修改源表:在源端PolarDB MySQL版的
user表中增加新列。ALTER TABLE shop.user ADD COLUMN membership_level TINYINT NOT NULL DEFAULT 0 COMMENT '会员等级';新建搜索视图:创建一个新的搜索视图,将
shop.user表的数据同步到user_v2索引。CREATE SEARCH VIEW user_v2 AS SELECT id, name, phone, gmt_create, membership_level FROM shop.user;验证与切换:通过
SHOW SEARCH VIEW STATUS查看新搜索视图的状态,待同步时延降至约0~1秒后,验证新索引中的数据是否正确。确认无误后,将业务查询流量切换到新的user_v2索引。清理旧资源:观察新搜索视图运行稳定后,删除旧的搜索视图和PolarSearch中的
user_v1索引。DROP SEARCH VIEW user_v1;