必须用mysqldump而非mysqlpump,因其在银河麒麟V10上兼容性更好、无需额外安装客户端;脚本需指定绝对路径、显式参数及定时散列策略,并通过stderr捕获错误精准定位问题。

MySQL备份脚本必须用mysqldump还是mysqlpump?
在银河麒麟V10这类基于RHEL 8的国产系统上,mysqlpump默认不随MySQL 8.0服务端包安装(仅客户端包含),而mysqldump稳定可用、兼容性更强。直接硬切mysqlpump会导致部分节点任务失败——尤其当目标机器只装了mysql-community-server但没装mysql-community-client时。
实操建议:
- 统一用
mysqldump,显式指定--single-transaction --routines --triggers --events保证一致性 - 避免依赖
which mysqlpump判断,改用command -v mysqldump做存在性检查 - 若真要用
mysqlpump,需在Playbook中先确保mysql-community-client已安装:yum install -y mysql-community-client
备份脚本怎么写才能避免被Ansible的shell模块截断?
Ansible的shell模块默认不继承登录shell环境(比如~/.bashrc里的PATH或别名),常见错误是脚本里写了mysqldump却报command not found,或者用了date -I(GNU扩展)在麒麟V10上失败(其coreutils版本较旧,不支持-I)。
实操建议:
- 脚本第一行必须写
#!/bin/bash,所有命令用绝对路径:/usr/bin/mysqldump、/bin/date - 生成时间戳用
$(/bin/date +%Y%m%d_%H%M%S)替代date -I - 不要在脚本里用
source ~/.my.cnf,改用--defaults-extra-file=/root/.my.cnf传参 - 把脚本内容用
copy模块写入目标机,而非用shell拼接多行命令——后者易因换行/引号嵌套出错
如何让备份任务避开业务高峰期且不堆积?
上百台服务器如果全部在凌晨2:00执行mysqldump,不仅IO打满,还会触发MySQL连接数超限、锁表时间延长等问题。Ansible本身不调度时间,得靠Linux cron + 主机散列控制。
实操建议:
- 用
{{ inventory_hostname | hash('md5') | int(0, 16) % 60 }}计算每台机器的分钟偏移量,让备份时间分布在2:00–2:59之间 - 在Playbook中用
cron模块注册定时任务,minute字段填上面的Jinja2表达式结果 - 设置
backup_dir为独立磁盘分区(如/backup),并在脚本末尾加find /backup -name "*.sql.gz" -mtime +7 -delete自动清理 - 禁用
service: name=crond state=started enabled=yes——麒麟V10默认已启用,重复操作会触发systemd警告
备份失败怎么快速定位是权限、网络还是SQL问题?
Ansible执行shell任务时,只要返回码非0就标为失败,但不会自动捕获stderr。你看到"failed": true,却不知道是mysqldump: Got error: 1045: Access denied还是gzip: stdout: No space left on device。
实操建议:
- 在备份脚本末尾加
exit_code=$?; echo "Backup exit code: $exit_code" >&2; exit $exit_code,强制把退出码打到stderr - 用
register捕获输出,再用failed_when精细判断:failed_when: backup_result.rc != 0 and "Access denied" not in backup_result.stderr - 对关键错误做
debug输出:- debug: var=backup_result.stderr when: backup_result.failed - 不要忽略
mysqldump的--max-allowed-packet参数——大库导出会因默认值(4MB)截断,建议设为512M
真正难的不是写完Playbook,而是让inventory_hostname和group_names能自然映射到不同业务线的保留策略(比如财务库保留90天、日志库只留7天)。这部分逻辑一旦写死在vars里,后续增减节点就得改YAML,不如提前用host_vars目录按主机拆分配置。


















