不停机不停服务,MYSQL可以这样修改亿级数据表结构

摘要:
摘要:本文阐述了MySQLDDL的问题现状、pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数据表结构。因为该表在生产环境下使用,影响到业务,需要及时修改这个字段长度,并且修改该表结构时不能停服务。

要:本文阐述了MySQL DDL的问题现状、pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数据表结构。

在一个软件生命周期中,我们都知道,前期的表结构设计是非常重要的因为当表数据量一上来后再进行表结构修改危险性比较大,而且要操作的时间也比较长。

在笔者参与的项目中,就曾遇到这样一个问题,首先上去查看了一下该表的信息,已有约2亿的数据量,而且每分钟还要并发写入4万条记录,而由于这个表有一个字段前期设计过短,导致写入到数据库后,这个字段的值就一直乱码。因为该表在生产环境下使用,影响到业务,需要及时修改这个字段长度,并且修改该表结构时不能停服务。那么如何解决这种问题呢?

一、MySQL DDL的问题现状

开始想了下,减少这个表的数据量再DDL,将这个表一周以前的数据备份到一个临时表,再删除这个表一周以前的数据。

而在MySQL中在对表进行ddl时,会锁表,当表比较小比如小于1w条记录时,操作时间较短,对前端影响较小,当时遇到千万乃至上亿级级别的表(保留一周的数据量还有1.6亿),就会影响前端应用对表的写操作。

因为目前InnoDB引擎是通过以下步骤来进行DDL的:

1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)

3 执行insert into tmp_table select * from original_table

4 rename original_table和tmp_table,最后drop original_table

5 释放 write lock。

我们可以看见在InnoDB执行DDL的时候,原表是只能读不能写的。为此 perconal 推出一个工具 pt-online-schema-change ,其特点是修改过程中不会造成读写阻塞

二、pt-online-schema-change介绍

【工具简介】

pt-osc模仿MySQL内部的改表方式进行改表,但整个改表过程是通过对原始表的拷贝来完成的,即在改表过程中原始表不会被锁定,并不影响对该表的读写操作。

首先,osc创建与原始表相同的不包含数据的新表并按照需求进行表结构的修改,然后将原始表中的数据按chunk大小逐步拷贝到新表中,当拷贝完成后,会自动同时修改原始表和新表的名字并默认将原始表删除

【工具安装及使用】

参见下面下面这篇文章

linuxpercona-toolkit工具包的安装和使用(超详细版)

【工作原理】

1 创建两个和你要执行 alter 操作的表结构一样的空表。如图:

说明:t_ad_req_log就是原表;

_t_ad_req_log_ol是旧表,这个表是用来当你执行失败的时候,还原回来的原表结构;

_t_ad_req_log_new是新表,这个表就是这次要修改的表。

不停机不停服务,MYSQL可以这样修改亿级数据表结构第1张

2 执行表结构修改,然后从原表中的数据到copy到 表结构修改后的表(即_t_ad_req_log_new)

3 在原表上创建触发器将 copy 数据的过程中,在原表的更新操作更新到新表.

注意:如果表中已经定义了触发器这个工具就不能工作了。

4 copy 完成以后,用renametable新表代替原表,默认删除原表。

修改的命令如下:

/usr/local/bin/pt-online-schema-change --user=用户名 --password=密码 --host=127.0.0.1 --port=端口号 --charset=utf8 --nodrop-old-table --alter="modify  media_code varchar(64) DEFAULT NULL COMMENT '当前视频编码' " D=ad_api,t=t_ad_req_log --exec

参数说明:

--user=用户名     指定用户名

--password=用户名     指定用户密码

--port=端口号     指定端口号

--charset=utf8   指定字符编码

--alter=    后面就是接需要修改的内容,比如上面表示的就是修改ad_api数据库t_ad_req_log表的media_code 字段长度为64位

下面请看一个完整的图:

不停机不停服务,MYSQL可以这样修改亿级数据表结构第2张

不停机不停服务,MYSQL可以这样修改亿级数据表结构第3张

注:如果对percona-toolkit工具安装及使用有疑问的先查看下这两篇文章。

linux下percona-toolkit工具包的安装和使用(超详细版)

pt-online-schema-change解读

免责声明:文章转载自《不停机不停服务,MYSQL可以这样修改亿级数据表结构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue开发环境搭建StringEscapeUtils的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于使用navicat将mdb文件导入mysql数据库

公司最近下发了任务,要把gdb,sde,mdb格式的数据文件统一放入mysql数据库中,作为后台数据库,支持地理信息开发平台。首先来研究mdb格式的文件。.mdb格式的文件,一般都是office access来编写的,虽然2010之后,access所保存出的默认数据库的格式都是.accdb,不过不影响我们的正常使用,就把它当成.mdb文件实用就行。好了,闲...

【指导】SonarQube 部署说明

转载:https://blog.csdn.net/cuiaamay/article/details/52057091 1,安装 1.1 安装依赖 需要保证Oracle JRE 8 及以上,或者 OpenJDK 8及以上(如下安装 openjdk): # add-apt-repository ppa:openjdk-r/ppa # apt-get upd...

mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)错误解决办法

我的电脑是win10,所用的是mysql5.7.14 近期在学习mysql数据库的时候,遇到了这个错误,我的密码错误了。突如其来的问题,很是蒙蔽,因为我没对数据库设置过密码。通过网上查询,可以通过进入mysql命令行的方式,来直接修改数据库的密码。具体步骤如下: 在mysql数据库的my.ini文件中找到mysqld这一项: 用记事本打开,找到mysql...

MySQL开发设计规范

1.库命名规则:dbname_suffix,分为_dev/_test/_pre/_mertest/_perf/_prod六个环境 2.适度反范式设计,冗余表字段数据减少JOIN关联提高访问效率 3.普通索引命名:idx_字段名,联合索引命名:idx_字段名1_字段名2…,唯一索引命名:uq_字段名 4.表和字段必须加上(中文)注释 5.存储时间类型date...

linux安装mysql5.7及相关环境配置

安装mysql5.7以及相关环境配置 检查是否自带mysql和mariadb,并卸载 rpm -qa|grep mysql //rpm -e --nodeps mysql-libs-5.1.52-1.el6_0.1.x86_64 [root@localhost ~]# rpm -qa|grep mariadb mariadb-libs-5.5.60-...

mysql表碎片清理和表空间收缩

一、表碎片清理 存储结构分析 MySQL5.5默认是共享表空间 ,5.6中默认是独立表空间(表空间管理类型就这2种) 独立表空间 就是采用和MyISAM 相同的方式, 每个表拥有一个独立的数据文件( .idb )1.每个表都有自已独立的表空间。 2.每个表的数据和索引都会存在自已的表空间中。 3.可以实现单表在不同的数据库中移动(将一个库的表移动到另一个库...