当您需要对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节点执行。
搜索视图
搜索视图(Search View)是AutoETL提供的一种声明式数据同步机制。您可以使用标准SQL语法创建搜索视图,系统将自动建立从源表到PolarSearch节点的持续数据同步链路。
创建搜索视图
语法
CREATE SEARCH VIEW view_name [(column_list, PRIMARY KEY (pk_column_list))] AS select_statement;
参数说明
|
参数 |
必填 |
说明 |
|
|
是 |
搜索视图名称,同时也是PolarSearch节点中目标索引的名称。 |
|
|
否 |
手动定义搜索视图的列,多列使用 说明
目前仅支持单表同步无需指定 |
|
|
否 |
指定搜索视图的主键列。搜索视图的结构对应于PolarSearch节点的Index mapping, 如果不指定,默认会自动使用 |
|
|
是 |
定义数据来源和同步逻辑的 |
使用限制与说明
-
源表需包含主键或唯一键。
-
需具有搜索视图中所有源表的
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; -
条件过滤同步:仅同步满足
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的索引数据。
DROP SEARCH VIEW view_name;
对不同状态的搜索视图执行删除时,系统的处理逻辑存在差异:
-
active状态的搜索视图:首先会变为dropping,待系统完成资源清理和目标索引数据的删除后,状态才会变为dropped。 -
dropped状态的搜索视图:系统将彻底清除该搜索视图的信息。 -
其他状态的搜索视图:系统不支持删除操作。
变更搜索视图
当需要变更搜索视图的同步逻辑(如新增同步字段、修改查询条件等)时,建议采用“新索引 + 新搜索视图”的方式进行重建,以确保业务查询不受影响。
-
创建一个新的搜索视图,同步至新的PolarSearch索引。
-
通过
SHOW SEARCH VIEW STATUS查看新搜索视图的状态,当等待新搜索视图的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。 -
删除旧的搜索视图。
关于源表DDL变更对搜索视图的影响和详细的变更实践,请参见DDL变更规则与实践。
ETL存储过程(sync_by_sql)
对于需要复杂转换、聚合或计算的场景,您可以使用CALL dbms_etl.sync_by_sql存储过程,通过兼容Flink SQL的语法定义数据同步逻辑。
创建同步链路
语法
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的索引数据。
CALL dbms_etl.drop_sync_link('<sync_id>');
对不同状态的链路执行drop_sync_link删除时,系统的处理逻辑存在差异:
-
active状态的链路:首先会变为dropping,待系统完成链路资源和目标索引数据的清理后,状态才会变为dropped。 -
dropped状态的链路:系统将彻底清除该链路的信息。 -
其他状态的链路:系统不支持删除操作。
变更同步链路
当需要变更同步链路时,采用与搜索视图相同的“新索引 + 新链路”方式进行重建。
-
创建一个新的同步链路,同步至新的PolarSearch索引。
-
通过
CALL dbms_etl.show_sync_link_by_id('<sync_id>')查看同步链路的状态,当等待新同步链路的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。 -
删除旧的同步链路。