登录  /  注册
博主信息
博文 38
粉丝 0
评论 0
访问量 24577
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
一个 MySQL 在线 DDL 工具 — pt-online-schema-change
P粉701620330
原创
1019人浏览过

在运维线上MySQL数据库时,我们总会对数据表进行 DDL 变更,修改添加字段或者索引。在对表进行 DDL 时,会锁表,当表比较小比如小于1w上时,对前端影响较小,当时遇到千万级别的表就会影响前端应用对表的写操作。

pt-online-schema-change 是 percona 公司开发的一个工具,在percona-toolkit包里面可以找到这个功能,它是一个在线DDL工具,可以实现在线数据表 DDL 操作。

使用方法

比如需要运行 SQL 的 DDL 语句

实例

ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status

可以通过如下命令进行

实例

nohup pt-online-schema-change \
	--charset=utf8 \
	--no-version-check \
	--user="数据库用户" \
	--password="数据库密码" \
	--host="数据库地址" \
	P=3306,D="数据库",t="数据表" \
	--alter "ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status" \
	--execute &

参数说明

实例

--user=        连接mysql的用户名
--password=    连接mysql的密码
--host=        连接mysql的地址
P=3306         连接mysql的端口号
D=             连接mysql的库名
t=             连接mysql的表名
--alter        修改表结构的语句
--execute      执行修改表结构
--charset=utf8 使用utf8编码,避免中文乱码
--no-version-check  不检查版本,在阿里云服务器中一般加入此参数,否则会报错

工作过程

创建一个和要执行 alter 操作的表一样的新的空表结构(是 alter 之前的结构)

在新表执行 alter table 语句(速度应该很快)

在原表中创建触发器 3 个触发器分别对应 insert, update, delete 操作

以一定块大小从原表拷贝数据到临时表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的临时表

Rename 原表到 old 表中,在把临时表 Rename 为原表

如果有参考该表的外键,根据 alter-foreign-keys-method 参数的值,检测外键相关的表,做相应设置的处理

默认最后将旧原表删除

安装方法

仅供参考(CentOS 7 验证)

实例

sudo yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey.x86_64
sudo rpm -ivh percona-toolkit-3.1.0-2.el7.x86_64.rpm

参考资料

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


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学