在表數據量很大的時候直接添加欄位,以及其他表結構修改,會嚴重影響線上使用,而且耗費時間很長;使用這個工具可以很好的線上修改表結構。 好處: 降低主從延時的風險 可以限速、限資源,避免操作時MySQL負載過高 建議: 在業務低峰期做,將影響降到最低 直接原表修改缺點: 當表的數據量很大的時候,如果直接 ...
在表數據量很大的時候直接添加欄位,以及其他表結構修改,會嚴重影響線上使用,而且耗費時間很長;使用這個工具可以很好的線上修改表結構。
好處:
降低主從延時的風險
可以限速、限資源,避免操作時MySQL負載過高
建議:
在業務低峰期做,將影響降到最低
直接原表修改缺點:
當表的數據量很大的時候,如果直接線上修改表結構,嚴重影響線上環境,而且耗時不可預估
註意:
需要確認表必須包含主鍵或者唯一索引
工具會創建觸發器,所以原表上不能有觸發器
有外鍵的表需要註意使用參數--alter-foreign-keys-method(現在業務上不建議表中外鍵關聯,建議在業務中控制)
原理:
- 首先它會新建一張一模一樣的表,表名一般是_new尾碼
- 然後在這個新表執行更改欄位操作
- 然後在原表上加三個觸發器,DELETE/UPDATE/INSERT,將原表中要執行的語句也在新表中執行
- 最後將原表的數據拷貝到新表中,然後替換掉原表
1.數據備份
無論操作多麼有把握,也要把備份做好(萬一很可怕)**
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目錄下執行,看是否正常,查看命令
./pt-online-schema-change --help
4.參數欄位及含義
參數 | 含義 |
---|---|
--user= | 連接用戶名 |
--password= | 連接密碼 |
--host= | 連接IP |
P= | 埠 |
--alter= | 執行表變更的語句 |
D= | database 庫名 |
t= | table 表名 |
--charset=utf8 | 使用utf8編碼,避免中文亂碼 |
--no-check-alter | 不檢查alter語句 |
列印操作日誌 | |
--execute | 執行修改表結構,真正的執行alter,–dry-run與–execute必須指定一個,二者相互排斥 |
–dry-run | 創建和修改新表,但不會創建觸發器、複製數據、和替換原表。並不真正執行,與--print配合查看執行細節 |
5.具體操作
- 添加一個欄位
如果執行失敗,檢查alter語句,如果確認無誤 可以避免檢查 --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.操作日誌
- 創建new結尾的新表
Creating new table...CREATE TABLE `h_pushcenter`.`_h_message_new` .....Created new table h_pushcenter._h_message_new OK.
- 新表執行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.
- 原表上創建3個觸發器
Creating triggers...
Event : DELETE
Event : UPDATE
Event : INSERTCreated triggers OK.
- 複製數據到新表
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.
- 刪除觸發器
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.
- 完成
傳送門:https://raokun.top/raokun/archives/mysql-da-biao-xiu-gai-gong-ju-pt-online-schame-change
鏈接:
mysql好用工具: pt-online-schame-change