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 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.操作的时候需要指定字符集 防止乱码。

参考

osc mysql_MySQL在线修改表结构pt-osc相关推荐

  1. gh ost mysql_mysql 在线修改表结构工具 gh-ost

    -allow-master-master 显式的允许在主主集群中运行-allow-on-master 允许直接运行在主机上,如果没有集群使用这个选项,推荐用在从机上-alter string(必须参数 ...

  2. mysql在线修改表结构大数据表的风险与解决办法归纳

    整理这篇文章的缘由: 互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需 ...

  3. mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题

    本帖最后由 jan_1985 于 2014-1-15 13:28 编辑 Mysql繁忙主从库在线修改表结构与添加索引问题 一直以来,生产情况下都有修改索引和修改字段的需求,但是对锁表引起的访问不便是会 ...

  4. pt-online-schema-change 在线修改表结构

    1. 参数 参数 默认值 说明 --host=xxx --user=xxx --password=xxx 连接实例信息,缩写-h xxx -u xxx -p xxx,密码可以使用参数--ask-pas ...

  5. OSC 在线更改表结构

    随着业务的发展,更改表结构变的越来越常见.一般情况下,我们通过alter table 之类的DDL语句就可以完成.然而当执行alter table 语句时,数据库会对整个实例加锁,阻塞业务的所有操作, ...

  6. percona-toolkit之pt-online-schema-change(在线更改表结构)

    传统方法修改表结构 类似alter table xx modify,在修改表结构时需要锁表,如果表很大,则操作时间会较长.目前,绝大多数业务要求24*7无间断服务,而此过程中,如果造成较长时间数据库无 ...

  7. mysql修改表结构大表_在线修改MySQL大表的表结构

    由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段.此表在设计之时完全按照需求实现,并没有多余的保留字段. 我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通 ...

  8. oracle 11g 通过在线重定义方式修改表结构

    今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为"0"的值进行抽取,抽取之后更新HAVE_FLAG为其他值, ...

  9. mysql 修改表结构方案_MySQL中修改表结构时需要注意的一些地方

    MySql 在修改表结构的时候可能会中断产品的正常运行影响用户体验,甚至更坏的结果,丢失数据.不是所有的数据库管理员.程序员.系统管理员都非常了解Mysql能避免这种情况.DBA会经常碰到这种生产中断 ...

最新文章

  1. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
  2. 设CPU中各部件及其相互连接关系如下图所示。图中W是写控制标志,R是读控制标志,R 1 和R 2 是暂存器
  3. 【转】error while loading shared libraries: xxx.so.x 错误的原因和解决办法
  4. Python 第三方模块之 numpy.random
  5. [复变函数]第19堂课 5.3 解析函数在无穷远处的性质
  6. Zookeeper-单机/集群安装
  7. html2json文档,插件 jQuery.json2html 中文 API 文档
  8. 创业基础(第三章:创业机会及其识别与评价) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  9. 卡方检验有哪些指标?卡方值怎么计算?
  10. 2013年国考行测错题集(省级)
  11. Java编写五线谱上的音符_在五线谱上怎么写音符
  12. 第三方Android应用商店也有安全问题
  13. 商业广告CPT-物料召回
  14. CSS样式、字体样式、基本选择器的基础笔记
  15. 计算机常用英语对话,英语口语对话之买电脑时常用基本口语
  16. html动态网页添加音频_将音频添加到网页
  17. HorizontalScrollView的基本使用,适合初学者
  18. STM32 DAC + DMA + TIM 输出正弦波,三角波,方波信号
  19. <textarea></textarea> placeholder属性不显示
  20. Java面试问题总结归纳

热门文章

  1. 基于 Amazon SageMaker 构建细粒度情感分析应用【附部署视频】
  2. HBase 在LinuxMac 下的安装和配置
  3. SSM团购网站(4):网站首页及公共技术点
  4. Smobiler飞书小程序开发指南
  5. 【Mybatis】批量插入的多种方式
  6. 项目进度管理:活动排序的四种依赖关系
  7. 网站设计中文字排版的技巧
  8. 利于网站内容优化的关键词布局方法
  9. 2006世界杯32强人体彩绘队服样式(波兰)
  10. h5支付不能打开支付宝 ios_iOS实现H5支付(微信、支付宝)原生封装