摘 要:本文闡述了MySQL DDL 的問題現狀、pt-online-schema-change的工作原理,並實際利用pt-online-schema-change工具線上修改生產環境下1.6億級數據表結構。 在一個軟體生命周期中,我們都知道,前期的表結構設計是非常重要的,因為當表數據量一上來後再進 ...
摘 要:本文闡述了MySQL DDL 的問題現狀、pt-online-schema-change的工作原理,並實際利用pt-online-schema-change工具線上修改生產環境下1.6億級數據表結構。
在一個軟體生命周期中,我們都知道,前期的表結構設計是非常重要的,因為當表數據量一上來後再進行表結構修改危險性比較大,而且要操作的時間也比較長。
在筆者參與的項目中,就曾遇到這樣一個問題,首先上去查看了一下該表的信息,已有約2億的數據量,而且每分鐘還要併發寫入4萬條記錄,而由於這個表有一個欄位前期設計過短,導致寫入到資料庫後,這個欄位的值就一直亂碼。因為該表在生產環境下使用,影響到業務,需要及時修改這個欄位長度,並且修改該表結構時不能停服務。那麼如何解決這種問題呢?
一、MySQL DDL 的問題現狀
開始想了下,減少這個表的數據量再DDL,將這個表一周以前的數據備份到一個臨時表,再刪除這個表一周以前的數據。
而在MySQL中在對錶進行ddl時,會鎖表,當表比較小比如小於1w條記錄時,操作時間較短,對前端影響較小,當時遇到千萬乃至上億級級別的表(保留一周的數據量還有1.6億),就會影響前端應用對錶的寫操作。
因為目前InnoDB引擎是通過以下步驟來進行DDL的:
1 按照原始表(original_table)的表結構和DDL語句,新建一個不可見的臨時表(tmp_table)
2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)
3 執行insert into tmp_table select * from original_table
4 rename original_table和tmp_table,最後drop original_table
5 釋放 write lock。
我們可以看見在InnoDB執行DDL的時候,原表是只能讀不能寫的。為此 perconal 推出一個工具 pt-online-schema-change ,其特點是修改過程中不會造成讀寫阻塞。
二、pt-online-schema-change介紹
【工具簡介】
pt-osc模仿MySQL內部的改表方式進行改表,但整個改表過程是通過對原始表的拷貝來完成的,即在改表過程中原始表不會被鎖定,並不影響對該表的讀寫操作。
首先,osc創建與原始表相同的不包含數據的新表並按照需求進行表結構的修改,然後將原始表中的數據按chunk大小逐步拷貝到新表中,當拷貝完成後,會自動同時修改原始表和新表的名字並預設將原始表刪除
【工具安裝及使用】
參見下麵下麵這篇文章
linux下percona-toolkit工具包的安裝和使用(超詳細版)
【工作原理】
1 創建兩個和你要執行 alter 操作的表結構一樣的空表。如圖:
說明:t_ad_req_log就是原表;
_t_ad_req_log_ol是舊表,這個表是用來當你執行失敗的時候,還原回來的原表結構;
_t_ad_req_log_new是新表,這個表就是這次要修改的表。
2 執行表結構修改,然後從原表中的數據到copy到 表結構修改後的表(即_t_ad_req_log_new)
3 在原表上創建觸發器將 copy 數據的過程中,在原表的更新操作更新到新表.
註意:如果表中已經定義了觸發器這個工具就不能工作了。
4 copy 完成以後,用rename table 新表代替原表,預設刪除原表。
修改的命令如下:
/usr/local/bin/pt-online-schema-change --user=用戶名 --password=密碼 --host=127.0.0.1 --port=埠號 --charset=utf8 --nodrop-old-table --alter="modify media_code varchar(64) DEFAULT NULL COMMENT '當前視頻編碼' " D=ad_api,t=t_ad_req_log --exec
參數說明:
--user=用戶名 指定用戶名
--password=用戶名 指定用戶密碼
--port=埠號 指定埠號
--charset=utf8 指定字元編碼
--alter= 後面就是接需要修改的內容,比如上面表示的就是修改ad_api資料庫t_ad_req_log表的media_code 欄位長度為64位
下麵請看一個完整的圖:
註:如果對percona-toolkit工具安裝及使用有疑問的先查看下這兩篇文章。
linux下percona-toolkit工具包的安裝和使用(超詳細版)