使用场景: 在线修改大数据量表结构(ALTER tables without locking them)

文档参考:https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

好处:

降低主从延时的风险

可以限速、限资源,避免操作时MySQL负载过高

建议:

在业务低峰期做,将影响降到最低

直接原表修改缺点:

当表的数据量很大的时候,如果直接在线修改表结构,严重影响线上环境,而且耗时不可预估

注意:

需要确认表必须包含主键或者唯一索引

工具会创建触发器,所以原表上不能有触发器

有外键的表需要注意使用参数--alter-foreign-keys-method(现在业务上不建议表中外键关联,建议在业务中控制)

原理:

  • 首先它会新建一张一模一样的表,表名一般是_new后缀

  • 然后在这个新表执行更改字段操作

  • 然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行

  • 最后将原表的数据拷贝到新表中,然后替换掉原表

0. 备份数据(先做)

1. 安装

下载安装包:

wget https://downloads.percona.com/downloads/percona-toolkit/3.3.1/source/tarball/percona-toolkit-3.3.1.tar.gz

解压

tar -xvf percona-toolkit-3.3.1.tar.gz

安装一些依赖包

yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL
yum -y install perl-Digest-MD5

2. 测试

在解压包的bin目录下执行,看是否正常,查看命令

./pt-online-schema-change --help

3. 字段

参数 含义
--user= 连接用户名
--password= 连接密码
--host= 连接IP
P= 端口
--alter= 执行表变更的语句
D= database 库名
t= table 表名
--charset=utf8 使用utf8编码,避免中文乱码
--no-check-alter 不检查alter语句
--print 打印操作日志
--execute 执行修改表结构,真正的执行alter,–dry-run与–execute必须指定一个,二者相互排斥
–dry-run 创建和修改新表,但不会创建触发器、复制数据、和替换原表。并不真正执行,与--print配合查看执行细节

4. 操作

添加一个字段

如果执行失败,检查alter语句,如果确认无误 可以避免检查 --no-check-alter

./pt-online-schema-change --user=root --password=root  --host=xxx.xx.xx.xxx  --alter "add column  group_id bigint(20) not NULL default '0'  comment 'test' " P=30306,D=h_pushcenter,t=hi_message  --charset=utf8 --no-version-check --print --execute

修改字段

sql语句

ALTER TABLE `hi_message` MODIFY COLUMN `group_id` int(20)  NOT NULL DEFAULT '1';

pt工具

--alter "MODIFY COLUMN group_id int(20)  NOT NULL DEFAULT '1'"

修改字段名

sql语句

ALTER TABLE `hi_message` CHANGE column group_id group_id_0 bigint(20);

pt工具

--alter "CHANGE group_id group_id_0 bigint(20)"

添加索引

sql语句

ALTER TABLE `hi_message` ADD INDEX hi_message_n1(group_id);

pt工具

--alter "ADD INDEX hi_message_n1(group_id)"

5.操作日志

  • 创建new结尾的新表
Creating new table...

CREATE TABLE `h_pushcenter`.`_hi_message_new` .....

Created new table h_pushcenter._hi_message_new OK.
  • 新表执行alter操作
Altering new table...

ALTER TABLE `h_pushcenter`.`_hi_message_new` add column  group_id bigint(20) not NULL default '0'  comment 'test' 

Altered `h_pushcenter`.`_hi_message_new` OK.
  • 原表上创建3个触发器
 Creating triggers...

 Event : DELETE 

 Event : UPDATE 

 Event : INSERT
Created triggers OK.
  • 复制数据到新表
 Copying approximately 8187 rows...

 Copied rows OK.
  • 重命名新旧两个表,然后替换,删除旧表
2021-05-19T10:33:08 Swapping tables...
RENAME TABLE `h_pushcenter`.`hi_message` TO `h_pushcenter`.`_hi_message_old`, `h_pushcenter`.`_hi_message_new` TO `h_pushcenter`.`hi_message`
2021-05-19T10:33:09 Swapped original and new tables OK.
2021-05-19T10:33:09 Dropping old table...
DROP TABLE IF EXISTS `h_pushcenter`.`_hi_message_old`
2021-05-19T10:33:09 Dropped old table `h_pushcenter`.`_hi_message_old` OK.
  • 删除触发器
2021-05-19T10:33:09 Dropping triggers...
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_hi_message_del`
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_hi_message_upd`
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_hi_message_ins`
2021-05-19T10:33:09 Dropped triggers OK.
  • 完成

pt-online-schema-change 大数据表结构修改的更多相关文章

  1. 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率

    我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据: 我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目 ...

  2. Oracle大数据表的分表处理

    1.首先给大数据表创建rownum序列号 --增加序列号字段 alter table TEST add xlh number; --填充序列号 update TEST set xlh = rownum ...

  3. 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表

    转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...

  4. mysql大数据表改表结构方案

    有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...

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

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

  6. Mysql 提升大数据表的拷贝效率

    工作上会经常遇到量级比较大的数据表  :场景: 该数据表需要进行alter操作 比如增加一个字段,减少一个字段. 这个在一个几万级别数据量的数据表可以直接进行alter表操作,但是要在一个接近1000 ...

  7. Mysql大数据表优化处理

    原文链接: https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表 ...

  8. 制作mysql大数据表验证覆盖索引

    昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计.找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引就能实现sum的需求,而无须去读取实际行 ...

  9. mysql大数据表优化

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

随机推荐

  1. 使用docker搭建sonarqube

    sonarqube是一款代码质量检查工具,使用sonar扫描我们写过的代码,可以有助于检查出代码的bug.规范性和健壮性,有助于提高我们的代码质量. 一.安装docker 安装完成之后,命令行输入 d ...

  2. Oauth2协议那些事

    1. 背景 首先,设想一种情境:你平常会使用一款照片存储App(以下照片服务指代),用来将自己喜欢的照片存放在上面以备随时查看.假如有一天,你想要打印其中的某张照片而且你找到了一款打印照片App(以下 ...

  3. MyBatis-Plus Generator自定义模板

    相信大家在开发过程中,应该都用过Mybatis-Plus的Generator,但是可能没有自定义过模板并使用. 每个项目都应该有一个从Controller层到Mapper层的通用模板,来去掉哪些简单的 ...

  4. PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...

  5. 【秒懂音视频开发】14_AAC编码

    AAC(Advanced Audio Coding,译为:高级音频编码),是由Fraunhofer IIS.杜比实验室.AT&T.Sony.Nokia等公司共同开发的有损音频编码和文件格式. ...

  6. Linux 网络工具中的瑞士军刀 - socat & netcat

    独立博客阅读:https://ryan4yin.space/posts/socat-netcat/ 文中的命令均在 macOS Big Sur 和 Opensuse Tumbleweed 上测试通过 ...

  7. Flowable与springBoot项目整合及出现的问题

    Flowable与springBoot项目整合及出现的问题 单纯地将Flowable和springBoot整合,使用mysql作为数据库,整合中踩了两个坑,见文末. 在pom中添加依赖 <?xm ...

  8. Printer Queue UVA - 12100

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  9. JAVAEE_Servlet_24_HttpSession实现原理

    关于JavaWeb中的HttpSession (一) * Session表示会话,不止存在于JavaWeb之中,只要是Web开发都会存在这种机制 * Session包:javax.servlet.ht ...

  10. 数据结构之LinkedList | 让我们一块来学习数据结构

    highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...