You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:16:11