Skip to content
Silubaba trade > Blog > news > 批量多服务器 MySQL 同时执行 SQL 脚本(50 台并发同步执行)

批量多服务器 MySQL 同时执行 SQL 脚本(50 台并发同步执行)

    两种方案

    1. 方案 A:带账号密码明文,快速即用(测试 / 内网)
    2. 方案 B:本地 my.cnf 免密配置(生产推荐,无明文密码) 功能:50 台 MySQL同一时刻并发执行同一条 / 同一段 SQL,所有库同时操作

    一、主机清单配置 mysql_hosts.list

    和脚本放同一目录,一行一台 MySQL 节点,格式:IP 端口 mysql用户 mysql密码 数据库名

    plaintext

    #示例,填满50台
    10.0.0.10 3306 root Mysql@123 test_db
    10.0.0.11 3306 root Mysql@123 test_db
    10.0.0.12 3306 root Mysql@123 test_db
    #...继续添加至50台服务器
    # #开头为注释行,脚本自动忽略
    

    二、批量并发执行 MySQL SQL 脚本 batch_mysql_exec.sh

    bash

    运行

    #!/bin/bash
    # 多服务器MySQL同一时间并发执行SQL
    HOST_LIST="./mysql_hosts.list"
    # ====================== 这里修改要执行的SQL ======================
    # 示例:建表、更新、新增索引、数据同步语句,多条用;分隔
    SQL_CONTENT="
    SET NAMES utf8mb4;
    UPDATE sys_user SET status=1 WHERE create_time<'2026-01-01';
    ALTER TABLE order_info ADD INDEX idx_create_time(create_time);
    SELECT COUNT(*) FROM sys_user;
    "
    # 如需执行外部sql文件,替换上面为读取文件:SQL_CONTENT=$(cat ./sync.sql)
    # =================================================================
    
    # 并发数,50台直接开50并发同时执行
    MAX_TASK=50
    # MySQL连接超时
    CONNECT_TIMEOUT=8
    
    # 校验主机文件
    if [ ! -f "${HOST_LIST}" ];then
        echo "错误:${HOST_LIST} 文件不存在,请创建配置服务器信息"
        exit 1
    fi
    
    # 校验mysql客户端是否存在
    if ! command -v mysql &> /dev/null;then
        echo "错误:本机未安装mysql客户端,请安装:yum install mysql -y / apt install mysql-client -y"
        exit 1
    fi
    
    echo "=============================================="
    echo "批量MySQL同步执行启动,并发:${MAX_TASK}"
    echo "待执行SQL:"
    echo "${SQL_CONTENT}"
    echo "=============================================="
    
    # 循环遍历所有mysql节点
    while read line
    do
        # 跳过空行/注释
        [[ -z "$line" || "$line" =~ ^# ]] && continue
        # 拆分字段
        M_IP=$(echo $line | awk '{print $1}')
        M_PORT=$(echo $line | awk '{print $2}')
        M_USER=$(echo $line | awk '{print $3}')
        M_PASS=$(echo $line | awk '{print $4}')
        M_DB=$(echo $line | awk '{print $5}')
    
        # 后台并发执行,所有服务器几乎同一时间发起请求
        (
            echo -e "\n===== MySQL节点 ${M_IP}:${M_PORT} 执行日志 ====="
            mysql \
            -h${M_IP} \
            -P${M_PORT} \
            -u${M_USER} \
            -p${M_PASS} \
            --connect-timeout=${CONNECT_TIMEOUT} \
            ${M_DB} -e "${SQL_CONTENT}"
    
            if [ $? -eq 0 ];then
                echo "[${M_IP}] SQL执行成功"
            else
                echo "[${M_IP}] SQL执行失败!检查网络/账号/SQL语法"
            fi
        ) &
    
        # 控制并发数量,防止本地进程打满
        RUN_NUM=$(jobs -r | wc -l)
        while [ ${RUN_NUM} -ge ${MAX_TASK} ];do
            sleep 0.2
            RUN_NUM=$(jobs -r | wc -l)
        done
    done < ${HOST_LIST}
    
    # 等待全部后台mysql进程执行完毕
    wait
    echo -e "\n=============================================="
    echo "全部MySQL服务器SQL执行完成!"
    echo "=============================================="
    

    三、执行外部 SQL 文件(大批量同步语句专用)

    1. 新建 sync.sql,写入你的数据库同步语句
    2. 修改脚本中 SQL_CONTENT 这一行为:

    bash

    运行

    SQL_CONTENT=$(cat ./sync.sql)
    

    四、使用步骤

    1. 安装 MySQL 客户端

    bash

    运行

    # CentOS/RHEL
    yum install mysql -y
    # Ubuntu/Debian
    apt update && apt install mysql-client -y
    
    1. 编辑 mysql_hosts.list 填入全部 50 台数据库服务器信息
    2. 修改脚本内 SQL_CONTENT 为你需要同步执行的 SQL
    3. 授权 + 运行

    bash

    运行

    chmod +x batch_mysql_exec.sh
    ./batch_mysql_exec.sh
    

    生产安全优化方案(禁止明文存储数据库密码)

    1. 每台数据库服务器配置免密登录 .my.cnf(远程机器)

    远程数据库服务器对应账号家目录创建 ~/.my.cnf

    ini

    [client]
    user=root
    password=Mysql@123
    port=3306
    

    授权权限:

    bash

    运行

    chmod 600 ~/.my.cnf
    

    2. 修改脚本,删除密码参数,hosts.list 只保留 IP、端口、库名

    mysql_hosts.list 格式改为:

    plaintext

    10.0.0.10 3306 test_db
    10.0.0.11 3306 test_db
    

    脚本 mysql 执行行简化:

    bash

    运行

    mysql -h${M_IP} -P${M_PORT} --connect-timeout=${CONNECT_TIMEOUT} ${M_DB} -e "${SQL_CONTENT}"
    

    补充:跨公网全球 MySQL 节点优化

    1. 超时时间调整:全球网络延迟大,把 CONNECT_TIMEOUT=15
    2. 并发可降低至 20~30,防止大量公网连接并发本地丢包
    3. 若数据库需要 SSL 连接,mysql 命令增加 ssl 参数:

    bash

    运行

    mysql --ssl-mode=REQUIRED -h${M_IP} -P${M_PORT} -u${M_USER} -p${M_PASS} ${M_DB} -e "${SQL_CONTENT}"
    

    核心特性

    1. 50 台 MySQL并发同时发起 SQL 请求,做到统一时间执行数据库同步语句
    2. 自动跳过注释、空行,方便批量管理上百台节点
    3. 单节点连接超时,不会阻塞整体任务
    4. 每台节点单独输出执行结果,快速定位执行失败数据库
    5. 支持单行 SQL、多行复杂 SQL、外部 SQL 文件导入同步
    6. 兼容内网集群、全球多地域分布式 MySQL 服务器

    Leave a Reply