我们在运维MySQL数据库的时候,时常会对数据表进行DDL操作,比如修改字段、添加索引等。对于MySQL,DDL操作时会锁表。如果表比较小,比如小于1w时,影响还是比较小的。当遇到千万级别的表,就会影响对表的读写操作了,甚至导致整个数据库发生异常,服务崩溃!
如何在Mysql运维的道路上稳步前行,有效化解潜在风险,确保数据库系统的稳定与高效呢?让我们一起了解几个常见的工具的原理和实践步骤吧。
以下是一些常见的问题案例:
MySQL 千万级表因为上述相关的一些问题,需要进行 DDL 操作时,由于其锁表特性可能引发诸多严重问题:
通过创建表的空副本来进行更改,在原表上创建触发器,将原表中的行复制到新表中,复制完成后,用新表替换原表。在复制期间,原表上的更新操作会通过触发器同步到新表,保证数据的一致性。
/root/ 目录cd /root/# For Debian or Ubuntu:
sudo apt-get install percona-toolkit
# For RHEL or CentOS:
sudo yum install percona-toolkit
# Alternative Install Methods
# You can also download the packages # from the Percona web site and install it using tools like dpkg and rpm
wget https://www.percona.com/downloads/percona-toolkit/-3.6.1/tarball/percona-toolkit--3.6.1.tar.gz
- 解压下载的文件:
tar -zxvf percona-toolkit-3.6.1.tar.gz
- 检查配置、编译并安装:
perl Makefile.PL
make
make install
- 将相关工具加入环境变量:
cd./percona-toolkit-3.6.1/bin/ cp * /usr/bin/employees 的表添加一个名为 email 的 VARCHAR (255) 类型且唯一约束的字段,执行命令:pt-online-schema-change --alter "ADD COLUMN email VARCHAR(255) COMMENT '邮箱'" D=your_database,t=employees,A=utf8 --execute
# 其中,`--alter` 后面指定要进行的 DDL 变更语句,
`D` 表示数据库名,`t` 表示表名,`A` 表示字符集
`--execute` 表示执行操作。若不想直接执行,可先使用 `--dry-run` 查看操作计划。采用消费 binlog 的方式来代替触发器方式,将同步信息存储到临时表中,经历校验、初始化、迁移、cut-over 四个阶段完成表结构变更。它通过读取 binlog 中的数据变更,将这些变更应用到新表上,从而实现数据的同步,避免了触发器可能带来的性能问题和复杂性.
abtest 数据库中的 abtest1 表进行引擎变更为 InnoDB 的操作,执行命令:gh-ost -max-load=Threads_running=20 -critical-load=Threads_running=100 -chunk-size=2000 -user="temp" -password="test" -host=10.10.1.10 -allow-on-master -database="abtest" -table="abtest1" -alter="engine=innodb" -cut-over=default -exact-rowcount -concurrent-rowcount -default-retries=120 -timestamp-old-table -assume-rbr -panic-flag-file=/tmp/ghost.panic.flag -execute这里的各个参数含义如下:
-max-load 和 -critical-load 用于控制操作过程中的负载阈值,当 MySQL 的 Threads_running 指标达到设定值时,会采取相应的暂停或停止操作。-chunk-size 指定每次处理的数据块大小。-user、-password、-host 用于指定连接 MySQL 的用户、密码和主机地址。-allow-on-master 表示允许在主库上进行操作(需谨慎使用)。-database 和 -table 分别指定数据库名和表名。-alter 为要执行的 DDL 变更语句。-cut-over 等其他参数用于控制操作的具体行为和特性,如精确行计数、并发行计数、重试次数等设置,-panic-flag-file 用于指定 panic 标志文件的路径.MySQL 8.0 中的 Online DDL 有了更多的优化和特性.
在 MySQL 5.6 开始支持,通过不同的锁级别控制 DDL 期间的读写操作,在 MySQL 8.0 有了更多优化。它根据不同的 DDL 操作和表的情况,选择合适的算法和锁策略,尽量减少对表读写操作的影响。例如对于一些不涉及数据格式变更的操作,可以采用更轻量级的锁,允许并发读写;而对于一些复杂的变更,可能需要更严格的锁控制,但也会在一定程度上允许并发.
users 的示例表:CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);email,执行命令:ALTER TABLE users ADD COLUMN email VARCHAR(100) ALGORITHM=INPLACE,LOCK=NONE;其中,ALGORITHM=INPLACE 表示尽量采用原地修改的算法(如果支持),LOCK=NONE 表示在操作过程中不锁定表,允许并发读写。但需要注意的是,并非所有的 DDL 操作和表结构都支持这种无锁或低锁级别的操作,具体要根据实际情况和 MySQL 版本进行调整.
在处理 MySQL 千万级表的 DDL 操作时,我们需要充分认识到锁表可能引发的一系列严峻问题,并根据实际情况巧妙选择合适的解决方案工具。pt-online-schema-change、gh-ost 和 MySQL Online DDL 各有其独特的优势与适用场景,在使用过程中务必严格遵循操作步骤,密切留意操作过程中的各项关键指标以及可能突发的异常状况,确保 DDL 操作顺利推进,最大程度降低对数据库读写操作的不良影响,为业务系统的稳定、高效运行筑牢坚实的数据基石 。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。