當您需要對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秒時,將業務查詢邏輯從舊索引切換到新索引。刪除舊的同步鏈路。