传统方法修改表结构 类似alter table xx modify,在修改表结构时需要锁表,如果表很大,则操作时间会较长。目前,绝大多数业务要求24*7无间断服务,而此过程中,如果造成较长时间数据库无法更新,则会严重影响业务。最近了解到两种可行的方案:1.替换表结构方法,2.采用percona在线修改表结构工具

模拟场景说明:

mysql5.6.25(mysql5.6相对于mysql5.5已经改进很多了,在mysql5.6中参考了percona-toolkit,增加删除索引不会锁表,同一个session里面,增删查改也不受影响,但是不同session是会受影响的。)

在线修改表结构肯定会对实时任务有所影响,作为DBA,最应该做的就是将影响尽可能降低。下面来做个简单的测试。

表test1,结构如下:主要三个字段(主键id,name,age)

CREATE TABLE `test1` (

`id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

将表中插入100万条数据

mysqlslap -uroot  --number-of-queries=1000000 -c 20 --query="insert into test.test1(name,age) values('fds',21)" --create-schema='test'

实验开始

mysql> select count(*) from test1;
+----------+
| count(*) |
+----------+
|  1000002 |
+----------+

(之前自己插了两条数据的哈)

1.替换表结构方法

给个简单的修改表属性例子

步骤:

①创建一个类似的tmp表,修改对应列属性

②修改表结构必须锁表,执行flush table with readlock

③用临时表结构文件覆盖原来表结构文件,然后释放表所,unlocktables

④插入发现依旧有问题,那是因为没刷新表,flush tables

⑤显示修改后表结构

⑥插入数据无异常

注意:必须是innodb表,myisam的不行哦;改操作对varchar型有效,对其他类型是否有效不一定哦。例如:decimal

优点是:只有在copy表结构的时候需要锁表

2.采用percona工具处理

执行修改表的语句

mysql> alter table test1 add column nickname varchar(10) default '';
Query OK, 0 rows affected (12.33 sec)
Records: 0  Duplicates: 0  Warnings: 0

可以看到操作时间还是有点长的,毕竟我只有100万数据,而且表结构简单。对于percona工具,优点在哪呢,可以先看下操作的流程如下图所示:


可以看出来,在其操作过程中是有创建临时表的,看这个处理时间并不优于之前的,但请看下面:

pt-online-schema-change alters a table’s structure without blocking reads or writes. Specify the database and table in the DSN. Do not use this tool before reading its documentation and checking your backups carefully.

再给个实验结果:

实验步骤

1.采用两种方式修改表属性:直接修改和用percona工具修改

2.在修改表属性的同时,开另外一个session往表里面插入数据

结果如下:

直接修改

session1:

mysql> alter table test1 modify column nickname varchar(15);
Query OK, 1000002 rows affected (5.98 sec)
Records: 1000002  Duplicates: 0  Warnings: 0

session2:

mysql> insert into test1(name,age,nickname) values('fds',21,'fds');

Query OK, 1 row affected (4.47 sec)

工具修改:

session1:

vagrant@testda:~$ pt-online-schema-change --alter="modify column nickname varchar(20) default ''" --user=root D=test,t=test1 --execute
Cannot connect to D=test,h=testdp,u=root
No slaves found.  See --recursion-method if host testda has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`test1`...
Creating new table...
Created new table test._test1_new OK.
Altering new table...
Altered `test`.`_test1_new` OK.
2015-10-15T02:46:50 Creating triggers...
2015-10-15T02:46:50 Created triggers OK.
2015-10-15T02:46:50 Copying approximately 998585 rows...
2015-10-15T02:47:04 Copied rows OK.
2015-10-15T02:47:04 Swapping tables...
2015-10-15T02:47:04 Swapped original and new tables OK.
2015-10-15T02:47:04 Dropping old table...
2015-10-15T02:47:04 Dropped old table `test`.`_test1_old` OK.
2015-10-15T02:47:04 Dropping triggers...
2015-10-15T02:47:04 Dropped triggers OK.
Successfully altered `test`.`test1`.

session2:

insert into test1(name,age,nickname) values('fds',21,'fds');
Query OK, 1 row affected, 1 warning (0.32 sec)

可以看出使用工具修改过程中数据插入并未被阻塞,而直接修改因为锁表了,所以插入操作遇到阻塞

具体可以参考下:https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

注意:从上面说明来看,该工具很好,但也并不是没有缺点,①如果修改的表没有主键,则会报错②该操作会创建临时表,如果存在主从复制,而且设定的主从复制表,那么会导致从库同步失败,原因是没有同步临时表③如果字段为not null,但没给default值,也会报错④改工具不是mysql官方工具,所以操作时建议备份,避免意外

percona-toolkit之pt-online-schema-change(在线更改表结构)相关推荐

  1. OSC 在线更改表结构

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

  2. osc mysql_MySQL在线修改表结构pt-osc

    MySQL在线修改表结构pt-osc 重所周知 MySQL的DDL操作操作是相比比较昂贵的.因为MySQL在修改表期间会阻塞任何读写操作. 基本上业务处于瘫痪.如果数据量较大可能需要好几个小时才能完成 ...

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

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

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

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

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

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

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

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

  7. GitHub 开源的 MySQL 在线更改 Schema 工具【转】

    本文来自:https://segmentfault.com/a/1190000006158503 原文:gh-ost: GitHub's online schema migration tool fo ...

  8. mysql 工具_最全Mysql运维工具Percona Toolkit使用案例

    Percona Toolkit简介 Percona Toolkit简称pt工具,是Percona公司开发用于管理MySQL的工具,DBA熟悉掌握后将极大提高工作效率. Percona toolkit有 ...

  9. Percona Toolkit安装

    TIPS 本文基于Percona Toolkit 3.2.0,理论支持所有版本. Percona Toolkit是一款MySQL世界里面非常实用的工具套件,本文来探讨如何安装它. 工具列表 pt-al ...

最新文章

  1. 获取SQLServer数据库中所有表
  2. Gaussian Filter
  3. 起风了2019-12-26
  4. 「SVN」Linux下svn使用命令
  5. GetLastInputInfo 判断离开状态
  6. Oracle查询所有序列
  7. 飞秋官方下载 某些大型企业
  8. Redis的三个框架:Jedis,Redisson,Lettuce
  9. 没有MsVCp140如何安装MysQl,win10中msvcp140.dll文件如何安装_win10电脑缺少msvcp140.dll文件的安装教程...
  10. 微信对网络影响的技术试验及分析(论文全文)
  11. 中国农业银行K宝证书怎么在中国农业银行APP上下载更新K宝证书?
  12. vivo手机要用计算机隐藏游戏图标,vivo手机怎么隐藏桌面应用图标
  13. Omni研究系列【USDT raw transaction】
  14. 熊猫人表情包python 代码_用Python爬取斗图网表情包
  15. 夺命十三枪枪谱完整版
  16. 数据分析常用方法和工具
  17. MLY -- 14.Evaluating multiple ideas in parallel during error analysis
  18. 这三款小巧好用的APP,请务必收下
  19. 以空间换时间——动态规划算法及其应用:矩阵链相乘
  20. might和could的区别用法_情态动词could,would,might等的用法区别

热门文章

  1. 【无标题】CINTA第五次作业 同构
  2. 蓝桥杯 笔记整理【JavaB组省赛真题、约数、全排列模板、排列组合、等差等比求和公式、eclipse快捷键、集合、快速求a^n、进制转换(Integer、BigInteger)、动态数组Vector】
  3. wps文字退格会删掉文字_wps文档中第一行字后面有很多空格,可是第二行就是上不来,按删除键就会把第一行字删了,为什么...
  4. Biome-BGC生态系统模型区域模拟
  5. Codeforces Round #538 (Div. 2)
  6. Xilinx软件开发:FreeRTOS快速入门
  7. C++三阶矩阵求逆矩阵
  8. 【解决方案】AI视频智能分析安防监控平台EasyCVR在汽车销售门店/4s店的实际应用
  9. Bentley Systems 收购 Plaxis 以及为业务提供补充的 SoilVision,将岩土工程整合到基础设施项目的数字化工作流中
  10. 洛谷 P2336 [SCOI2012]喵星球上的点名