当您需要对PolarDB MySQL版中的业务数据进行全文检索或复杂分析时,直接在数据库上操作可能会影响核心业务的稳定性。PolarDB提供的AutoETL功能,能将数据从读写节点自动、持续地同步至集群内的PolarSearch节点,为您提供一站式的数据服务。您可以通过搜索视图(Search View)或ETL存储过程快速创建数据同步链路,无需额外部署和维护ETL工具,即可实现数据同步,并将搜索分析负载与在线事务处理负载隔离。
当前功能目前正处于灰度阶段。如您有相关需求,请提交工单与我们联系,以便为您开启该功能。
功能简介
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的语法定义数据同步逻辑。
创建同步链路
安全警告:严禁在SQL语句中硬编码密码。以下示例仅为演示语法结构,其WITH子句中包含明文密码,存在极大的安全风险。在生产环境中,必须使用更安全的方式管理凭证。
语法
CALL dbms_etl.sync_by_sql("search", "<sync_sql>");示例
系统将自动替换SQL中的占位符
{mysql_host}、{mysql_port}、{mysql_user}、{mysql_password}、{search_host}、{search_port}、{search_user}和{search_password}。您仅需按固定占位符编写SQL语句即可。如果您有多条Flink SQL同步链路,需要在所有tempory表的
with子句中通过设定server-id来区分不同的同步链路标识以避免冲突。
CALL dbms_etl.sync_by_sql("search", "
-- 步骤1:定义 PolarDB 源表
CREATE TEMPORARY TABLE `db1`.`sbtest1` (
`id` BIGINT,
`c1` STRING,
`c2` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'hostname' = '{mysql_host}',
'port' = '{mysql_port}',
'username' = '{mysql_user}', -- 生产环境严禁使用明文
'password' = '{mysql_password}', -- 生产环境严禁使用明文
'database-name' = 'db1',
'table-name' = 't1',
'server-id' = '10000-11000' -- 链路区分
);
-- 步骤2:定义 PolarSearch 目标表
CREATE TEMPORARY TABLE `dest` (
`id` BIGINT,
`max_c` STRING,
PRIMARY KEY (`k`) NOT ENFORCED
) WITH (
'connector' = 'opensearch',
'hosts' = '{search_host}:{search_port}',
'index' = 'dest',
'username' = '{search_user}', -- 生产环境严禁使用明文
'password' = '{search_password}' -- 生产环境严禁使用明文
);
-- 步骤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秒时,将业务查询逻辑从旧索引切换到新索引。删除旧的同步链路。