linux设置定时备份mysql数据

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
相关推荐
readhere20 分钟前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
正在走向自律29 分钟前
数据集成产品的技术底座:从日志解析原理到 KFS 同步链路搭建(含建表与增删改查完整代码)
数据库·oracle·信创·数据集成·国产数据库·kingbasees·全量+增量同步
程序员塔塔喵33 分钟前
【MySQL篇|第七篇】MySQL事务
数据库·mysql·mysql事务
打工仔折腾 AI2 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
_孤傲_2 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
关于Linux 线程局部存储的认识
linux·运维
为思念酝酿的痛4 小时前
MySQL的操作
数据库·mysql
小小de风呀4 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
猫咪很可爱4 小时前
Oracle ORA-4031 错误分析与处理:SGA 内存不足导致 update/exp/expdp 失败
数据库·oracle