為解決變更資料庫表結構時的鎖表問題,ODC V4.2.0 及之後的版本提供了無鎖結構變更功能,該功能可以較好地規避因鎖表以致於阻塞業務。本文檔旨在介紹如何通過提交無鎖變更工單實現資料庫無鎖結構變更。
背景資訊
原理介紹
無鎖結構變更的執行過程如下圖所示:

建立暫存資料表。
變更暫存資料表結構。
全量拷貝資料。
增量資料同步。
資料一致性校正。
Kill Session。
切換新舊錶。
無鎖結構變更工單執行流程

使用者提交無鎖結構變更工單。
對使用者輸入的 SQL 陳述式進行預檢查。
審批任務流程。
執行無鎖結構變更任務。
支援的變更範圍
分類 | 操作 | 是否支援 | 備忘 |
列操作 | 列類型修改 | 是 | |
重排列(before/after/first) | 是 | ||
轉換字元集 | 是 | ||
列重新命名 | 否 | ||
增加列 | 是 | ||
刪除列 | 否 | ||
增加主鍵列 | 否 | ||
主鍵 | 增加主鍵 | 是 | 表存在非空唯一鍵 |
修改主鍵 | 是 | 表存在非空唯一鍵 | |
刪除主鍵 | 是 | 表存在非空唯一鍵 | |
分區 | 刪除分區 | 是 | |
truncate 分區 | 是 | ||
重分區 | 是 | ||
非分區表改為分區表 | 是 |
注意事項
確保資料庫磁碟空間充足。
表中必須存在主鍵或非空唯一鍵且表中不存在外鍵。
當前表在執行無鎖結構變更同時,執行其它 DDL 操作會導致任務失敗。
OceanBase MySQL 模式下的表名稱不超過 54 個字元。
ODC 串連 OceanBase 社區版資料庫時,資料來源配置資訊中需包含叢集名和 SYS 租戶帳號。
如果 OceanBase MySQL 模式版本小於 V4.3.0,ODC 通過鎖定使用者且關閉會話的方式避免表名切換過程中資料的寫入。
無鎖結構變更期間,發起其它關於該表的 DDL 變更將導致任務失敗。
建立無鎖結構變更任務
本文以 OceanBase 社區版和企業版 OMS 為例,示範情境為將表 student 中的列 birth 類型修改為 datetime。該樣本所使用的專案名稱為 odc_4.2.0,資料庫名稱為 odc_test,表名稱為 student。
在 SQL 視窗中,編輯 SQL 陳述式以建立表 student 到資料庫 odc_test 中。

在 工單 頁簽中單擊 無鎖結構變更 > 建立無鎖結構變更。

在 建立無鎖結構變更 頁面中,輸入以下資訊。

資訊項
說明
資料庫
選擇需變更的資料庫。
鎖定使用者
如果指定鎖定使用者,則表名切換之前 ODC 會鎖定所指定的資料庫帳號,並關閉該帳號對應的所有會話資訊,以保障表名切換期間資料一致性的同時儘可能降低對業務的影響。
如果未指定任何帳號,ODC 將不會進行任何帳號鎖定及關閉會話操作,需自主確保切換期間資料的一致性。
重要執行無鎖結構變更任務期間,執行該任務的使用者不可執行與無鎖結構變更相關表的變更操作。
變更定義
CREATE TABLE:OceanBasese 不支援的文法需要使用 CREATE 語句。
ALTER TABLE:OceanBasese V4.0.0 及之後的版本,ALTER TABLE OFFLINE 模式可以使用 ALTER 語句。
SQL 內容
在編輯區中錄入 SQL 指令碼。
切換表設定
資料一致後將原表切換為目標表。
鎖表逾時時間:切換表過程會鎖表,逾時未切換完成可能導致執行失敗。
失敗重試次數:超過鎖表時間後,未切換完成可自動重試。
完成後源表清理策略:選擇 重新命名不處理,重新命名源表,不刪除。選擇 立即刪除,無鎖結構變更完成後刪除源表。
任務設定
選擇 立即執行/定時執行 設定任務執行方式。
無鎖結構變更工具提供兩種任務錯誤處理方式:
停止任務:停止任務為預設,運行指令碼的過程中出現錯誤時會停止運行。
忽略錯誤繼續任務:選擇忽略錯誤繼續任務方式,在運行指令碼出現錯後將跳過錯誤語句繼續執行。
選擇 自動切換/手動切換 表名。
配置限流策略:
行限流:每秒操作資料總行限制。
資料大小限流:每秒操作資料總大小限制。
描述
可在 描述 文字框中輸入不超過 200 個字元的描述資訊,該項為選填項。
單擊 建立,完成建立無鎖結構變更。
任務產生後可以在 工單 > 無鎖結構變更 列表中查看任務資訊。

查看無鎖結構變更任務
查看任務資訊
在 工作中樞 的無鎖結構變更列表中,單擊操作列中的 查看 按鈕。
在彈出的任務詳情面板中,單擊 任務資訊 頁簽查看所屬資料庫、任務類型、風險等級、SQL 內容和復原內容等資訊。
單擊 再次發起,可重新發起無鎖結構變更任務。
查看任務流程
在任務詳情面板中,單擊 任務流程 頁簽查看發起任務狀態、審批狀態、執行狀態和執行結果等資訊。
查看執行記錄
在任務詳情面板中,單擊 執行記錄 頁簽查看新表和源表 DDL。
查看任務日誌
在任務詳情面板中,單擊 任務日誌 頁簽查看任務的全部日誌和警示日誌。
資訊項 | 說明 |
全部日誌 | 全部日誌顯示任務的 INFO、ERROR 和 WARN 日誌等全量資訊。 單擊 尋找、下載 和 複製 按鈕,可尋找資訊、下載或複製全部日誌資訊。 |
警示日誌 | 警示日誌單獨顯示任務的 ERROR 和 WARN 日誌。當任務失敗時,可通過警示日誌查看錯誤資訊。 單擊 尋找、下載 和 複製 按鈕,可尋找資訊、下載或複製警示日誌資訊。 |