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

本文介绍了在MySQL环境中,如何在不停机的情况下给大表添加字段。通过三种策略进行详细说明:1) 直接添加字段,在系统不繁忙时进行;2) 使用Percona Toolkit的pt-online-schema-change工具在线添加,适用于大表操作;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 exists tb_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) as col2;

WHILE i < cnt DO
  BEGIN
    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);

  1. 直接添加字段

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

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

访问脚本如下:
复制代码

#!/bin/bash

gjc

for i in {1…1000000000} # 访问次数1000000000,按需调整即可
do
id=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值