使用场景: 在线修改大数据量表结构(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. TCP/IP协议的经典面试知识点总结

    前言 大家好啊,我是汤小圆. 今天给大家推荐的是,TCP/IP协议的经典面试知识点总结,希望对大家有帮助,谢谢. 简介 我们平时经常听到的TCP/IP协议,其实是一个协议族: 只不过因为TCP.IP是 ...

  2. OpenCV图像处理中的“机器学习"技术的使用

    注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景        相比较当下发展迅速的各路"端到端" ...

  3. SqlServer存储过程的创建与使用

    什么是存储过程? T-SQL中的存储过程,非常类似于net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句. 这样就可以提高存储过程的性能. ...

  4. OkHttp配置HTTPS访问+服务器部署

    1 概述 OkHttp配置HTTPS访问,核心为以下三个部分: sslSocketFactory() HostnameVerifier X509TrustManager 第一个是ssl套接字工厂,第二 ...

  5. 031- 控制语句switch

    语法 switch(表达式){ case 值1: java语句; break; case 值2: java语句; break; case 值3: java语句; break; default: jav ...

  6. 去css 冗余方法

    1.float在某种意义上而言与display:inline-block属性的作用是一模一样的, 所以类似于display:block; float:left; 就是说.float:left 可以让行 ...

  7. Android Linker 与 SO 加壳技术

    1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...

  8. hdu4411 经典费用里建图

    题意:       给以一个无向图,0 - n,警察在0,他们有k个警队,要派一些警队去1--n个城市抓小偷, 问所有吧所有小偷全抓到然后在返回0的最小路径和是多少,当地i个城市被攻击的时候他会通知i ...

  9. Python脚本自动化破解大白鲨摄像头(Shodan)

    关于本文的技术知识点,Shodan模块的用法,传送门-->  Python中shadon模块的使用    Shodan的使用 今天我们要利用python进行自动化破解的摄像头叫大白鲨摄像头,他的 ...

  10. Win64 驱动内核编程-5.内核里操作文件

    内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...