CentOS每日数据备份脚本编写求助:数据库转储与跨服务器传输
完善CentOS每日自动数据库备份脚本
我来帮你一步步把这个备份脚本改得实用又可靠,毕竟自动备份这种事,稳定和可维护性最重要!先从修正你的草稿开始,再补充必要的功能:
一、完整的备份脚本示例
先给你一个可以直接参考的完整脚本,我会逐部分解释:
#!/bin/bash # -------------------------- 配置参数(根据你的实际情况修改) -------------------------- # 数据库相关配置 DB_USER="your_db_username" DB_NAME="your_target_database" # 推荐用配置文件存密码,避免明文泄露,下面会讲怎么配置 # DB_PASS="your_db_password" # 不建议直接写在这里 # 本地备份路径(确保目录存在,可提前用 mkdir -p 创建) LOCAL_BACKUP_DIR="/var/db_backups" # 远程服务器信息:用户名、IP、远程存储路径 REMOTE_USER="remote_server_username" REMOTE_IP="192.168.1.100" REMOTE_BACKUP_DIR="/remote/server/backup/path" # 备份文件名(带时间戳,避免覆盖) BACKUP_FILENAME="db_backup_$(date +%Y%m%d_%H%M%S).sql" LOCAL_BACKUP_PATH="${LOCAL_BACKUP_DIR}/${BACKUP_FILENAME}" # ----------------------------------------------------------------------------------- # 1. 检查本地备份目录是否存在,不存在则创建 if [ ! -d "${LOCAL_BACKUP_DIR}" ]; then mkdir -p "${LOCAL_BACKUP_DIR}" echo "$(date +'%Y-%m-%d %H:%M:%S') - 本地备份目录不存在,已创建: ${LOCAL_BACKUP_DIR}" >> /var/log/db_backup.log fi # 2. 执行数据库转储(以MySQL/MariaDB为例) # 方法一:使用~/.my.cnf配置文件存密码(更安全) mysqldump --defaults-extra-file=~/.my.cnf "${DB_NAME}" > "${LOCAL_BACKUP_PATH}" # 方法二:如果临时用明文密码(不推荐生产环境) # mysqldump -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${LOCAL_BACKUP_PATH}" # 检查转储是否成功 if [ $? -eq 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - 数据库转储成功: ${LOCAL_BACKUP_PATH}" >> /var/log/db_backup.log else echo "$(date +'%Y-%m-%d %H:%M:%S') - 数据库转储失败!" >> /var/log/db_backup.log exit 1 # 转储失败直接退出,不执行后续复制 fi # 3. 将备份文件复制到远程服务器(推荐用rsync,比scp更高效) rsync -avz "${LOCAL_BACKUP_PATH}" "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_BACKUP_DIR}" # 检查远程复制是否成功 if [ $? -eq 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - 备份文件已成功同步到远程服务器" >> /var/log/db_backup.log # 可选:删除本地旧备份,只保留最近7天的 find "${LOCAL_BACKUP_DIR}" -name "db_backup_*.sql" -mtime +7 -delete echo "$(date +'%Y-%m-%d %H:%M:%S') - 已删除7天前的本地备份文件" >> /var/log/db_backup.log else echo "$(date +'%Y-%m-%d %H:%M:%S') - 远程服务器同步失败!" >> /var/log/db_backup.log exit 1 fi
二、关键配置说明
1. 安全存储数据库密码
不要在脚本里明文写密码!创建~/.my.cnf文件,权限设为600(只有自己能读):
touch ~/.my.cnf chmod 600 ~/.my.cnf
然后写入以下内容:
[mysqldump] user=your_db_username password=your_db_password
2. 远程免密登录设置
为了让crontab自动运行时不用输密码,需要配置SSH免密登录:
# 在本地服务器生成密钥对(一路回车默认即可) ssh-keygen -t rsa # 将公钥复制到远程服务器 ssh-copy-id "${REMOTE_USER}@${REMOTE_IP}"
测试一下:ssh ${REMOTE_USER}@${REMOTE_IP},如果不用输密码就成功了。
3. 脚本权限与日志
- 给脚本添加执行权限:
chmod +x /path/to/your_backup_script.sh - 日志文件
/var/log/db_backup.log需要提前创建:touch /var/log/db_backup.log,确保脚本有写入权限。
三、添加到crontab实现每日自动运行
编辑crontab任务:
crontab -e
添加一行(比如每天凌晨2点执行):
0 2 * * * /path/to/your_backup_script.sh >> /var/log/db_backup.log 2>&1
保存退出后,crontab就会自动按计划运行了。
四、你的原始草稿问题说明
你写的#!/bin/sh backupscript -r ~/path/to/db...有两个核心问题:
- shebang(
#!/bin/sh)后面不能直接跟脚本参数,正确的做法是把脚本逻辑写在shebang下方,参数用变量或独立命令行参数传递 - 缺少数据库转储校验、远程复制、错误处理这些核心步骤,上面的脚本已经补全了这些必备功能
内容的提问来源于stack exchange,提问作者Aerodynamika
相关产品推荐
相关产品推荐

