当您需要对PolarDB MySQL版中的业务数据进行全文检索或复杂分析时,直接在数据库上操作可能会影响核心业务的稳定性。PolarDB提供的AutoETL功能,能将数据从读写节点自动、持续地同步至集群内的PolarSearch节点,为您提供一站式的数据服务。您可以通过搜索视图(Search View)或ETL存储过程快速创建数据同步链路,无需额外部署和维护ETL工具,即可实现数据同步,并将搜索分析负载与在线事务处理负载隔离。
使用AutoETL创建链路,默认授权允许AutoETL引擎访问PolarDB数据进行数据同步。
功能简介
AutoETL是PolarDB MySQL版内置的数据同步能力,它允许数据在集群内不同类型的节点间自动流转。当前版本仅支持从PolarDB MySQL版同步至同一集群内的PolarSearch节点,以用于高性能的搜索和分析。
AutoETL提供两种创建数据同步链路的方式:
搜索视图(Search View):通过
CREATE SEARCH VIEW语法,以标准SQL的方式定义数据同步逻辑。适合大多数单表同步和多表汇聚场景,系统自动处理底层连接细节。ETL存储过程(
dbms_etl.sync_by_sql):使用兼容Flink SQL的语法,通过存储过程定义复杂的数据清洗、转换和聚合逻辑。
适用范围
使用AutoETL功能前,需确保环境满足以下条件:
集群版本:
搜索视图(Search View):
MySQL 8.0.1,且修订版本需为8.0.1.1.54或以上。
MySQL 8.0.2,且修订版本需为8.0.2.2.34或以上。
ETL存储过程(sync_by_sql):
MySQL 8.0.1,且修订版本需为8.0.1.1.52或以上。
MySQL 8.0.2,且修订版本需为8.0.2.2.33或以上。
Binlog:集群需要开启Binlog。
同步方向:仅支持从PolarDB MySQL版同步至同一集群内的PolarSearch节点。
DDL限制:对已建立搜索视图/ETL存储过程的源表进行DDL操作时,需遵循特定的规则以避免同步中断。部分不兼容的变更需要重建搜索视图。详情请参见DDL变更规则与实践。
数据类型:暂不支持
BIT类型以及GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION等空间数据类型的同步。搜索视图查询限制:搜索视图目前仅支持定义同步语义,不支持数据查询。数据查询请直接连接PolarSearch节点执行。
计算资源:AutoETL 使用 CU 作为计算单元,默认集群的 CU 数为 PolarSearch节点所有节点 CPU 之和的两倍。您可以在控制台页面的AutoETL页签中查看当前集群所使用的 CU 数。
搜索视图
搜索视图(Search View)是AutoETL提供的一种声明式数据同步机制。您可以使用标准SQL语法创建搜索视图,系统将自动建立从源表到PolarSearch节点的持续数据同步链路。
创建搜索视图
语法
CREATE SEARCH VIEW view_name [(column_list, PRIMARY KEY (pk_column_list))]
[WITH (option_list)]
AS select_statement;参数说明
参数 | 必填 | 说明 |
| 是 | 搜索视图名称,同时也是PolarSearch节点中目标索引的名称。 |
| 否 | 手动定义搜索视图的列,多列使用 说明 目前仅支持单表同步无需指定 |
| 否 | 指定搜索视图的主键列。搜索视图的结构对应于PolarSearch节点的Index mapping, 如果不指定,默认会自动使用 |
| 否 | 创建搜索视图时显式指定的同步配置,例如同步的并行度、单个同步 worker 的计算资源用量、目标索引名等,多个配置之间使用 |
| 是 | 定义数据来源和同步逻辑的 |
使用限制与说明
源表需包含主键或唯一键。
需具有搜索视图中所有源表的
ALTER权限,以及相关列(或整表)的SELECT权限。创建搜索视图后,源表新增的列默认不会被自动同步。如需同步新增列,请参见变更搜索视图。
如果您希望使用自定义的目标索引配置,可以先在PolarSearch节点中手动创建索引并定义其配置,然后再创建搜索视图。如果创建时目标索引不存在,系统将自动创建。
如需为多表汇聚或复杂查询配置高级同步参数(如JSON字段转换、路由字段等),请参见AutoETL 参数配置和实践案例。
数据准备
以下示例使用的测试数据,您可以在PolarDB MySQL版中执行以下SQL语句创建。
CREATE DATABASE IF NOT EXISTS db1;
CREATE DATABASE IF NOT EXISTS db2;
USE db1;
CREATE TABLE IF NOT EXISTS t1 (
id INT PRIMARY KEY,
c1 VARCHAR(100),
c2 VARCHAR(100)
);
INSERT INTO t1(id, c1, c2) VALUES
(1, 'apple', 'red'),
(2, 'banana', 'yellow'),
(3, 'grape', 'purple');
USE db2;
CREATE TABLE IF NOT EXISTS t2 (id INT PRIMARY KEY, c2 INT);
INSERT INTO t2(id, c2) VALUES (1, 111), (2, 222), (4, 444);示例
全表同步:将
db1.t1全部数据同步到PolarSearch。视图名view_test即为PolarSearch中的目标索引名。CREATE SEARCH VIEW view_test AS SELECT * FROM db1.t1;指定列同步:仅同步
c1和c2列,并手动定义列类型和主键。CREATE SEARCH VIEW view_test1 AS SELECT c1, c2 FROM db1.t1;指定同步参数:创建搜索视图时通过
WITH子句指定同步配置。以下示例将db1.t1的c1和c2列同步到PolarSearch,并将同步的并行度设置为 2。CREATE SEARCH VIEW view_test6 WITH ('parallelism' = '2') AS SELECT c1, c2 FROM db1.t1;条件过滤同步:仅同步满足
WHERE条件的数据。CREATE SEARCH VIEW view_test2 AS SELECT id, c1, c2 FROM db1.t1 WHERE c1 > 10;多表JOIN:将
db1.t1和db2.t2通过id字段进行JOIN,将结果同步到PolarSearch。CREATE SEARCH VIEW view_test3(id, c1, c2) AS SELECT t1.id, t1.c1, t2.c2 FROM db1.t1 AS t1 LEFT JOIN db2.t2 AS t2 ON t1.id = t2.id;多表UNION:将多个结构相同的表合并后同步。要求各
SELECT语句的列数和类型一致。CREATE SEARCH VIEW view_test4(id, c2) AS SELECT id, c2 FROM db1.t1 UNION ALL SELECT id, c2 FROM db2.t2;分组聚合:对数据进行分组聚合后同步。使用
GROUP BY时需要手动定义列和主键。CREATE SEARCH VIEW view_test5 (id, max_c) AS SELECT t1.id, MAX(t1.c1) AS max_c FROM db1.t1 GROUP BY t1.id;
验证数据
查看搜索视图的同步状态:
SHOW SEARCH VIEW STATUS;当状态为active时,表示搜索视图数据同步正常。连接到PolarSearch节点,使用与Elasticsearch兼容的REST API验证数据:
# 将<user>:<password>替换为polarsearch节点的账号,<polarsearch_endpoint>替换为PolarSearch节点的连接地址与端口
curl -u <user>:<password> -X GET "http://<polarsearch_endpoint>/view_test/_search"管理搜索视图
您可以使用以下命令查看已创建的搜索视图,或停止、重启、重建搜索视图的数据同步。以下命令均需连接集群后在数据库客户端中执行。
查看所有搜索视图的状态
SHOW SEARCH VIEW STATUS;返回结果如下:当状态为active时,表示搜索视图数据同步正常。
+------------+--------+----------+---------+---------------------+---------------------+
| View Name | Type | Status | Message | Created_at | Updated_at |
+------------+--------+----------+---------+---------------------+---------------------+
| view_test | search | active | | 2026-03-18 18:44:12 | 2026-03-18 18:51:37 |
+------------+--------+----------+---------+---------------------+---------------------+查看指定搜索视图的创建语句
SHOW CREATE SEARCH VIEW view_test;返回结果如下:
+-----------+------------------------------------------------------+
| View Name | Create Search View |
+-----------+------------------------------------------------------+
| view_test | CREATE SEARCH VIEW view_test AS SELECT * FROM db1.t1 |
+-----------+------------------------------------------------------+停止搜索视图
需要修改或重建PolarSearch节点上的目标索引时,为避免同步写入报错,您可以先停止搜索视图的数据同步,待PolarSearch节点上的索引修改完成后再重启搜索视图。
ALTER SEARCH VIEW view_test STOP;重启搜索视图
重启已停止或正在运行的搜索视图。
ALTER SEARCH VIEW view_test RESTART;重建搜索视图
重新全量读取源表数据并写入PolarSearch节点。
重建会重新扫描源表的全量数据,数据量较大时耗时较长。
重建不会清理PolarSearch节点上已有的索引数据,而是直接覆盖。
ALTER SEARCH VIEW view_test REBUILD;删除搜索视图
删除搜索视图是高危操作,执行前请务必确认。此操作用于停止搜索视图的数据同步并清理相关资源,但不会删除PolarSearch的索引数据。
DROP SEARCH VIEW view_name;对不同状态的搜索视图执行删除时,系统的处理逻辑存在差异:
active状态的搜索视图:首先会变为dropping,待系统完成资源清理和目标索引数据的删除后,状态才会变为dropped。dropped状态的搜索视图:系统将彻底清除该搜索视图的信息。其他状态的搜索视图:系统不支持删除操作。
变更搜索视图
搜索视图创建后,您可以调整它的运行参数,也可以变更它的同步逻辑(如新增同步字段、修改查询条件等)。AutoETL 提供三种变更方式:
只调整运行参数(如并行度、计算资源用量)时,使用参数变更,无需改动同步 SQL。
变更同步逻辑时,优先使用原地 SQL 变更。变更前后的 SQL 定义兼容时,同步从原有位点继续,无需重新全量同步。您可以根据DDL变更规则与实践判断变更前后的 SQL 定义是否兼容。
变更前后的 SQL 定义不兼容、无法原地变更时,采用“新索引 + 新搜索视图”变更进行重建。
参数变更
对于运行中的搜索视图,您可以通过以下语法修改它的运行参数。AutoETL 会自动读取新配置并重启该搜索视图。
语法
ALTER SEARCH VIEW view_name UPDATE WITH (new_option_list);示例
将view_test的并行度调整为 8,单个 worker 的 CPU 为 4,每个 worker 支持 8 个并发:
ALTER SEARCH VIEW view_test UPDATE WITH ('parallelism' = '8', 'link.tm.cpu' = '4', 'link.tm.slots' = '8');原地 SQL 变更
原地 SQL 变更直接修改已有搜索视图的同步 SQL,无需新建PolarSearch索引和搜索视图并切换业务查询,可以减少全量同步的耗时。变更前后的 SQL 定义兼容时,同步从原有位点继续;不兼容时,本次变更失败,系统自动回退到变更前的同步定义并重启搜索视图。
语法
ALTER SEARCH VIEW view_name UPDATE
[TO (column_list, PRIMARY KEY (pk_column_list))]
AS new_select_statement;示例
同步源表新增的列:全表同步的搜索视图不会自动同步源表在视图创建后新增的列。源表
db1.t1新增列后,执行以下语句将新列的数据同步到PolarSearch。ALTER SEARCH VIEW view_test UPDATE;调整同步的列:原来同步
c1和c2列,变更为仅同步c1列。ALTER SEARCH VIEW view_test UPDATE AS SELECT c1 FROM db1.t1;调整过滤条件:将
WHERE条件由c1 > 10变更为c1 > 20。ALTER SEARCH VIEW view_test UPDATE AS SELECT id, c1, c2 FROM db1.t1 WHERE c1 > 20;
“新索引 + 新搜索视图”变更
变更前后的 SQL 定义不兼容、无法原地变更时,采用“新索引 + 新搜索视图”的方式进行重建,以确保业务查询不受影响。
创建一个新的搜索视图,同步至新的PolarSearch索引。
通过
SHOW SEARCH VIEW STATUS查看新搜索视图的状态,当等待新搜索视图的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。删除旧的搜索视图。
关于源表DDL变更对搜索视图的影响和详细的变更实践,请参见DDL变更规则与实践。
ETL存储过程(sync_by_sql)
对于需要复杂转换、聚合或计算的场景,您可以使用CALL dbms_etl.sync_by_sql存储过程,通过兼容Flink SQL的语法定义数据同步逻辑。
创建同步链路
语法
调用dbms_etl.sync_by_sql前,您可以通过AutoETL参数配置和实践案例中的会话变量(如esl_link_options、esl_sink_options)设置链路的同步配置,AutoETL引擎在创建链路时会自动读取这些变量。
CALL dbms_etl.sync_by_sql("search", "<sync_sql>");示例
源表和目标表的连接信息(如主机地址、端口、账号密码等)由系统自动配置,您无需在WITH子句中手动指定。
CALL dbms_etl.sync_by_sql("search", "
-- 步骤1:定义 PolarDB 源表
CREATE TEMPORARY TABLE `db1`.`t1` (
`id` BIGINT,
`c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'database-name' = 'db1',
'table-name' = 't1'
);
-- 步骤2:定义 PolarSearch 目标表
CREATE TEMPORARY TABLE `dest` (
`id` BIGINT,
`max_c` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'opensearch',
'index' = 'dest'
);
-- 步骤3:定义计算和插入逻辑
INSERT INTO `dest`
SELECT
`t1`.`id`,
MAX(`t1`.`c1`)
FROM `db1`.`t1` AS `t1`
GROUP BY `t1`.`id`;
");验证数据
连接到PolarSearch节点,使用与Elasticsearch兼容的REST API进行查询,确认数据已同步。
# 将<polarsearch_endpoint>替换为PolarSearch节点的连接地址
curl -u <user>:<password> -X GET "http://<polarsearch_endpoint>/dest/_search"管理同步链路
您可以使用以下命令查看已创建的同步链路,或停止、重启、重建同步链路的数据同步。以下命令均需连接集群后在数据库客户端中执行。
查看所有链路
CALL dbms_etl.show_sync_link();根据ID查看指定链路
将<sync_id>替换为创建链路时返回的ID。
CALL dbms_etl.show_sync_link_by_id('<sync_id>')\G返回结果说明:
*************************** 1. row ***************************
SYNC_ID: crb5rmv8rttsg
NAME: crb5rmv8rttsg
SYSTEM: search
SYNC_DEFINITION: db1.t1 -> dest
SOURCE_TABLES: db1.t1
SINK_TABLES: dest
STATUS: active -- 链路状态,active表示正常运行
MESSAGE: -- 如果出错,此处会显示错误信息
CREATED_AT: 2024-05-20 11:55:06
UPDATED_AT: 2024-05-20 17:28:04
OPTIONS: ...停止链路
需要修改或重建PolarSearch节点上的目标索引时,为避免同步写入报错,您可以先停止同步链路,待PolarSearch节点上的索引修改完成后再重启链路。
CALL dbms_etl.stop_sync_link('<sync_id>');重启链路
重启已停止或正在运行的同步链路。
CALL dbms_etl.restart_sync_link('<sync_id>');重建链路
重新全量读取源表数据并写入PolarSearch节点。重建会重新扫描源表的全量数据,数据量较大时耗时较长;重建不会清理PolarSearch节点上已有的索引数据,而是直接覆盖。
CALL dbms_etl.rebuild_sync_link('<sync_id>');删除同步链路
此操作用于停止数据同步并清理相关资源。
删除同步链路是高危操作,执行前请务必确认。此操作用于停止同步链路的数据同步并清理相关资源,但不会删除PolarSearch的索引数据。
CALL dbms_etl.drop_sync_link('<sync_id>');对不同状态的链路执行drop_sync_link删除时,系统的处理逻辑存在差异:
active状态的链路:首先会变为dropping,待系统完成链路资源和目标索引数据的清理后,状态才会变为dropped。dropped状态的链路:系统将彻底清除该链路的信息。其他状态的链路:系统不支持删除操作。
变更同步链路
同步链路创建后,您可以调整它的运行参数,也可以变更它的同步 SQL。与搜索视图一致,AutoETL 提供三种变更方式:
只调整运行参数(如并行度、计算资源用量)时,使用参数变更,无需改动同步 SQL。
变更同步 SQL 时,优先使用原地 SQL 变更。变更前后的 SQL 定义兼容时,同步从原有位点继续,无需重新全量同步。您可以根据DDL变更规则与实践判断变更前后的 SQL 定义是否兼容。
变更前后的 SQL 定义不兼容、无法原地变更时,采用“新索引 + 新链路”变更进行重建。
参数变更
对于运行中的同步链路,您可以先通过会话变量esl_link_options设置新的链路配置,再调用dbms_etl.update_sync_link使配置生效。AutoETL 会自动读取新的esl_link_options配置并重启该同步链路。
语法
SET esl_link_options = "<new_option_list>";
CALL dbms_etl.update_sync_link('<sync_id>', '');示例
将链路8f4228x2uq12z的并行度调整为 8,单个 worker 的 CPU 为 4,每个 worker 支持 8 个并发:
SET esl_link_options = "'parallelism' = '8', 'link.tm.cpu' = '4', 'link.tm.slots' = '8'";
CALL dbms_etl.update_sync_link('8f4228x2uq12z', '');原地 SQL 变更
原地 SQL 变更直接修改已有链路的同步 SQL,无需新建PolarSearch索引和链路并切换业务查询,可以减少全量同步的耗时。变更前后的 SQL 定义兼容时,同步从原有位点继续;不兼容时,本次变更失败,系统自动回退到变更前的同步定义并重启链路。
语法
<new_sync_sql>需传入完整的新同步 SQL,其结构与创建链路时dbms_etl.sync_by_sql的同步 SQL 一致。
CALL dbms_etl.update_sync_link('<sync_id>', '<new_sync_sql>');示例
将链路8f4228x2uq12z的过滤条件变更为c1 > 20:
CALL dbms_etl.update_sync_link('8f4228x2uq12z', "
CREATE TEMPORARY TABLE `db1`.`t1` (
`id` BIGINT,
`c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'database-name' = 'db1',
'table-name' = 't1'
);
CREATE TEMPORARY TABLE `dest` (
`id` BIGINT,
`c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'opensearch',
'index' = 'dest'
);
INSERT INTO `dest` SELECT `id`, `c1` FROM `db1`.`t1` WHERE `c1` > 20;
");“新索引 + 新链路”变更
变更前后的 SQL 定义不兼容、无法原地变更时,采用“新索引 + 新链路”的方式进行重建,以确保业务查询不受影响。以变更链路 A 为例:
根据新的同步 SQL 创建链路 B,同步至新的PolarSearch索引。
通过
CALL dbms_etl.show_sync_link_by_id('<sync_id>')查看链路 B 的状态,当等待链路 B 的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。确认链路 B 运行稳定后,执行
CALL dbms_etl.drop_sync_link('<sync_id>')删除旧链路 A。