使用场景: 在线修改大数据量表结构(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. 提高Python的性能

    01 使用哈希表的数据结构   如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环.举例如下: items = ['a', 'b',..,'100m'] #1000s of ...

  2. jQuery核心函数和静态方法

    jQuery核心函数 从jQuery文档中可以看出,jQuery核心函数一共3大类4小类 jQuery(callback) 当DOM加载完成后执行传入的回调函数 <script> $(fu ...

  3. Python基础(八):字符串的使用(下)

    find() 功能:检测字符串是否包含指定字符.如果包含指定字符,则返回开始的索引:否则,返回-1. >>> st = "hello world" >> ...

  4. UnitTwoSummary

    目录 一.设计策略与程序分析 第一次作业 第二次作业 第三次作业 二.可扩展性检查与分析 三.bug 四.总结与反思 一.设计策略与程序分析 第一次作业 设计思路 输入,调度器,电梯分别设置成三个线程 ...

  5. Java后端进阶-JVM参数调优

    package com.study.performance; import org.springframework.boot.SpringApplication; import org.springf ...

  6. LinearDiscriminantAnalysis参数、属性和方法

    [LDA]线性判别分析 参数: solver:一个字符串,指定了求解最优化问题的算法,可以为如下的值. 'svd':奇异值分解.对于有大规模特征的数据,推荐用这种算法. 'lsqr':最小平方差,可以 ...

  7. B - 真·签到题 FZU - 2214(背包)

    Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the item ...

  8. 01- QTP快速入门

    QTP概述 QTP安装流程

  9. 03- HTML基本结构

    初始HTML HTML(英文Hyper Text Markup Language的缩写)中文译为"超文本标签语言",主要是通过HTML标签对网页中的文本.图片.声音等内容进行描述. ...

  10. JavaScript动态设置div的样式的方法

    有时候需要根据需要动态设置div的样式,当然对于稍有经验的javascript开发者来说,这一切都是那么的简单,但是对于初学者或者说没有相关经验的开发者来说可能就是一个不大不小的难关,下面就通过实例简 ...