centos7的mysql做定时任务备份所有数据库

在 CentOS 7 中为 MySQL 设置定时任务备份所有数据库 ,可通过mysqldump全量备份 +crond定时任务实现,兼顾安全性和自动化。以下是详细步骤:

一、准备工作

1. 确认 MySQL 客户端工具

确保已安装mysqldump(MySQL 备份工具),若未安装,执行:

复制代码
# 针对MySQL官方源安装的版本
sudo yum install mysql-community-client -y

# 针对Mariadb(CentOS 7默认可能预装)
sudo yum install mariadb-server -y  # 包含mysqldump
2. 创建 MySQL 备份专用账号

为避免使用root账号,创建仅用于备份的账号(需全局权限,因为要备份所有库):

复制代码
-- 登录MySQL
mysql -u root -p

-- 创建备份账号(仅允许本地访问)
CREATE USER 'backup_all'@'localhost' IDENTIFIED BY 'Strong@Backup123';  # 密码复杂度要高
-- 授予备份所有数据库的权限
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD, REPLICATION CLIENT ON *.* TO 'backup_all'@'localhost';
FLUSH PRIVILEGES;
exit;
3. 准备备份目录

选择磁盘空间充足的路径(如/data/mysql_backups),并设置权限:

复制代码
# 创建备份目录
sudo mkdir -p /data/mysql_backups
# 授予MySQL或执行脚本的用户写入权限(此处以当前用户为例)
sudo chown $USER:$USER /data/mysql_backups

二、编写备份脚本(备份所有数据库)

创建脚本/usr/local/scripts/backup_all_mysql.sh,实现全量备份、压缩、日志记录、旧文件清理:

复制代码
#!/bin/bash
# 备份所有MySQL数据库的脚本(CentOS 7)

# ==== 配置参数 ====
BACKUP_USER="backup_all"        # 备份账号
BACKUP_PASS="Strong@Backup123"  # 备份密码(后续会用配置文件隐藏,此处仅临时用)
BACKUP_DIR="/data/mysql_backups"# 备份目录
LOG_FILE="${BACKUP_DIR}/backup_all.log"  # 日志文件
RETENTION_DAYS=15               # 备份保留15天(按需调整)
DATE=$(date +%Y%m%d_%H%M%S)     # 时间戳(格式:年月日_时分秒)
MYSQL_CONF="$HOME/.my.cnf"      # 用于隐藏密码的配置文件路径


# ==== 1. 初始化:检查目录、创建密码配置文件 ====
# 确保备份目录存在
if [ ! -d "${BACKUP_DIR}" ]; then
  mkdir -p "${BACKUP_DIR}"
  echo "[$DATE] 备份目录不存在,已创建:${BACKUP_DIR}" >> "${LOG_FILE}"
fi

# 创建.my.cnf隐藏密码(避免脚本明文暴露密码,权限必须600)
if [ ! -f "${MYSQL_CONF}" ]; then
  cat > "${MYSQL_CONF}" << EOF
[mysqldump]
user=${BACKUP_USER}
password=${BACKUP_PASS}
EOF
  chmod 600 "${MYSQL_CONF}"  # 关键:限制权限,仅当前用户可读写
  echo "[$DATE] 创建密码配置文件:${MYSQL_CONF}" >> "${LOG_FILE}"
fi

# 检查备份目录所在磁盘的可用空间(低于20%时告警)
DISK_USAGE=$(df -h "${BACKUP_DIR}" | awk 'NR==2 {print $5}' | sed 's/%//')
if [ ${DISK_USAGE} -ge 80 ]; then
  echo "[$DATE] 警告:磁盘空间不足!当前使用率${DISK_USAGE}%,停止备份" >> "${LOG_FILE}"
  exit 1
fi

# ==== 2. 执行全量备份(所有数据库) ====
BACKUP_FILE="${BACKUP_DIR}/all_dbs_${DATE}.sql.gz"  # 备份文件名(含所有库+时间戳)
echo "[$DATE] 开始备份所有数据库..." >> "${LOG_FILE}"

# 使用mysqldump备份所有库,--all-databases表示全量,--defaults-extra-file指定密码配置
mysqldump --defaults-extra-file="${MYSQL_CONF}" --all-databases --single-transaction --quick --events | gzip > "${BACKUP_FILE}"

# 检查备份是否成功($?为0表示成功)
if [ $? -eq 0 ]; then
  echo "[$DATE] 全量备份成功!文件:${BACKUP_FILE}(大小:$(du -sh ${BACKUP_FILE} | awk '{print $1}'))" >> "${LOG_FILE}"
else
  echo "[$DATE] 备份失败!请检查账号密码、MySQL服务状态" >> "${LOG_FILE}"
  exit 1  # 备份失败时退出,便于后续告警
