在生产环境下mysql执行 ddl为不影响线上正常使用,经常使用工具pt-online
安装pt-online
安装DBI
wget http://www.cpan.org/modules/by-module/DBD/DBI-1.634.tar.gztar -xf DBI-1.634.tar.gzcd DBI-1.634/ perl Makefile.PLmake && sudo make install
安装DB-MySQL
wget http://www.cpan.org/modules/by-module/DBD/DBD-mysql-4.027.tar.gz tar -xf DBD-mysql-4.027.tar.gz cd DBD-mysql-4.027/ perl Makefile.PL --mysql_config=/export/servers/mysql/bin/mysql_config --with-mysql=/export/servers/mysql make && sudo make install
安装percona-toolkit
wget https://www.percona.com/downloads/percona-toolkit/3.0.8/binary/tarball/percona-toolkit-3.0.8_x86_64.tar.gztar -xf percona-toolkit-3.0.8_x86_64.tar.gzcd percona-toolkit-3.0.8perl Makefile.PL make && sudo make install
简单使用pt-online工具
修改表的ddl语句
pt-online-schema-change --alter "add address varchar(255) not NULL default ''" D=test,t='test_type' --execute --print --statistics --no-check-alter --user root --password secret --host 127.0.0.1 --port 3358
pt-online 工具使用过程解析:
创建新表
CREATE TABLE `test`.`_test_type_new` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12970 DEFAULT CHARSET=utf8
新表增加列
ALTER TABLE `test`.`_test_type_new` add address varchar(255) not NULL default ''
对老表增加delete触发器
CREATE DEFINER=`root`@`%` TRIGGER `pt_osc_test_test_type_del` AFTER DELETE ON `test`.`test_type` FOR EACH ROW DELETE IGNORE FROM `test`.`_test_type_new` WHERE `test`.`_test_type_new`.`id` <=> OLD.`id`
对老表增加update触发器
CREATE DEFINER=`root`@`%` TRIGGER `pt_osc_test_test_type_upd` AFTER UPDATE ON `test`.`test_type` FOR EACH ROW BEGIN DELETE IGNORE FROM `test`.`_test_type_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test`.`_test_type_new`.`id` <=> OLD.`id`;REPLACE INTO `test`.`_test_type_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`);END
对老表增加insert触发器
CREATE DEFINER=`root`@`%` TRIGGER `pt_osc_test_test_type_ins` AFTER INSERT ON `test`.`test_type` FOR EACH ROW REPLACE INTO `test`.`_test_type_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)
analyze 新表
作用是分析关键字分布: 因为是批量写入数据,所以需要analyze 关键字
ANALYZE TABLE `test`.`_test_type_new` /* pt-online-schema-change *
rename 表
RENAME TABLE `test`.`test_type` TO `test`.`_test_type_old`, `test`.`_test_type_new` TO `test`.`test_type`
扫尾工作
## 删除老表 DROP TABLE IF EXISTS `_test_type_old` /* generated by server */## 删除触发器 DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test_type_del`DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test_type_upd`DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test_type_ins`
总结
以上就是pt-online 在线ddl 增加列原理