MySQL在线修改表结构pt-oschtml
重所周知 MySQL的DDL操做操做是相比比较昂贵的。由于MySQL在修改表期间会阻塞任何读写操做。node
基本上业务处于瘫痪。若是数据量较大可能须要好几个小时才能完成,没法容忍这个操做。Percona开发了一系列的工具 Percona Toolkit包,其中有一个工具pt-online-schema-change能够在线执行DDL操做,不会阻塞读写操做从而影响业务程序。固然也有其余的工具 例如 MySQL5.6的online ddl 还有gh-ost 本文主要讲pt-online-schema-change在线修改表结构。sql
原理部分session
环境概述 less
Percona-Server-5.7.17-11 Percona-toolkit-3.0.3-1.el7.x86_64
表结构ide
CREATE TABLE `test` ( `id` int(40) NOT NULL, `name` char(12) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
操做修改非主键 name字段工具
一。准备工做测试
设置当前回话参数 session级别spa
SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'; SET SESSION innodb_lock_wait_timeout=1 SET SESSION lock_wait_timeout=60 SET SESSION wait_timeout=10000 innodb_lock_wait_timeout=1 lock_wait_timeout=60 wait_timeout=10000
2.收集MySQL信息orm
SHOW VARIABLES LIKE 'version%' SHOW ENGINES SHOW VARIABLES LIKE 'innodb_version' SHOW VARIABLES LIKE 'innodb_stats_persistent' SELECT @@SERVER_ID SHOW GRANTS FOR CURRENT_USER() SHOW FULL PROCESSLIST SHOW GLOBAL STATUS LIKE 'Threads_running' SHOW GLOBAL STATUS LIKE 'Threads_running' SELECT CONCAT(@@hostname, @@port) SHOW TABLES FROM `test2` LIKE 'test1' SHOW TRIGGERS FROM `test2` LIKE 'test1'
二 正式开始
1.建立跟旧表如出一辙的新表
CREATE TABLE `test2`.`_test1_new` ( `id` int(30) NOT NULL, `name` char(27) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
2.在新表上修改表结构
ALTER TABLE `test2`.`_test1_new` modify name char(27)
3.建立触发器
CREATE TRIGGER `pt_osc_test2_test1_del` AFTER DELETE ON `test2`.`test1` FOR EACH ROW DELETE IGNORE FROM `test2`.`_test1_new` WHERE `test2`.`_test1_new`.`id` <=> OLD.`id`
#删除操做
CREATE TRIGGER `pt_osc_test2_test1_upd` AFTER UPDATE ON `test2`.`test1` FOR EACH ROW BEGIN DELETE IGNORE FROM `test2`.`_test1_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test2`.`_test1_new`.`id` <=> OLD.`id`;REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)
#更新操做
CREATE TRIGGER `pt_osc_test2_test1_ins` AFTER INSERT ON `test2`.`test1` FOR EACH ROW REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)
#插入操做
4.插入到旧表
EXPLAIN SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE
IGNORE INTO `test2`.`_test1_new` (`id`, `name`) SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE /*pt-online-schema-change 6291 copy table*/
#有锁操做LOCK IN SHARE MODE
三 收尾工做
SHOW WARNINGS SELECT @@SERVER_ID SHOW GRANTS FOR CURRENT_USER() SHOW FULL PROCESSLIST SHOW GLOBAL STATUS LIKE 'Threads_running' ANALYZE TABLE `test2`.`_test1_new` /* pt-online-schema-change */ RENAME TABLE `test2`.`test1` TO `test2`.`_test1_old`, `test2`.`_test1_new` TO `test2`.`test1` DROP TABLE IF EXISTS `test2`.`_test1_old` ROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_del` DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_upd` DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_ins` SHOW TABLES FROM `test2` LIKE '\_test1\_new'
概述
查看收集MySQL信息
建立一个和原表表结构同样的new表 而后在new表中更改表结构。
在原表建立3个触发器 三个触发器分别对应 insert update delete 操做
从原表拷贝数据到new表 拷贝过程当中原表进行的写操做都会更新到临时表
copy完成后rename 原表为old表 接着将new表rename原表 最后删除old表和触发器
四 操做注意事项
Read the tool’s documentation
Review the tool’s known “BUGS”
Test the tool on a non-production server
Backup your production server and verify the backups
总结 先看一遍工具文档,用以前先作测试,备份 备份 备份。在执行在线修改表结构的时候,最好选择业务低峰期,不要把old表删掉。
五 pt-osc限制
In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is present in the table. See --alter for details.
The tool refuses to operate if it detects replication filters. See --[no]check-replication-filters for details.
The tool pauses the data copy operation if it observes any replicas that are delayed in replication. See --max-lagfor details.
The tool pauses or aborts its operation if it detects too much load on the server. See --max-load and --critical-load for details.
The tool sets innodb_lock_wait_timeout=1 and (for MySQL 5.5 and newer) lock_wait_timeout=60 so that it is more likely to be the victim of any lock contention, and less likely to disrupt other transactions. These values can be changed by specifying --set-vars.
The tool refuses to alter the table if foreign key constraints reference it, unless you specify --alter-foreign-keys-method.
The tool cannot alter MyISAM tables on “Percona XtraDB Cluster” nodes.
六 注意事项
1.先看一遍工具文档,用以前先作测试,备份 备份 备份。
2.在执行在线修改表结构的时候,最好选择业务低峰期,不要把old表删掉。
3.必须有主键,没法使用,必须有主键,必须有主键,必须有主键,必须有主键。
4.pt-osc若是改变外键约束,拒绝工做,除非指定--alter-foreign-keys-method。
5.操做的时候须要指定字符集 防止乱码。
参考
https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html