两种方案
- 方案 A:带账号密码明文,快速即用(测试 / 内网)
- 方案 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 文件(大批量同步语句专用)
- 新建
sync.sql,写入你的数据库同步语句 - 修改脚本中 SQL_CONTENT 这一行为:
bash
运行
SQL_CONTENT=$(cat ./sync.sql)
四、使用步骤
- 安装 MySQL 客户端
bash
运行
# CentOS/RHEL
yum install mysql -y
# Ubuntu/Debian
apt update && apt install mysql-client -y
- 编辑
mysql_hosts.list填入全部 50 台数据库服务器信息 - 修改脚本内
SQL_CONTENT为你需要同步执行的 SQL - 授权 + 运行
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 节点优化
- 超时时间调整:全球网络延迟大,把
CONNECT_TIMEOUT=15 - 并发可降低至 20~30,防止大量公网连接并发本地丢包
- 若数据库需要 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}"
核心特性
- 50 台 MySQL并发同时发起 SQL 请求,做到统一时间执行数据库同步语句
- 自动跳过注释、空行,方便批量管理上百台节点
- 单节点连接超时,不会阻塞整体任务
- 每台节点单独输出执行结果,快速定位执行失败数据库
- 支持单行 SQL、多行复杂 SQL、外部 SQL 文件导入同步
- 兼容内网集群、全球多地域分布式 MySQL 服务器