全部產品
Search
文件中心

PolarDB:自動將PolarDB MySQL版資料同步至PolarSearch

更新時間:Mar 26, 2026

當您需要對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類型以及GEOMETRYPOINTLINESTRINGPOLYGONMULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION等空間資料類型的同步。

  • 搜尋視圖查詢限制:搜尋視圖目前僅支援定義同步語義,不支援資料查詢。資料查詢請直接連接PolarSearch節點執行。

搜尋視圖

搜尋視圖(Search View)是AutoETL提供的一種聲明式資料同步機制。您可以使用標準SQL文法建立搜尋視圖,系統將自動建立從源表到PolarSearch節點的持續資料同步鏈路。

建立搜尋視圖

文法

CREATE SEARCH VIEW view_name [(column_list, PRIMARY KEY (pk_column_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。

select_statement

定義資料來源和同步邏輯的SELECT語句。該語句用於從源表中檢索資料,並將結果儲存到PolarSearch中。支援單表查詢、多表JOINUNION ALLGROUP 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;
  • 指定列同步:僅同步c1c2列,並手動定義列類型和主鍵。

    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.t1db2.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狀態的搜尋視圖:系統將徹底清除該搜尋視圖的資訊。

  • 其他狀態的搜尋視圖:系統不支援刪除操作。

變更搜尋視圖

當需要變更搜尋視圖的同步邏輯(如新增同步欄位、修改查詢條件等)時,建議採用“新索引 + 新搜尋視圖”的方式進行重建,以確保業務查詢不受影響。

  1. 建立一個新的搜尋視圖,同步至新的PolarSearch索引。

  2. 通過SHOW SEARCH VIEW STATUS查看新搜尋視圖的狀態,當等待新搜尋視圖的同步時延降至0~1秒時,將業務查詢邏輯從舊索引切換到新索引。

  3. 刪除舊的搜尋視圖。

關於源表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狀態的鏈路:系統將徹底清除該鏈路的資訊。

  • 其他狀態的鏈路:系統不支援刪除操作。

變更同步鏈路

當需要變更同步鏈路時,採用與搜尋視圖相同的“新索引 + 新鏈路”方式進行重建。

  1. 建立一個新的同步鏈路,同步至新的PolarSearch索引。

  2. 通過CALL dbms_etl.show_sync_link_by_id('<sync_id>')查看同步鏈路的狀態,當等待新同步鏈路的同步時延降至0~1秒時,將業務查詢邏輯從舊索引切換到新索引。

  3. 刪除舊的同步鏈路。

常見問題

搜尋視圖(Search View)和ETL預存程序(sync_by_sql)有什麼區別?

兩者的核心區別在於使用情境和複雜度:

  • 搜尋視圖:使用標準SQL文法(CREATE SEARCH VIEW),系統自動處理底層串連和同步細節,無需編寫Flink SQL。適合大多數單表同步和多表匯聚情境。

  • ETL預存程序:使用相容Flink SQL的文法(CALL dbms_etl.sync_by_sql),需要手動定義源表和目標表的串連配置。適合需要複雜資料清洗、轉換和彙總的情境,提供完全的Flink SQL控制能力。