對已建立搜尋視圖(Search View)或ETL預存程序(sync_by_sql)的源表進行DDL操作時,不同類型的變更對同步鏈路的影響不同。本文介紹各類DDL操作的影響規則,以及需要重建時的最佳實務。
源表DDL變更影響
DDL 操作可以參考PolarDB MySQL版DDL操作指南,下表列出了當源表執行的常見 DDL 操作,對同步鏈路的具體影響。
變更類別 | 具體操作 | 同步是否正常 | 說明 |
列變更 | 刪除列 | 是 | 存量資料中仍會保留被刪除欄位的值,增量資料中該欄位的值將為 |
增加列 | 是 | 新增欄位不會被自動同步至鏈路中。如需在鏈路增加欄位,請參考AutoETL變更實踐。 | |
修改列類型 | 視類型而定 | 類型相容(如 類型不相容:會導致鏈路不可用,需重建鏈路。 | |
重新命名列 | 否 | 鏈路使用建立時的列名。重新命名列後鏈路不識別修改後的源表欄位,需重建鏈路。 | |
其他(調整列順序、修改預設值、修改注釋、擴充VARCHAR長度、修改字元集、修改自增屬性、修改NULL約束等) | 是 | 這些操作不影響鏈路的同步。 | |
索引變更 | 增加、刪除或修改二級索引 | 是 | 二級索引的變更不影響鏈路的同步。 |
刪除或修改主鍵索引 | 否 | 鏈路依賴源表的主鍵進行資料同步。變更主鍵後需重建鏈路。 | |
表變更 |
| 否 | 鏈路無法感知 |
| 否 | 鏈路不識別新的表名,增量資料同步停止。 | |
其他( | 是 | 這些操作不影響鏈路的同步。 | |
分區表變更 | 轉換為分區表、增加分區、合并分區、重新分配分區、分析分區、檢查分區、最佳化分區、重建分區、轉換為非分區表、局部索引等 | 是 | 這些操作不影響鏈路的同步。 |
刪除分區( | 否 | 鏈路無法感知這些操作。如需刪除資料並同步至PolarSearch,請使用 | |
交換分區( | 否 | 鏈路無法感知指定分區資料的直接替換或修複,其他分區資料不受影響。建議執行後需重建鏈路。 |
AutoETL變更實踐
當需要變更搜尋視圖或ETL預存程序的同步結構(如新增同步欄位)時,請先確認該變更能否原地完成:
支援原地變更時,直接更新搜尋視圖或ETL預存程序的SQL定義,同步從原有位點繼續,無需重新全量同步。
不支援原地變更時,採用“新索引 + 新鏈路”的方式重建,待新搜尋視圖或ETL預存程序的資料同步完成並驗證無誤後,再將業務查詢流量切換至新的索引。
是否支援原地變更
下表列出常見的搜尋視圖或ETL預存程序變更及其是否支援原地變更。
變更類型 | 適用情境 | 是否可原地變更 | 說明 |
修改運行參數 | 單表同步 / 多表匯聚 | 可原地變更 | 僅調整同步資源與並發的參數不改變計算語義,可原地變更。 |
修改 | 單表同步 / 多表匯聚 | 可原地變更 | 修改過濾條件不會修改已同步到PolarSearch節點的存量資料,如需清理請配合重建。 |
增加同步列 | 單表同步 | 可原地變更 | 新增列僅對增量資料生效,歷史資料不回填。需全量回填請走重建。 |
減少同步列 | 單表同步 | 可原地變更 | PolarSearch節點中被移除的列停止更新。 |
修改PolarSearch節點索引的主鍵 | 單表同步 / 多表匯聚 | 不可,需重建 | 主鍵同時是PolarSearch的document ID,不相容。 |
增加/刪除 | 多表匯聚 | 不可,需重建 | 同步結構改變,需重新全量計算。 |
增加/刪除 | 多表匯聚 | 不可,需重建 | 彙總結構改變,歷史彙總結果無法沿用。 |
增加/刪除 | 多表匯聚 | 不可,需重建 | 同步結構改變,需重新全量計算。 |
單表同步與多表匯聚相互轉換 | 單表同步 / 多表匯聚 | 不可,需重建 | 同步邏輯整體改變。 |
主鍵 / | 單表同步 / 多表匯聚 | 不可,需重建 | 關鍵列類型變更後無法沿用原有同步狀態。 |
原地變更
在原有鏈路變更 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欄位,並確保線上查詢不受影響。
建立新索引:在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" } } } }修改源表:在源端PolarDB MySQL版的
user表中增加新列。ALTER TABLE shop.user ADD COLUMN membership_level TINYINT NOT NULL DEFAULT 0 COMMENT '會員等級';建立搜尋視圖:建立一個新的搜尋視圖,將
shop.user表的資料同步到user_v2索引。CREATE SEARCH VIEW user_v2 AS SELECT id, name, phone, gmt_create, membership_level FROM shop.user;驗證與切換:通過
SHOW SEARCH VIEW STATUS查看新搜尋視圖的狀態,待同步時延降至約0~1秒後,驗證新索引中的資料是否正確。確認無誤後,將業務查詢流量切換到新的user_v2索引。清理舊資源:觀察新搜尋視圖運行穩定後,刪除舊的搜尋視圖和PolarSearch中的
user_v1索引。DROP SEARCH VIEW user_v1;