1. 使用 /root/.my.cnf 存储账号密码(强烈推荐)
创建.my.cnf
bash
vi /root/.my.cnf
写入ip,账号,密码
bash
[client]
user=root
password=xxxxxx
host=127.0.0.1
授权
bash
chmod 600 /root/.my.cnf
2. 编写备份数据库的完整脚本
bash
#!/bin/bash
# ================= 配置区 =================
BACKUP_DIR="/usr/local/sql_data_backup"
DATABASE="数据库名称"
HOST="127.0.0.1"
DATETIME=$(date +%F)
LOG_FILE="${BACKUP_DIR}/${DATABASE}-${DATETIME}.log"
BACKUP_SUB_DIR="${BACKUP_DIR}/${DATETIME}"
SQL_FILE="${BACKUP_SUB_DIR}/${DATABASE}-${DATETIME}.sql"
TAR_FILE="${BACKUP_DIR}/${DATABASE}-${DATETIME}.tar.gz"
RETENTION_DAYS=10
# ==========================================
mkdir -p "${BACKUP_SUB_DIR}"
touch "${LOG_FILE}"
echo "=== 备份开始:$(date '+%F %T') ===" | tee -a "${LOG_FILE}"
echo "数据库:${DATABASE}" | tee -a "${LOG_FILE}"
echo "备份文件:${SQL_FILE}" | tee -a "${LOG_FILE}"
# ---------- 开始备份 ----------
mysqldump \
--single-transaction \
--routines \
--events \
--triggers \
--default-character-set=utf8mb4 \
-h "${HOST}" \
"${DATABASE}" > "${SQL_FILE}" 2>>"${LOG_FILE}"
if [ $? -ne 0 ]; then
echo "❌ 数据库备份失败!" | tee -a "${LOG_FILE}"
exit 1
fi
echo "✅ 数据库导出成功" | tee -a "${LOG_FILE}"
# ---------- 压缩 ----------
tar -zcf "${TAR_FILE}" -C "${BACKUP_DIR}" "${DATETIME}" >> "${LOG_FILE}" 2>&1
if [ $? -ne 0 ]; then
echo "❌ 备份压缩失败!" | tee -a "${LOG_FILE}"
exit 1
fi
echo "✅ 压缩完成:${TAR_FILE}" | tee -a "${LOG_FILE}"
# ---------- 清理目录 ----------
rm -rf "${BACKUP_SUB_DIR}"
# ---------- 删除过期备份 ----------
find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -exec rm -f {} \;
echo "🧹 已清理 ${RETENTION_DAYS} 天前的备份" | tee -a "${LOG_FILE}"
echo "=== 备份结束:$(date '+%F %T') ===" | tee -a "${LOG_FILE}"
执行脚本命令
bash
bash backupdb.sh
3. 编写定时执行任务
编辑 root 的 crontab(推荐用 root)
bash
crontab -e
凌晨两点执行备份
bash
0 2 * * * flock -n /tmp/mysql_backup.lock /bin/bash /usr/local/sql_data_backup/backupdb.sh >> /usr/local/sql_data_backup/cron.log 2>&1
查看是否已生效
bash
crontab -l
4. 特别说明
bash
bash backupdb.sh backupdb.sh:
line 2: $'\r': command not found backupdb.sh:
line 14: $'\r': command not found backupdb.sh:
line 17: $'\r': command not found
出现类似的提示说明 你的 backupdb.sh 又被保存成 Windows 的 CRLF 格式了
在服务器上执行下面 两条命令:
bash
sed -i 's/\r$//' backupdb.sh
chmod +x backupdb.sh
然后 立刻验证:
bash
head -1 backupdb.sh | cat -A
正确应为
bash
#!/bin/bash$
再执行(这一步才算成功)
bash
bash backupdb.sh