得益於 MySQL 插件式存儲引擎架構,InnoDB Plugin 升級本質是「停庫→替換文件→啟庫」。但壓縮表格式不兼容(1.0.2+)、靜態編譯重構、慢關閉強制等細節決定成敗。本文涵蓋動態/靜態兩種升級路徑、壓縮表識別與轉換全流程、降級禁忌。
SET GLOBAL innodb_fast_shutdown=0;
確保合併插入緩衝、清理刪除標記完成,避免新插件啟動時處理舊格式頁面報錯。無壓縮表時,慢關閉後直接替換插件文件重啟即可無縫升級。
mv $plugin_dir/ha_innodb_plugin.so $plugin_dir/ha_innodb_plugin.so.bak。ha_innodb_plugin.so/.dll 至 $plugin_dir(SHOW VARIABLES LIKE 'plugin_dir' 確認)。mysqld → 啟庫。無論哪種,含壓縮表必執行轉換。
1.0.0/1.0.1 建立的壓縮表在新版本下會觸發「合併插入緩衝/清理刪除標記」錯誤。轉換步驟:
innodb_fast_shutdown=0)。SET SESSION innodb_strict_mode=1;。SELECT table_schema, table_name
FROM information_schema.tables
WHERE engine='innodb' AND row_format='COMPRESSED';
SHOW CREATE TABLE db.tbl\G
CREATE TABLE db.tbl_new (...) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
-- 成功則 DROP tbl_new,繼續下一表
-- 失敗則增大 KEY_BLOCK_SIZE(如 16→32)重試,直到成功
-- 成功後:ALTER TABLE db.tbl ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=新值;
KEY_BLOCK_SIZE 已達上限仍失敗,縮短索引列前綴長度重建(減少 B-tree 節點佔用)。有外鍵約束的表群: 複雜度指數級上升,建議舊版本 mysqldump 導出 → 新版本導入,避免手動處理依賴順序。
一旦用新版本 InnoDB Plugin 訪問過數據目錄,絕不可再用舊版本(≤1.0.1)啟動同一數據目錄,會導致元數據不可逆損壞。
| 場景 | 關鍵動作 | 風險點 |
|---|---|---|
| 無壓縮表,動態插件 | 慢關閉→替換 .so→啟動 | 極低 |
| 有壓縮表,動態插件 | 慢關閉→替換 .so→啟動→逐表轉換 KEY_BLOCK_SIZE | 轉換失敗需縮短索引前綴 |
| 靜態編譯升級 | 重新編譯 mysqld→替換二進制 | 編譯環境一致性 |
| 外鍵約束表群 | mysqldump 遷移法 | 導入耗時長 |
升級前必備份、必在測試環境演練、必確認回滾方案(備份文件+舊插件文件)。把「插件熱插拔」的便利轉化為「可控、可驗證、可逆」的工程交付。