mysql大表修改工具: pt-online-schame-change
個人博客地址: https://note.raokun.top
擁抱ChatGPT,國內(nèi)訪問網(wǎng)站:https://www.playchat.top
在表數(shù)據(jù)量很大的時候直接添加字段,以及其他表結(jié)構(gòu)修改,會嚴(yán)重影響線上使用,而且耗費時間很長;使用這個工具可以很好的在線修改表結(jié)構(gòu)。
好處:
降低主從延時的風(fēng)險
可以限速、限資源,避免操作時MySQL負(fù)載過高
建議:
在業(yè)務(wù)低峰期做,將影響降到最低
直接原表修改缺點:
當(dāng)表的數(shù)據(jù)量很大的時候,如果直接在線修改表結(jié)構(gòu),嚴(yán)重影響線上環(huán)境,而且耗時不可預(yù)估
注意:
需要確認(rèn)表必須包含主鍵或者唯一索引
工具會創(chuàng)建觸發(fā)器,所以原表上不能有觸發(fā)器
有外鍵的表需要注意使用參數(shù)--alter-foreign-keys-method(現(xiàn)在業(yè)務(wù)上不建議表中外鍵關(guān)聯(lián),建議在業(yè)務(wù)中控制)
原理:
首先它會新建一張一模一樣的表,表名一般是_new后綴
然后在這個新表執(zhí)行更改字段操作
然后在原表上加三個觸發(fā)器,DELETE/UPDATE/INSERT,將原表中要執(zhí)行的語句也在新表中執(zhí)行
最后將原表的數(shù)據(jù)拷貝到新表中,然后替換掉原表
1.數(shù)據(jù)備份
無論操作多么有把握,也要把備份做好(萬一很可怕)**
2.安裝
下載安裝包:
wget??https://downloads.percona.com/downloads/percona-toolkit/3.3.1/source/tarball/percona-toolkit-3.3.1.tar.gz
解壓:
tar?-xvf?percona-toolkit-3.3.1.tar.gz
安裝一些依賴包:
yum?install?perl-DBIyum?install?perl-DBD-MySQLyum?install?perl-Time-HiResyum?install?perl-IO-Socket-SSLyum?-y?install?perl-Digest-MD5
3.測試可用
在解壓包的bin目錄下執(zhí)行,看是否正常,查看命令
./pt-online-schema-change?--help
4.參數(shù)字段及含義
參數(shù)含義--user=連接用戶名--password=連接密碼--host=連接IPP=端口--alter=執(zhí)行表變更的語句D=database 庫名t=table 表名--charset=utf8使用utf8編碼,避免中文亂碼--no-check-alter不檢查alter語句--print打印操作日志--execute執(zhí)行修改表結(jié)構(gòu),真正的執(zhí)行alter,–dry-run與–execute必須指定一個,二者相互排斥–dry-run創(chuàng)建和修改新表,但不會創(chuàng)建觸發(fā)器、復(fù)制數(shù)據(jù)、和替換原表。并不真正執(zhí)行,與--print配合查看執(zhí)行細(xì)節(jié)
5.具體操作
添加一個字段
如果執(zhí)行失敗,檢查alter語句,如果確認(rèn)無誤 可以避免檢查 --no-check-alter
./pt-online-schema-change?--user=xxxx?--password=xxxx?--host=xxx.xxx.xxx.xxxx?--alter?"add?column?group_id?bigint(20)?not?NULL?default?'0'?comment?'test'?"?P=30306,D=h_pushcenter,t=h_message?--charset=utf8?--no-version-check?--print?--execute
修改字段
sql語句:
ALTER?TABLE?`h_message`?MODIFY?COLUMN?`group_id`?int(20)??NOT?NULL?DEFAULT?'1';ALTER?TABLE?`h_message`?MODIFY?COLUMN?`group_id`?int(20)??NOT?NULL?DEFAULT?'1';
pt命令:
--alter?"MODIFY?COLUMN?group_id?int(20)?NOT?NULL?DEFAULT?'1'"
修改字段名
sql語句:
ALTER?TABLE?`h_message`?CHANGE?column?group_id?group_id_0?bigint(20);
pt命令:
--alter?"CHANGE?group_id?group_id_0?bigint(20)"
添加索引
sql語句:
ALTER?TABLE?`h_message`?ADD?INDEX?h_message_n1(group_id);
pt命令:
--alter?"ADD?INDEX?h_message_n1(group_id)"
6.操作日志
創(chuàng)建new結(jié)尾的新表
Creating?new?table...CREATE?TABLE?`h_pushcenter`.`_h_message_new`?.....Created?new?table?h_pushcenter._h_message_new?OK.
新表執(zhí)行alter操作
Altering?new?table...
ALTER?TABLE?`h_pushcenter`.`_h_message_new`?add?column??group_id?bigint(20)?not?NULL?default?'0'??comment?'test'
Altered?`h_pushcenter`.`_h_message_new`?OK.
原表上創(chuàng)建3個觸發(fā)器
Creating?triggers...
Event?:?DELETE
Event?:?UPDATE
Event?:?INSERTCreated?triggers?OK.
復(fù)制數(shù)據(jù)到新表
Copying?approximately?8187?rows...
Copied?rows?OK.
重命名新舊兩個表,然后替換,刪除舊表
2021-05-19T10:33:08?Swapping?tables...RENAME?TABLE?`h_pushcenter`.`h_message`?TO?`h_pushcenter`.`_h_message_old`,?`h_pushcenter`.`_h_message_new`?TO?`h_pushcenter`.`h_message`2021-05-19T10:33:09?Swapped?original?and?new?tables?OK.2021-05-19T10:33:09?Dropping?old?table...DROP?TABLE?IF?EXISTS?`h_pushcenter`.`_h_message_old`2021-05-19T10:33:09?Dropped?old?table?`h_pushcenter`.`_h_message_old`?OK.
刪除觸發(fā)器
2021-05-19T10:33:09?Dropping?triggers...DROP?TRIGGER?IF?EXISTS?`h_pushcenter`.`pt_osc_h_pushcenter_h_message_del`DROP?TRIGGER?IF?EXISTS?`h_pushcenter`.`pt_osc_h_pushcenter_h_message_upd`DROP?TRIGGER?IF?EXISTS?`h_pushcenter`.`pt_osc_h_pushcenter_h_message_ins`2021-05-19T10:33:09?Dropped?triggers?OK.
完成
鏈接:
mysql好用工具: pt-online-schame-change