mysqldump通过-p指定端口连接多实例mysql,必须用127.0.0.1(tcp)而非localhost(socket),避免端口被忽略;需为每个端口单独配置用户权限、引擎验证及备份目录,并使用绝对路径和--defaults-extra-file安全传密。

mysqldump 怎么指定不同端口连接多实例
MySQL 多实例本质是多个 mysqld 进程监听不同端口(如 3306、3307、3308),mysqldump 必须显式用 -P(大写 P)指定端口,-p(小写 p)是密码参数,混淆会导致认证失败或连错实例。
常见错误现象:mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' —— 实际是因为没加 -P 3307,默认连了 3306 实例,而该实例没配对应账号。
-
-h 127.0.0.1 -P 3307 -u root -p'pass123' database_name:必须用127.0.0.1(TCP 连接),不能用localhost(会走 socket,忽略-P) - 若实例绑定了具体 IP(如
192.168.1.100:3307),则用-h 192.168.1.100 -P 3307 - 密码不建议明写在命令行(会暴露在
ps aux中),改用配置文件或--defaults-extra-file
遍历端口 + 数据库名的 Bash 脚本结构
不能只循环数据库名,必须把「端口」和「对应数据库列表」做映射,否则一个脚本无法区分哪个库属于哪个实例。
推荐用关联数组(需 Bash 4.0+)或二维数组模拟:
declare -A INSTANCE_MAP
INSTANCE_MAP["3306"]="db_app1 db_app2"
INSTANCE_MAP["3307"]="db_log db_metric"
INSTANCE_MAP["3308"]="db_report"
<p>for port in "${!INSTANCE_MAP[@]}"; do
dbs=${INSTANCE_MAP[$port]}
for db in $dbs; do
mysqldump -h 127.0.0.1 -P "$port" -u backup_user -p'xxx' "$db" \</p><blockquote><p>"/backup/mysql<em>${port}/${db}</em>$(date +%Y%m%d).sql"
done
done
</p></blockquote>
- 每个端口单独建目录(如
/backup/mysql_3307/),避免文件名冲突 - 不要用
root账号跑定时任务;创建专用账号并授权:GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON *.* TO 'backup_user'@'localhost'; - 脚本开头加
set -e,任一mysqldump失败即退出,防止部分备份静默失败
为什么 --single-transaction 不一定生效
该参数只对 InnoDB 表起作用,且要求整个实例所有待备份库的表都是 InnoDB。一旦某个库含 MyISAM 表(比如 mysql 系统库里的 general_log),mysqldump 会自动退化为全局锁(FLUSH TABLES WITH READ LOCK),阻塞写入。
- 检查表引擎:
SELECT table_schema,table_name,engine FROM information_schema.tables WHERE table_schema IN ('db_app1','db_log') AND engine != 'InnoDB'; - 若存在 MyISAM,要么改引擎,要么放弃
--single-transaction,改用--lock-all-tables并接受短时锁表 - 多实例场景下,各实例引擎配置可能不一致,必须逐个验证,不能统一套用参数
crontab 定时执行时的环境陷阱
直接用 crontab -e 添加脚本,常出现「手动能跑,定时就失败」——因为 cron 使用最小化 shell 环境,PATH 不含 /usr/local/mysql/bin,也找不到你的配置文件。
- 脚本第一行写完整解释器路径:
#!/usr/bin/env bash或#!/bin/bash,别用#!/usr/bin/sh - 所有命令用绝对路径:
/usr/local/mysql/bin/mysqldump,而非仅mysqldump - 密码不存脚本里,改用
~/.my.cnf(权限600),并在mysqldump加--defaults-extra-file=/home/backup/.my.cnf - 重定向 stderr 到日志:
/path/to/backup.sh >> /var/log/mysql_backup.log 2>&1,否则失败无声
端口级多实例备份最易被忽略的点:每个实例的用户权限、表引擎、socket 路径、配置文件位置都可能不同,必须按实例单独验证,不能写完脚本就扔进 crontab。











