在表資料量很大的時候直接添加欄位,以及其他表結構修改,會嚴重影響線上使用,而且耗費時間很長;使用這個工具可以很好的在線修改表結構,
好處:
降低主從延時的風險
可以限速、限資源,避免操作時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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/541986.html
標籤:其他
