全部產品
Search
文件中心

PolarDB:DDL變更規則與實踐

更新時間:Aug 28, 2026

對已建立搜尋視圖(Search View)或ETL預存程序(sync_by_sql)的源表進行DDL操作時,不同類型的變更對同步鏈路的影響不同。本文介紹各類DDL操作的影響規則,以及需要重建時的最佳實務。

源表DDL變更影響

DDL 操作可以參考PolarDB MySQL版DDL操作指南,下表列出了當源表執行的常見 DDL 操作,對同步鏈路的具體影響。

變更類別

具體操作

同步是否正常

說明

列變更

刪除列

是

存量資料中仍會保留被刪除欄位的值,增量資料中該欄位的值將為null。

增加列

是

新增欄位不會被自動同步至鏈路中。如需在鏈路增加欄位,請參考AutoETL變更實踐。

修改列類型

視類型而定

類型相容(如INT修改為TINYINT):增量資料可以正常同步。

類型不相容:會導致鏈路不可用,需重建鏈路。

重新命名列

否

鏈路使用建立時的列名。重新命名列後鏈路不識別修改後的源表欄位,需重建鏈路。

其他(調整列順序、修改預設值、修改注釋、擴充VARCHAR長度、修改字元集、修改自增屬性、修改NULL約束等)

是

這些操作不影響鏈路的同步。

索引變更

增加、刪除或修改二級索引

是

二級索引的變更不影響鏈路的同步。

刪除或修改主鍵索引

否

鏈路依賴源表的主鍵進行資料同步。變更主鍵後需重建鏈路。

表變更

TRUNCATE TABLE

否

鏈路無法感知TRUNCATE操作。如需清空表資料並同步至PolarSearch,請使用DELETE FROM替代。

RENAME TABLE

否

鏈路不識別新的表名,增量資料同步停止。

其他(OPTIMIZE TABLE、修改ROW_FORMAT、修改KEY_BLOCK_SIZE、更新統計資料、修改表字元集、修改表注釋等)

是

這些操作不影響鏈路的同步。

分區表變更

轉換為分區表、增加分區、合并分區、重新分配分區、分析分區、檢查分區、最佳化分區、重建分區、轉換為非分區表、局部索引等

是

這些操作不影響鏈路的同步。

刪除分區(DROP PARTITION)、刪除資料表空間(DROP TABLESPACE)、截斷分區(TRUNCATE PARTITION)

否

鏈路無法感知這些操作。如需刪除資料並同步至PolarSearch,請使用DELETE FROM替代。

交換分區(EXCHANGE PARTITION)、修複分區(REPAIR PARTITION)、匯入資料表空間(IMPORT TABLESPACE)

否

鏈路無法感知指定分區資料的直接替換或修複,其他分區資料不受影響。建議執行後需重建鏈路。

AutoETL變更實踐

當需要變更搜尋視圖或ETL預存程序的同步結構(如新增同步欄位)時,請先確認該變更能否原地完成:

  • 支援原地變更時,直接更新搜尋視圖或ETL預存程序的SQL定義,同步從原有位點繼續,無需重新全量同步。

  • 不支援原地變更時,採用“新索引 + 新鏈路”的方式重建,待新搜尋視圖或ETL預存程序的資料同步完成並驗證無誤後,再將業務查詢流量切換至新的索引。

是否支援原地變更

下表列出常見的搜尋視圖或ETL預存程序變更及其是否支援原地變更。

變更類型

適用情境

是否可原地變更

說明

修改運行參數

單表同步 / 多表匯聚

可原地變更

僅調整同步資源與並發的參數不改變計算語義,可原地變更。

修改WHERE過濾條件

單表同步 / 多表匯聚

可原地變更

修改過濾條件不會修改已同步到PolarSearch節點的存量資料,如需清理請配合重建。

增加同步列

單表同步

可原地變更

新增列僅對增量資料生效,歷史資料不回填。需全量回填請走重建。

減少同步列

單表同步

可原地變更

PolarSearch節點中被移除的列停止更新。

修改PolarSearch節點索引的主鍵

單表同步 / 多表匯聚

不可,需重建

主鍵同時是PolarSearch的document ID,不相容。

增加/刪除 JOIN 源表,或修改 JOIN 類型

多表匯聚

不可,需重建

同步結構改變,需重新全量計算。

增加/刪除 GROUP BY 或彙總函式

多表匯聚

不可,需重建

彙總結構改變,歷史彙總結果無法沿用。

增加/刪除 UNION / UNION ALL 分支

多表匯聚

不可,需重建

同步結構改變,需重新全量計算。

單表同步與多表匯聚相互轉換

單表同步 / 多表匯聚

不可,需重建

同步邏輯整體改變。

主鍵 / JOIN 關聯列 / 分組列的欄位類型變更

單表同步 / 多表匯聚

不可,需重建

關鍵列類型變更後無法沿用原有同步狀態。

原地變更

在原有鏈路變更 SQL 邏輯,使用原有的鏈路狀態啟動鏈路。更多資訊請參見搜尋視圖(Search View) - 變更搜尋視圖與ETL預存程序(sync_by_sql) - 變更同步鏈路。

  • 搜尋視圖文法:

    ALTER SEARCH VIEW view_name UPDATE
      [WITH (option_list)]
      [TO (column_list, PRIMARY KEY (pk_column_list))]
      AS new_select_statement;
  • ETL 預存程序文法:

    SET esl_link_options = "<new_option_list>";
    -- new_sync_sql 為空白時保留舊的 sync sql
    CALL dbms_etl.update_sync_link('<sync_id>', '<new_sync_sql>'); 

“新索引 + 新鏈路”變更

“新索引 + 新鏈路”的方式是最為通用的變更方式,鏈路在新鏈路重新掃描資料寫入到PolarSearch節點中,待新搜尋視圖或ETL預存程序的資料同步完成並驗證無誤後,再將業務查詢流量切換至新的索引。

樣本:

為shop.user表新增欄位並重建搜尋視圖。假設原搜尋視圖將shop.user表(含id, name, phone, gmt_create欄位)同步至user_v1索引。現需新增membership_level欄位,並確保線上查詢不受影響。

  1. 建立新索引:在PolarSearch節點中建立一個名為user_v2的新索引,並在其映射關係中包含新欄位membership_level。

    PUT user_v2
    {
      "mappings": {
        "properties": {
          "id":               { "type": "keyword" },
          "name":             { "type": "text", "fields": { "keyword": { "type": "keyword" } } },
          "phone":            { "type": "keyword" },
          "gmt_create":       { "type": "date" },
          "membership_level": { "type": "integer" }
        }
      }
    }
  2. 修改源表:在源端PolarDB MySQL版的user表中增加新列。

    ALTER TABLE shop.user ADD COLUMN membership_level TINYINT NOT NULL DEFAULT 0 COMMENT '會員等級';
  3. 建立搜尋視圖:建立一個新的搜尋視圖,將shop.user表的資料同步到user_v2索引。

    CREATE SEARCH VIEW user_v2 AS SELECT id, name, phone, gmt_create, membership_level FROM shop.user;
  4. 驗證與切換:通過SHOW SEARCH VIEW STATUS查看新搜尋視圖的狀態,待同步時延降至約0~1秒後,驗證新索引中的資料是否正確。確認無誤後,將業務查詢流量切換到新的user_v2索引。

  5. 清理舊資源:觀察新搜尋視圖運行穩定後,刪除舊的搜尋視圖和PolarSearch中的user_v1索引。

    DROP SEARCH VIEW user_v1;