一、备份数据库
1、准备一份备份命令sh文件,比如将其存放在/opt/db_bak中,命名为bak_mysql.sh
#!/bin/bash # MySQL备份配置 MYSQL_USER="root" MYSQL_PASSWORD="root" MYSQL_HOST="10.10.10.10" MYSQL_PORT="3306" BACKUP_DIR="/data/60_bak/sql" LOG_FILE="/data/60_bak/backup.log" DATE_SUFFIX=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=7 # 文件保留天数# 要备份的数据库列表(用空格分隔) DATABASES=("abc" "aaa" "bbb" "ccc")# 确保备份目录存在 mkdir -p $BACKUP_DIR# 记录开始时间 echo "$(date +%Y-%m-%d\ %H:%M:%S) - 开始备份MySQL数据库" >> $LOG_FILE# 检查磁盘空间(至少需要1GB空闲空间) MIN_DISK_SPACE=1000000 # 1GB in KB AVAILABLE_SPACE=$(df $BACKUP_DIR | awk 'NR==2 {print $4}') if [ $AVAILABLE_SPACE -lt $MIN_DISK_SPACE ]; thenecho "$(date +%Y-%m-%d\ %H:%M:%S) - 错误:磁盘空间不足,至少需要1GB空闲空间" >> $LOG_FILEexit 1 fi# 备份状态标志 BACKUP_SUCCESS=true# 循环备份每个数据库 for DB_NAME in "${DATABASES[@]}" doecho "$(date +%Y-%m-%d\ %H:%M:%S) - 开始备份数据库: $DB_NAME" >> $LOG_FILE# 执行MySQL备份/opt/mysql-8.0.26/bin/mysqldump -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD \--single-transaction \--routines \--triggers \--events \$DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE_SUFFIX}.sql.gz 2>> $LOG_FILE# 检查备份是否成功if [ $? -eq 0 ]; then# 获取备份文件大小BACKUP_SIZE=$(du -h $BACKUP_DIR/${DB_NAME}_${DATE_SUFFIX}.sql.gz | cut -f1)echo "$(date +%Y-%m-%d\ %H:%M:%S) - 数据库 $DB_NAME 备份成功完成: ${DB_NAME}_${DATE_SUFFIX}.sql.gz (大小: $BACKUP_SIZE)" >> $LOG_FILEelseecho "$(date +%Y-%m-%d\ %H:%M:%S) - 数据库 $DB_NAME 备份失败" >> $LOG_FILEBACKUP_SUCCESS=falsefi done# 根据备份状态执行清理操作 if [ "$BACKUP_SUCCESS" = true ]; then# 清理旧备份find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -exec rm -f {} \; 2>> $LOG_FILEecho "$(date +%Y-%m-%d\ %H:%M:%S) - 清理$RETENTION_DAYS天前的旧备份完成" >> $LOG_FILE elseecho "$(date +%Y-%m-%d\ %H:%M:%S) - 部分数据库备份失败,跳过清理操作" >> $LOG_FILEexit 1 fi
2、给予bak_mysql执行权限
sudo chmod +x /opt/db_bak/bak_mysql.sh
3、手动执行一遍确保没问题
cd /opt/db_bak ./bak_mysql.sh
4、编辑cron任务(cron在linux用于设置周期性执行任务的工具)
crontab -e # 输入以下文本,如果你希望每天凌晨2点执行备份 0 2 * * * /opt/db_bak/db_mysql.sh # 退出编辑,验证一下任务列表 crontab -l