mysql生产环境表加字段_mysql大表在不停机的情况下增加字段该怎么处理

在MySQL生产环境中,针对千万级别的大表添加字段是一项挑战。本文通过三种策略进行说明:1) 直接添加字段(适用于不繁忙或ONLINE DDL场景);2) 使用pt-osc工具在线添加(减少影响);3) 先在从库添加,再主从切换(热表场景)。每种方法都有其适用条件和注意事项,例如在繁忙系统中可能需要避免锁等待或使用主从切换来确保服务稳定。
摘要由CSDN通过智能技术生成

MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明。

1、 环境准备

数据库版本: 5.7.25-28(Percona 分支)

服务器配置:  3台centos 7虚拟机,配置均为2CPU  2G内存

数据库架构: 1主2从的MHA架构(为了方便主从切换场景的演示,如开启GTID,则两节点即可),关于MHA搭建可参考此文 MySQL高可用之MHA集群部署

准备测试表:  创建一张2kw记录的表,快速创建的方法可以参考快速创建连续数

本次对存储过程稍作修改,多添加几个字段,存储过程如下:

DELIMITER $$CREATE PROCEDURE `sp_createNum`(cnt INT)BEGIN

DECLARE i INT DEFAULT 1;DROP TABLE if existstb_add_columns;CREATE TABLE if not exists tb_add_columns(id int primary key,col1 int,col2 varchar(32));INSERT INTO tb_add_columns(id,col1,col2) SELECT i as id ,i%7 as col1,md5(i) ascol2;WHILE i

INSERT INTO tb_add_columns(id,col1,col2) SELECT id + i as id ,( id + i) %7 as col1,md5( id + i) as col2 FROM tb_add_columns WHERE id <=cnt -i ;SET i = i*2;END;END WHILE;END$$

DELIMITER ;

调用存储过程,完成测试表及测试数据的创建。

mysql> call sp_createNum(20000000);

87bdadbe424114d34db82937e41cfb5b.png

2.  直接添加字段

使用场景: 在系统不繁忙或者该表访问不多的情况下,如符合ONLINE DDL的情况下,可以直接添加。

模拟场景: 创建一个测试脚本,每10s访问该表随机一条记录,然后给该表添加字段

访问脚本如下:

#!/bin/bash

# gjcfor i in {1..1000000000} # 访问次数1000000000,按需调整即可do

id=$RANDOM #生成随机数

mysql-uroot -p'123456' --socket=/data/mysql3306/tmp/mysql.sock -e "select a.*,now() from testdb.tb_add_columns a where id ="$id# 访问数据sleep 10# 暂停10sdone

运行脚本

<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值