fi


# ==== 3. 清理旧备份(保留最近15天) ====
echo "[$DATE] 开始清理${RETENTION_DAYS}天前的备份文件..." >> "${LOG_FILE}"
# 仅删除以"all_dbs_"开头的备份文件,避免误删其他文件
find "${BACKUP_DIR}" -name "all_dbs_*.sql.gz" -type f -mtime +${RETENTION_DAYS} -delete

if [ $? -eq 0 ]; then
  echo "[$DATE] 旧文件清理完成,保留最近${RETENTION_DAYS}天备份" >> "${LOG_FILE}"
else
  echo "[$DATE] 旧文件清理失败!" >> "${LOG_FILE}"
fi

三、脚本权限与测试

1. 赋予执行权限
复制代码
# 给脚本添加可执行权限
chmod +x /usr/local/scripts/backup_all_mysql.sh
2. 手动测试脚本

执行脚本,检查是否生成备份文件和日志:

复制代码
/usr/local/scripts/backup_all_mysql.sh

# 检查结果
ls -lh /data/mysql_backups  # 应有all_dbs_xxx.sql.gz文件
cat /data/mysql_backups/backup_all.log  # 日志应显示"备份成功"

四、配置 crontab 定时任务

通过 CentOS 7 的crond服务设置定时执行(如每天凌晨 1 点备份,避开业务高峰)。

1. 编辑定时任务
复制代码
crontab -e  # 打开当前用户的crontab配置(若需用root执行,加sudo)
2. 添加定时规则

在打开的文件中添加:

复制代码
# 每天凌晨1点执行全量备份,输出日志到系统日志(便于排查)
0 1 * * * /usr/local/scripts/backup_all_mysql.sh >> /var/log/mysql_backup_cron.log 2>&1
  • 规则说明:0 1 * * * 表示 "每天 1 点 0 分执行";2>&1 表示将错误输出也写入日志。
3. 重启 crond 服务

确保定时任务生效:

复制代码
sudo systemctl restart crond  # 重启服务
sudo systemctl enable crond   # 设置开机自启(默认已启用)

五、关键优化与验证

1. 备份验证(避免备份文件损坏)

每周手动验证一次备份文件的有效性:

复制代码
# 解压备份文件(若文件大,可只看前几行)
gunzip -c /data/mysql_backups/all_dbs_20240520_010000.sql.gz | head -n 100

# 或恢复到测试库(需先创建测试库test_restore)
gunzip -c /data/mysql_backups/all_dbs_20240520_010000.sql.gz | mysql -u root -p test_restore
2. 错误告警(可选)

若备份失败,可通过邮件通知(需安装mailx):

复制代码
# 安装邮件工具
sudo yum install mailx -y
# 配置邮件服务器(如用163邮箱,需开启SMTP)
echo "set from=your_email@163.com smtp=smtp.163.com smtp-auth-user=your_email@163.com smtp-auth-password=your_auth_code smtp-auth=login" >> /etc/mail.rc

# 在脚本"备份失败"处添加邮件发送
echo "[$DATE] MySQL全量备份失败!详情见日志:${LOG_FILE}" | mail -s "MySQL备份失败告警" admin@example.com

六、常见问题排查

  • 备份文件为空 :检查mysqldump是否正确安装、备份账号权限是否足够(尤其是REPLICATION CLIENT权限)。
  • crontab 不执行 :检查脚本路径是否绝对路径、脚本是否有执行权限、/var/log/mysql_backup_cron.log是否有错误日志。
  • 密码包含特殊字符 :通过.my.cnf配置文件可避免特殊字符导致的脚本解析错误(已在脚本中处理)。

通过以上步骤,即可在 CentOS 7 上实现 MySQL 所有数据库的自动化定时备份,确保数据安全可恢复。

相关推荐
Java 码农2 小时前
MySQL EXPLAIN 详解与优化指南
android·mysql·adb
Java 码农2 小时前
MySQL基础操作案例设计
数据库·mysql
友友马3 小时前
『 QT 』按钮类控件属性解析
开发语言·数据库·qt
vvw&3 小时前
如何在 Ubuntu 上安装 PostgreSQL
linux·运维·服务器·数据库·ubuntu·postgresql
csdn_aspnet3 小时前
如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
linux·windows·mysql·macos·centos
qq_5470261793 小时前
Canal实时同步MySQL数据到Elasticsearch
数据库·mysql·elasticsearch
csdn_aspnet4 小时前
CentOS 7 上安装 MySQL 8.0
linux·mysql·centos
java1234_小锋5 小时前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
兰若姐姐5 小时前
如何进行MSSQL提权?sp_oacreate、sp_oamethod和沙盒提权以及xp_regwrighte提权
数据库·sqlserver