最近有程序需要對(duì)表添加列 自己手動(dòng)在客戶端添加 由于數(shù)據(jù)表過大無法完成 程序在不知道這個(gè)的危險(xiǎn)情況下這樣操作很可怕顿仇,知道后建議程序?qū)Υ蟊淼膁dl操作都有我這邊完成东抹。使用pt-osc來修改 這個(gè)工具的原理是:新建一張修改后的表將舊表的數(shù)據(jù)拷貝到新表 也會(huì)創(chuàng)建觸發(fā)器來完成拷貝過程中數(shù)據(jù)的寫入保證數(shù)據(jù)的一致性,修改的表最好有主鍵或者唯一索引 在數(shù)據(jù)的拷貝過程中 它是分段拷貝,可根據(jù)主鍵和唯一索引,數(shù)據(jù)一致后刪除舊表。這樣的操作我一般是在業(yè)務(wù)低谷執(zhí)行该押,在對(duì)一張2000w數(shù)據(jù)表的修改中用時(shí)2.5個(gè)小時(shí)。在操作過程中遇到的2個(gè)小問題阵谚。
1.在添加有中文備注的列時(shí)沒有使用 --charset=utf8 參數(shù)導(dǎo)致表所有的表結(jié)構(gòu)注釋亂碼 在改完變后查看蚕礼,表結(jié)構(gòu)注釋亂碼,這個(gè)可直接使用客戶端軟件修改回去梢什,修改注釋不影響什么闻牡。
2.一次意外的操作終止,--critical-load 這個(gè)由于超過了Threads_running的設(shè)置 默認(rèn)是50 這個(gè)SHOW GLOBAL STATUS如果超過這個(gè)這50 則終止執(zhí)行绳矩,這個(gè)當(dāng)時(shí)是因?yàn)橐粋€(gè)程序的小伙伴在跑數(shù)據(jù) 叫他停止之后我在執(zhí)行 執(zhí)行完成 表正常罩润。
使用的加列語句
pt-online-schema-change --user=root --password=xxxxxxxx --socket=/data1/mysql/33777/mysql.sock --alter "ADD COLUMN contacts_total mediumint(5) UNSIGNED NULL DEFAULT 0 COMMENT '聯(lián)系人總數(shù)' AFTER lat" D=dbxxx_com,t=customer --charset=utf8 --print --execute
pt-osc的缺點(diǎn):
1、更容易導(dǎo)致主從數(shù)據(jù)延遲
2翼馆、如果運(yùn)行過程中報(bào)錯(cuò)了割以,無法從上一個(gè)位置繼續(xù)進(jìn)行金度,需要從頭開始
3、pt 創(chuàng)建trigger 或者刪除trigger 的時(shí)候 有坑
4严沥、不支持5.7的虛擬列功能
兩個(gè)列猜极,值相同,但分別為int消玄、char 類型跟伏,且無索引,效率對(duì)比
參考文檔
http://www.ttlsa.com/mysql/pt-online-schema-change-mysql-structure/
https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html