mysql百萬級表在不停機的情況下增加一個欄位要怎麼處理的?
使用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負載過高
建議:
- 在業務低峰期做,將影響降到最低
- 刪除索引後再修改表結構,效率將大大提升
主要有如下幾種情況:
- 直接添加
如果該表讀寫不頻繁,數據量較小(通常1G以內或百萬以內),直接添加即可(可以了解一下online ddl的知識)
2. 使用pt_osc添加
如果表較大 但是讀寫不是太大,且想盡量不影響原表的讀寫,可以用percona tools進行添加,相當於新建一張添加了欄位的新表,再降原表的數據複製到新表中,複製歷史數據期間的數據也會同步至新表,最後刪除原表,將新表重命名為原表表名,實現欄位添加
pt工具還有很多應用場景,具體案例可以參考如下文章
五分鐘學會Percona Toolkit 安裝及使用?mp.weixin.qq.com3. 先在從庫添加 再進行主從切換
如果一張表數據量大且是熱表(讀寫特別頻繁),則可以考慮先在從庫添加,再進行主從切換,切換後再將其他幾個節點上添加欄位
以上希望對你有幫助
你的意思在線添加欄位吧?直接加就成啊,可能時間稍長點吧,看你的伺服器和數據量。
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繼續masterIT百萬級別 寫壓力不大的話 直接加
百萬級別 寫壓力不大的話 直接加
先創建一張備份表,然後在備份表中新增欄位,然後把主表rename 掉,把備份表rename成主表。
之前遇到這種情況,就是新建數據表增加欄位,然後掛個作業根據自增id作為指針同步數據。
同步完成之後,修改表名,同時再掛一個作業,把這段時間內新增的數據同步過來。
如果操作很頻繁的話,還是需要停機的
推薦閱讀: