使用pt-online-schema-change

3.1 介紹

pt-online-schema-change是percona公司開發的一個工具,在percona-toolkit包裡面可以找到這個功能,它可以在線修改表結構

3.2 原理

  • 首先它會新建一張一模一樣的表,表名一般是_為前綴_new後綴,例如原表為t_user 臨時表就是_t_user_new
  • 然後在這個新表執行更改欄位操作
  • 然後在原表上加三個觸發器,DELETE/UPDATE/INSERT,將原表中要執行的語句也在新表中執行
  • 最後將原表的數據拷貝到新表中,然後替換掉原表

SQL語句:

ALTER TABLE tmp_task_user ADD support tinyint(1) unsigned NOT NULL DEFAULT 1;

工具命令:

sh pt.sh tmp_task_user "ADD COLUMN support tinyint(1) unsigned NOT NULL DEFAULT 1"

好處:

  • 降低主從延時的風險
  • 可以限速、限資源,避免操作時MySQL負載過高

建議:

  • 在業務低峰期做,將影響降到最低
  • 刪除索引後再修改表結構,效率將大大提升


主要有如下幾種情況:

  1. 直接添加

如果該表讀寫不頻繁,數據量較小(通常1G以內或百萬以內),直接添加即可(可以了解一下online ddl的知識)

2. 使用pt_osc添加

如果表較大 但是讀寫不是太大,且想盡量不影響原表的讀寫,可以用percona tools進行添加,相當於新建一張添加了欄位的新表,再降原表的數據複製到新表中,複製歷史數據期間的數據也會同步至新表,最後刪除原表,將新表重命名為原表表名,實現欄位添加

pt工具還有很多應用場景,具體案例可以參考如下文章

五分鐘學會Percona Toolkit 安裝及使用?

mp.weixin.qq.com圖標

3. 先在從庫添加 再進行主從切換

如果一張表數據量大且是熱表(讀寫特別頻繁),則可以考慮先在從庫添加,再進行主從切換,切換後再將其他幾個節點上添加欄位

以上希望對你有幫助


你的意思在線添加欄位吧?直接加就成啊,可能時間稍長點吧,看你的伺服器和數據量。

alter table tabname add col_name varchar(100);


百萬級別的表不算大啊,如果數據的寫不頻繁的話,直接加問題也不大。

如果是寫操作很頻繁,那就做主從切換,在讀庫上加欄位,加完再切回來


如果想不停機影響最小,可以使用pt-osc,gh-ost這兩個工具。

詳細參考:mysql超大表如何加欄位影響最小 - 墨天輪問答

另外,Mysql 8.0版本合併了騰訊互娛資料庫團隊的Patch,可以實現秒級添加欄位,這個功能可謂是mysql資料庫攻城獅的福音,解決了之前5.6,5.7版本添加欄位很高的運維成本。

發佈於 2020-06-08繼續瀏覽內容知乎發現更大的世界打開Chrome繼續mastermasterIT

百萬級別 寫壓力不大的話 直接加


百萬級別 寫壓力不大的話 直接加


先創建一張備份表,然後在備份表中新增欄位,然後把主表rename 掉,把備份表rename成主表。


之前遇到這種情況,就是新建數據表增加欄位,然後掛個作業根據自增id作為指針同步數據。

同步完成之後,修改表名,同時再掛一個作業,把這段時間內新增的數據同步過來。

如果操作很頻繁的話,還是需要停機的


推薦閱讀:
相关文章