全部产品
Search
文档中心

云原生数据库 PolarDB:搜索视图和ETL存储过程

更新时间:Aug 27, 2026

当您需要对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;

参数说明

参数

必填

说明

view_name

是

搜索视图名称,同时也是PolarSearch节点中目标索引的名称。

column_list

否

手动定义搜索视图的列,多列使用,分隔。

说明

目前仅支持单表同步无需指定column_list,默认会使用源表中原来的列名称。

pk_column_list

否

指定搜索视图的主键列。搜索视图的结构对应于PolarSearch节点的Index mapping,pk_column_list可以指定PolarSearch节点的Index document ID。

如果不指定,默认会自动使用column_list的第一个列作为document ID。单表同步时,默认使用源表的主键作为document ID。

option_list

否

创建搜索视图时显式指定的同步配置,例如同步的并行度、单个同步 worker 的计算资源用量、目标索引名等,多个配置之间使用,分隔。不指定时,各配置项使用系统默认值。可配置的参数及取值请参见AutoETL参数配置和实践案例。

select_statement

是

定义数据来源和同步逻辑的SELECT语句。该语句用于从源表中检索数据,并将结果存储到PolarSearch中。支持单表查询、多表JOIN、UNION ALL和GROUP BY等操作。

使用限制与说明

  • 源表需包含主键或唯一键。

  • 需具有搜索视图中所有源表的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 定义不兼容、无法原地变更时,采用“新索引 + 新搜索视图”的方式进行重建,以确保业务查询不受影响。

  1. 创建一个新的搜索视图,同步至新的PolarSearch索引。

  2. 通过SHOW SEARCH VIEW STATUS查看新搜索视图的状态,当等待新搜索视图的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。

  3. 删除旧的搜索视图。

关于源表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的索引数据。

CALL dbms_etl.drop_sync_link('<sync_id>');

对不同状态的链路执行drop_sync_link删除时,系统的处理逻辑存在差异:

  • active状态的链路:首先会变为dropping,待系统完成链路资源和目标索引数据的清理后,状态才会变为dropped。

  • dropped状态的链路:系统将彻底清除该链路的信息。

  • 其他状态的链路:系统不支持删除操作。

变更同步链路

同步链路创建后,您可以调整它的运行参数,也可以变更它的同步 SQL。与搜索视图一致,AutoETL 提供三种变更方式:

参数变更

原地 SQL 变更

<new_sync_sql>需传入完整的新同步 SQL,其结构与创建链路时dbms_etl.sync_by_sql的同步 SQL 一致。

“新索引 + 新链路”变更

变更前后的 SQL 定义不兼容、无法原地变更时,采用“新索引 + 新链路”的方式进行重建,以确保业务查询不受影响。以变更链路 A 为例:

  1. 根据新的同步 SQL 创建链路 B,同步至新的PolarSearch索引。

  2. 通过CALL dbms_etl.show_sync_link_by_id('<sync_id>')查看链路 B 的状态,当等待链路 B 的同步时延降至0~1秒时,将业务查询逻辑从旧索引切换到新索引。

  3. 确认链路 B 运行稳定后,执行CALL dbms_etl.drop_sync_link('<sync_id>')删除旧链路 A。

常见问题

搜索视图(Search View)和ETL存储过程(sync_by_sql)有什么区别?

两者的核心区别在于使用场景和复杂度:

  • 搜索视图:使用标准SQL语法(CREATE SEARCH VIEW),系统自动处理底层连接和同步细节,无需编写Flink SQL。适合大多数单表同步和多表汇聚场景。

  • ETL存储过程:使用兼容Flink SQL的语法(CALL dbms_etl.sync_by_sql),适合需要复杂数据清洗、转换和聚合的场景,提供完全的Flink SQL控制能力。源表和目标表的连接配置由系统自动处理。