好用工具:pt-online-schame-change

使用場(chǎng)景: 在線修改大數(shù)據(jù)量表結(jié)構(gòu)(ALTER tables without locking them)

文檔參考:https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

好處:

降低主從延時(shí)的風(fēng)險(xiǎn)
可以限速、限資源蚌成,避免操作時(shí)MySQL負(fù)載過(guò)高

建議:

在業(yè)務(wù)低峰期做,將影響降到最低

直接原表修改缺點(diǎn):

當(dāng)表的數(shù)據(jù)量很大的時(shí)候,如果直接在線修改表結(jié)構(gòu),嚴(yán)重影響線上環(huán)境簿盅,而且耗時(shí)不可預(yù)估

注意:

需要確認(rèn)表必須包含主鍵或者唯一索引

工具會(huì)創(chuàng)建觸發(fā)器蜜自,所以原表上不能有觸發(fā)器

有外鍵的表需要注意使用參數(shù)--alter-foreign-keys-method(現(xiàn)在業(yè)務(wù)上不建議表中外鍵關(guān)聯(lián),建議在業(yè)務(wù)中控制)

原理:

  • 首先它會(huì)新建一張一模一樣的表泄私,表名一般是_new后綴

  • 然后在這個(gè)新表執(zhí)行更改字段操作

  • 然后在原表上加三個(gè)觸發(fā)器,DELETE/UPDATE/INSERT,將原表中要執(zhí)行的語(yǔ)句也在新表中執(zhí)行

  • 最后將原表的數(shù)據(jù)拷貝到新表中晌端,然后替換掉原表

0. 備份數(shù)據(jù)(先做)

1. 安裝

下載安裝包:

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-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL
yum -y install perl-Digest-MD5

2. 測(cè)試可用

在解壓包的bin目錄下執(zhí)行,看是否正常捅暴,查看命令

./pt-online-schema-change --help

3. 參數(shù)字段及含義

參數(shù) 含義
--user= 連接用戶名
--password= 連接密碼
--host= 連接IP
P= 端口
--alter= 執(zhí)行表變更的語(yǔ)句
D= database 庫(kù)名
t= table 表名
--charset=utf8 使用utf8編碼,避免中文亂碼
--no-check-alter 不檢查alter語(yǔ)句
--print 打印操作日志
--execute 執(zhí)行修改表結(jié)構(gòu)咧纠,真正的執(zhí)行alter蓬痒,–dry-run與–execute必須指定一個(gè),二者相互排斥
–dry-run 創(chuàng)建和修改新表漆羔,但不會(huì)創(chuàng)建觸發(fā)器梧奢、復(fù)制數(shù)據(jù)、和替換原表演痒。并不真正執(zhí)行亲轨,與--print配合查看執(zhí)行細(xì)節(jié)

4. 具體操作

  • 添加一個(gè)字段

如果執(zhí)行失敗,檢查alter語(yǔ)句鸟顺,如果確認(rèn)無(wú)誤 可以避免檢查 --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語(yǔ)句:

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語(yǔ)句

ALTER TABLE `h_message` CHANGE column group_id group_id_0 bigint(20);

pt工具

--alter "CHANGE group_id group_id_0 bigint(20)"
  • 添加索引

sql語(yǔ)句

ALTER TABLE `h_message` ADD INDEX h_message_n1(group_id);

pt工具

--alter "ADD INDEX h_message_n1(group_id)"

5.操作日志

  • 創(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個(gè)觸發(fā)器
Creating triggers...
 
 Event : DELETE 
 
 Event : UPDATE 
 
 Event : INSERT 
 Created triggers OK.
  • 復(fù)制數(shù)據(jù)到新表
Copying approximately 8187 rows...
 
 Copied rows OK.
  • 重命名新舊兩個(gè)表瓶埋,然后替換,刪除舊表
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.
  • 完成

歡迎關(guān)注公眾號(hào):Java質(zhì)變之路

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诊沪,一起剝皮案震驚了整個(gè)濱河市养筒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌端姚,老刑警劉巖晕粪,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渐裸,居然都是意外死亡巫湘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門昏鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尚氛,“玉大人,你說(shuō)我怎么就攤上這事洞渤≡乃唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵载迄,是天一觀的道長(zhǎng)讯柔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)护昧,這世上最難降的妖魔是什么魂迄? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮惋耙,結(jié)果婚禮上捣炬,老公的妹妹穿的比我還像新娘熊昌。我一直安慰自己,他們只是感情好湿酸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布婿屹。 她就那樣靜靜地躺著,像睡著了一般稿械。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冲粤,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天美莫,我揣著相機(jī)與錄音,去河邊找鬼梯捕。 笑死厢呵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傀顾。 我是一名探鬼主播襟铭,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼短曾!你這毒婦竟也來(lái)了寒砖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嫉拐,失蹤者是張志新(化名)和其女友劉穎哩都,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婉徘,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠嵌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盖呼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒鹿。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖几晤,靈堂內(nèi)的尸體忽然破棺而出约炎,到底是詐尸還是另有隱情,我是刑警寧澤蟹瘾,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布章钾,位于F島的核電站,受9級(jí)特大地震影響热芹,放射性物質(zhì)發(fā)生泄漏贱傀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一伊脓、第九天 我趴在偏房一處隱蔽的房頂上張望府寒。 院中可真熱鬧魁衙,春花似錦、人聲如沸株搔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纤房。三九已至纵隔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炮姨,已是汗流浹背捌刮。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舒岸,地道東北人绅作。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛾派,于是被迫代替她去往敵國(guó)和親俄认。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容