最近有程序需要對表添加列 自己手動在客戶端添加 由于數(shù)據(jù)表過大無法完成 程序在不知道這個的危險情況下這樣操作很可怕,知道后建議程序?qū)Υ蟊淼膁dl操作都有我這邊完成。使用pt-osc來修改 這個工具的原理是:新建一張修改后的表將舊表的數(shù)據(jù)拷貝到新表 也會創(chuàng)建觸發(fā)器來完成拷貝過程中數(shù)據(jù)的寫入保證數(shù)據(jù)的一致性,修改的表最好有主鍵或者唯一索引 在數(shù)據(jù)的拷貝過程中 它是分段拷貝,可根據(jù)主鍵和唯一索引,數(shù)據(jù)一致后刪除舊表。這樣的操作我一般是在業(yè)務低谷執(zhí)行,在對一張2000w數(shù)據(jù)表的修改中用時2.5個小時。在操作過程中遇到的2個小問題。
1.在添加有中文備注的列時沒有使用 --charset=utf8 參數(shù)導致表所有的表結構注釋亂碼 在改完變后查看,表結構注釋亂碼,這個可直接使用客戶端軟件修改回去,修改注釋不影響什么。
2.一次意外的操作終止,--critical-load 這個由于超過了Threads_running的設置 默認是50 這個SHOW GLOBAL STATUS如果超過這個這50 則終止執(zhí)行,這個當時是因為一個程序的小伙伴在跑數(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的缺點:
1、更容易導致主從數(shù)據(jù)延遲
2、如果運行過程中報錯了,無法從上一個位置繼續(xù)進行,需要從頭開始
3、pt 創(chuàng)建trigger 或者刪除trigger 的時候 有坑
4、不支持5.7的虛擬列功能
兩個列,值相同,但分別為int、char 類型,且無索引,效率對比
參考文檔
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