设为首页 收藏本站
查看: 656|回复: 0

[经验分享] MySQL在线修改表结构pt-osc

[复制链接]

尚未签到

发表于 2018-10-9 07:10:29 | 显示全部楼层 |阅读模式
  MySQL在线修改表结构pt-osc
  重所周知 MySQL的DDL操作操作是相比比较昂贵的。因为MySQL在修改表期间会阻塞任何读写操作。
  基本上业务处于瘫痪。如果数据量较大可能需要好几个小时才能完成,无法容忍这个操作。Percona开发了一系列的工具 Percona Toolkit包,其中有一个工具pt-online-schema-change可以在线执行DDL操作,不会阻塞读写操作从而影响业务程序。当然也有其他的工具 例如 MySQL5.6的online ddl 还有gh-ost 本文主要讲pt-online-schema-change在线修改表结构。
  原理部分
  环境概述
Percona-Server-5.7.17-11  
Percona-toolkit-3.0.3-1.el7.x86_64
  表结构
CREATE TABLE `test` (  
  `id` int(40) NOT NULL,
  
  `name` char(12) DEFAULT NULL,
  
  PRIMARY KEY (`id`)
  
) ENGINE=MyISAM DEFAULT CHARSET=utf8
  操作修改非主键 name字段
  一。准备工作

  •   设置当前回话参数 session级别
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信息
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>

  •   The tool cannot>
  六 注意事项
  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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-618273-1-1.html 上篇帖子: mysql之mariadb 基本操作 下篇帖子: 3.使用navicat连接mysql数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表