如何基于两个TXT文件实现数据库循环备份脚本?
数据库与表组合备份的Bash脚本方案
核心嵌套循环脚本
以下是直接实现需求的脚本,能遍历DB_NAME.txt中的每个数据库和TB_NAME.txt中的每个表,完成两两组合的备份:
#!/bin/bash # 指定两个文件的路径(根据实际位置调整) DB_LIST="./DB_NAME.txt" TB_LIST="./TB_NAME.txt" # 先检查文件是否存在,避免后续报错 if [ ! -f "$DB_LIST" ] || [ ! -f "$TB_LIST" ]; then echo "错误:DB_NAME.txt 或 TB_NAME.txt 不存在,请确认文件路径" exit 1 fi # 外层循环读取数据库名 while IFS= read -r db; do # 跳过空行和以#开头的注释行 [[ -z "$db" || "$db" =~ ^# ]] && continue # 内层循环读取表名,与当前数据库组合备份 while IFS= read -r tb; do [[ -z "$tb" || "$tb" =~ ^# ]] && continue # 生成带时间戳的备份文件名,避免覆盖 backup_file="${db}_${tb}_$(date +%Y%m%d_%H%M%S).sql" # 执行mysqldump,替换为你的MySQL账号信息 # 建议用~/.my.cnf存储密码,避免明文泄露 mysqldump -u your_mysql_user -p'your_mysql_password' "$db" "$tb" > "$backup_file" # 检查备份是否成功 if [ $? -eq 0 ]; then echo "✅ 备份完成:$backup_file" else echo "❌ 备份失败:$db.$tb" rm -f "$backup_file" # 删除失败的空文件 fi done < "$TB_LIST" done < "$DB_LIST"
关键细节说明
IFS= read -r:确保读取行内容时不丢失空格、不转义特殊字符,适配带空格的库/表名- 跳过空行和注释:避免处理无效的行内容,提升脚本健壮性
- 时间戳文件名:防止多次备份覆盖同一文件,方便追溯备份时间
- 密码安全优化:不要在命令行明文写密码,推荐创建
~/.my.cnf配置文件:
之后脚本中的mysqldump命令可简化为:[mysqldump] user=your_mysql_user password=your_mysql_passwordmysqldump "$db" "$tb" > "$backup_file"
进阶优化:压缩备份
如果需要节省磁盘空间,可将备份文件压缩为gz格式:
mysqldump "$db" "$tb" | gzip > "${backup_file}.gz"
内容的提问来源于stack exchange,提问作者skidamarink
相关产品推荐
相关产品推荐

