RDS MySQL在2019年08月01日后將不再支持TokuDB引擎,本文介紹如何將TokuDB引擎轉換為InnoDB引擎。
背景信息
由于Percona已經不再對TokuDB提供支持,很多已知BUG無法修正,極端情況下會導致業務受損,因此RDS MySQL在2019年08月01日后將不再支持TokuDB引擎。由于直接進行引擎轉換會阻塞DML操作,影響并發,建議您盡快對業務評估后選擇以下其中一種方案對引擎進行轉換。
TokuDB引擎下線時間
2019年08月01日
適用范圍
存儲引擎為TokuDB的實例。
您可以使用show engines;
命令查看實例當前默認引擎,或者使用show create table <表名>;
命令查看表的存儲引擎。
注意事項
轉換存儲引擎后空間占用會增大,在操作期間需要預留出的空間大約應為并行操作的TokuDB表容量的2倍。操作期間請隨時關注空間使用情況。
轉換引擎后,CPU使用率會下降,但IOPS會上升。這是由于數據頁沒有壓縮,所以讀取相同的數據量,IOPS會有所上升。
全庫遷移時,由于需要切換連接地址,請在業務低峰期進行操作。
全庫遷移時,如果變更了數據庫版本,建議提前進行兼容性測試。
方案建議
實例中的表較小(100M以下),且業務可接受短時阻塞時,可以使用方案一,鎖表時間短,而且免去各種工具配置流程。
實例中的表較大(大于5G)時,建議使用方案二或方案三。
實例中的所有表都需要轉換時,建議使用方案三或方案四。
切換引擎后請修改實例參數default_storage_engine為InnoDB。
方案一
此方案為直接轉換引擎,最簡單直接,但過程中會全程阻塞DML操作且大表轉換時間比較久。
在上方選擇
。執行如下命令:
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。
已在RDS實例的IP白名單中添加本地主機或ECS的IP。
操作步驟
在本地主機或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
在左側查看表,會發現存在以_gho、_ghc結尾的臨時表。
執行
rm /tmp/ghostpost.postpone
命令開始切換表。結果如下。說明請忽略顯示的error(錯誤),實際已經切換完成。
檢查表并驗證數據。
說明驗證數據沒有問題后刪除_del表即可。
方案三
此方案使用阿里云的數據傳輸服務DTS(Data Transmission Service)實時同步原表數據到臨時表,在業務低峰期鎖原表并交換表名。該方案可以大量的表同時操作。
在上方選擇
。使用如下命令創建臨時表。
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同步整個數據庫至新實例,適用于有實例升級需求,或者可以接受業務停機時間相對長一些的實例。