背景資訊
由於Percona已經不再對TokuDB提供支援,很多已知BUG無法修正,極端情況下會導致業務受損,因此RDS MySQL在2019年08月01日後將不再支援TokuDB引擎。由於直接進行引擎轉換會阻塞DML操作,影響並發,建議您儘快對業務評估後選擇以下其中一種方案對引擎進行轉換。
適用範圍
儲存引擎為TokuDB的執行個體。
說明
您可以使用show engines;
命令查看執行個體當前預設引擎,或者使用show create table <表名>;
命令查看錶的儲存引擎。

注意事項
轉換儲存引擎後空間佔用會增大,在操作期間需要預留出的空間大約應為並行操作的TokuDB表容量的2倍。操作期間請隨時關注空間使用方式。
轉換引擎後,CPU使用率會下降,但IOPS會上升。這是由於資料頁沒有壓縮,所以讀取相同的資料量,IOPS會有所上升。
全庫遷移時,由於需要切換串連地址,請在業務低峰期進行操作。
全庫遷移時,如果變更了資料庫版本,建議提前進行相容性測試。
方案建議
執行個體中的表較小(100M以下),且業務可接受短時阻塞時,可以使用方式情節一,鎖表時間短,而且免去各種工具配置流程。
執行個體中的表較大(大於5G)時,建議使用方式情節二或方案三。
執行個體中的所有表都需要轉換時,建議使用方式情節三或方案四。
切換引擎後請修改執行個體參數default_storage_engine為InnoDB。
方案一
此方案為直接轉換引擎,最簡單直接,但過程中會全程阻塞DML操作且大錶轉換時間比較久。
通過DMS登入RDS資料庫。
在上方選擇。
執行如下命令:
Alter table test.testfs engine innodb

方案二
此方案為使用第三方工具進行轉換。支援Online DDL的第三方工具很多,例如Percona開發的pt-osc、Git-hub開發的gh-ost等,這裡以gh-ost為例進行轉換說明,詳細說明請參見gh-ost。
原理說明
gh-ost進行轉換的基本原理是建立一個與原表結構相同的暫存資料表,然後同步原表資料,全量完成後通過類比Slave進程讀取Binlog,即時同步資料到暫存資料表。最後在業務低峰時間段重新命名表進行切換。此方案主要壓力來自全量資料初始化時的IO,但是可以通過修改參數限制IO。
參數說明
參數 | 說明 |
--initially-drop-old-table | 檢查並刪除已經存在的舊錶。 |
--initially-drop-ghost-table | 檢查並刪除已經存在的ghost中間表。 |
--aliyun-rds | 在阿里雲RDS上執行。 |
--assume-rbr | 設定gh-ost為rbr binlog模式。 |
--allow-on-master | 在主庫上執行gh-ost。 |
--assume-master-host | 主庫的地址。 |
--user | 資料庫帳號名稱。 |
--password | 資料庫密碼。 |
--host | 串連地址,與主庫地址相同即可。 |
--database | 資料庫名稱。 |
--table | 表名。 |
--alter | 動作陳述式。 |
--chunk-size | 行拷貝的batch大小。 |
--postpone-cut-over-flag-file | 切換檔案。指定時間刪除此檔案立刻進行表切換。 |
--panic-flag-file | 產生此檔案,ghost進程立刻停止。 |
--serve-socket-file | 用於接收互動命令。 |
--execute | 直接執行。 |
前提條件
操作步驟
在本地主機或ECS上執行如下命令進行轉換,等待轉換完成。
gh-ost --user="test01" --password="Test123456" --host="rm-bpxxxxx.mysql.rds.aliyuncs.com" --database="test" --table="testfs" --alter="engine=innodb" --initially-drop-old-table --initially-drop-ghost-table --aliyun-rds --assume-rbr --allow-on-master --assume-master-host="rm-bpxxxxx.mysql.rds.aliyuncs.com" --chunk-size=500 --postpone-cut-over-flag-file="/tmp/ghostpost.postpone" --panic-flag-file="/tmp/stop.flag" --serve-socket-file="/tmp/ghost.sock" --execute

通過DMS登入RDS資料庫。
在左側查看錶,會發現存在以_gho、_ghc結尾的暫存資料表。
執行rm /tmp/ghostpost.postpone
命令開始切換表。結果如下。
說明
請忽略顯示的error(錯誤),實際已經切換完成。
檢查表並驗證資料。

方案三
此方案使用阿里雲的Data Transmission Service即時同步原表資料到暫存資料表,在業務低峰期鎖原表並交換表名。該方案可以大量的表同時操作。
通過DMS登入RDS資料庫。
在上方選擇。
使用如下命令建立暫存資料表。
CREATE TABLE `testfs_tmp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vc` varchar(8000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8
購買資料同步作業。
在資料轉送控制台左側單擊資料同步。
找到已購買的資料同步執行個體,在右側單擊配置同步鏈路。
配置如下參數。
類別 | 參數 | 說明 |
源執行個體資訊 | 執行個體類型 | 選擇RDS執行個體。 |
執行個體ID | 選擇需要切換引擎的RDS執行個體。 |
串連方式 | 有非加密傳輸和SSL安全連線兩種串連方式。選擇SSL安全連線,需要提前開啟SSL加密,會顯著增加CPU消耗。 |
目標執行個體資訊 | 執行個體類型 | 選擇RDS執行個體。 |
執行個體ID | 選擇需要切換引擎的RDS執行個體。 |
串連方式 | 有非加密傳輸和SSL安全連線兩種串連方式。選擇SSL安全連線,需要提前開啟SSL加密,會顯著增加CPU消耗。 |

單擊授權白名單並進入下一步。
等待建立同步帳號,然後單擊下一步。
將左側的表testfs移動到右側,並單擊編輯。
修改資料庫名為之前建立的testfs_tmp,並單擊確定。
單擊下一步。
僅勾選全量資料初始化,並單擊預檢查並啟動。
等待預檢查完成,單擊關閉。
等待資料同步延遲為0ms。
在DMS的SQL視窗執行切換表名命令:
rename table `testfs` to `testfs_del`,`testfs_tmp` to `testfs`;
說明
切換後DTS同步會報錯,屬於正常現象。
驗證資料後請儘快釋放同步作業,避免繼續產生計費。


方案四
此方案使用DTS同步整個資料庫至新執行個體,適用於有執行個體升級需求,或者可以接受業務停機時間相對長一些的執行個體。
源執行個體匯出所有結構指令碼,將指令碼中關於引擎部分刪除或修改。
說明
例如將create table t1(id int,name varchar(10)) engine=tokudb;
修改為create table t1(id int,name varchar(10)) engine=innodb;
。
建立RDS執行個體,使用修改過的指令碼建立庫、表。
將源執行個體資料庫使用DTS同步至新執行個體上。

確認同步無延遲後,切換應用串連地址到新執行個體即可。