pt-online-schema-change 大数据表结构修改
使用场景: 在线修改大数据量表结构(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. 安装
下载安装包:
解压
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语句 |
打印操作日志 | |
--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 大数据表结构修改的更多相关文章
- 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率
我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据: 我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目 ...
- Oracle大数据表的分表处理
1.首先给大数据表创建rownum序列号 --增加序列号字段 alter table TEST add xlh number; --填充序列号 update TEST set xlh = rownum ...
- 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表
转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...
- mysql大数据表改表结构方案
有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...
- mysql在线修改表结构大数据表的风险与解决办法归纳
整理这篇文章的缘由: 互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需 ...
- Mysql 提升大数据表的拷贝效率
工作上会经常遇到量级比较大的数据表 :场景: 该数据表需要进行alter操作 比如增加一个字段,减少一个字段. 这个在一个几万级别数据量的数据表可以直接进行alter表操作,但是要在一个接近1000 ...
- Mysql大数据表优化处理
原文链接: https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表 ...
- 制作mysql大数据表验证覆盖索引
昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计.找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引就能实现sum的需求,而无须去读取实际行 ...
- mysql大数据表优化
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
随机推荐
- 使用docker搭建sonarqube
sonarqube是一款代码质量检查工具,使用sonar扫描我们写过的代码,可以有助于检查出代码的bug.规范性和健壮性,有助于提高我们的代码质量. 一.安装docker 安装完成之后,命令行输入 d ...
- Oauth2协议那些事
1. 背景 首先,设想一种情境:你平常会使用一款照片存储App(以下照片服务指代),用来将自己喜欢的照片存放在上面以备随时查看.假如有一天,你想要打印其中的某张照片而且你找到了一款打印照片App(以下 ...
- MyBatis-Plus Generator自定义模板
相信大家在开发过程中,应该都用过Mybatis-Plus的Generator,但是可能没有自定义过模板并使用. 每个项目都应该有一个从Controller层到Mapper层的通用模板,来去掉哪些简单的 ...
- 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) ...
- 【秒懂音视频开发】14_AAC编码
AAC(Advanced Audio Coding,译为:高级音频编码),是由Fraunhofer IIS.杜比实验室.AT&T.Sony.Nokia等公司共同开发的有损音频编码和文件格式. ...
- Linux 网络工具中的瑞士军刀 - socat & netcat
独立博客阅读:https://ryan4yin.space/posts/socat-netcat/ 文中的命令均在 macOS Big Sur 和 Opensuse Tumbleweed 上测试通过 ...
- Flowable与springBoot项目整合及出现的问题
Flowable与springBoot项目整合及出现的问题 单纯地将Flowable和springBoot整合,使用mysql作为数据库,整合中踩了两个坑,见文末. 在pom中添加依赖 <?xm ...
- Printer Queue UVA - 12100
The only printer in the computer science students' union is experiencing an extremely heavy workload ...
- JAVAEE_Servlet_24_HttpSession实现原理
关于JavaWeb中的HttpSession (一) * Session表示会话,不止存在于JavaWeb之中,只要是Web开发都会存在这种机制 * Session包:javax.servlet.ht ...
- 数据结构之LinkedList | 让我们一块来学习数据结构
highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...