服务器定时备份数据库脚本

前言

定时备份mysql数据库是服务器的硬性要求,防止出现异常,数据丢失,一般可以定时到凌晨,进行数据备份,以下给出的脚本是全量备份,不需要修改mysql的配置,优点是比较简单。缺点是备份时间比较长。增量备份需要修改mysql配置,打开日志,对于正在运行的项目,不太好停机修改,有可能还会出现异常,适合用户比较少的项目

不需要sudo权限的备份

java 复制代码
[root@iZt4ne5n70035rjpj6m0wzZ ~]# cat  /root/mysql_daily_backup.sh << 'EOF'
 #!/bin/bash
 set -e
 BACKUP_DIR="/root/backup"
 CONTAINER="mysql"
 MYSQL_USER="root"
 MYSQL_PASS="Zxsd@147"
 DATE=$(date +%Y%m%d_%H%M%S)
 
 # 创建目录
 mkdir -p "$BACKUP_DIR"
 
 echo "开始MySQL备份: $(date '+%Y-%m-%d %H:%M:%S')"
 
 # 执行备份
 if docker exec "$CONTAINER" mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" \
   --all-databases \
   --single-transaction \
   --quick \
   --routines \
   --events \
   --triggers \
   | gzip  "$BACKUP_DIR/mysql_${DATE}.sql.gz"; then
   
   echo "✓ 备份成功"
   FILE_SIZE=$(du -h "$BACKUP_DIR/mysql_${DATE}.sql.gz" | cut -f1)
   echo "文件大小: $FILE_SIZE"
   
   # 清理30天前的备份
   find "$BACKUP_DIR" -name "mysql_*.sql.gz" -type f -mtime +30 -delete
   
   echo "备份完成"
 else
   echo "✗ 备份失败"
   exit 1
 fi
 EOF
[root@iZt4ne5n70035rjpj6m0wzZ ~]# chmod +x /root/mysql_daily_backup.sh
[root@iZt4ne5n70035rjpj6m0wzZ ~]# /root/mysql_daily_backup.sh
开始MySQL备份: 2025-12-18 14:01:19
mysqldump: [Warning] Using a password on the command line interface can be insecure.
✓ 备份成功
文件大小: 66M
备份完成
[root@iZt4ne5n70035rjpj6m0wzZ ~]# crontab -l | grep mysql
0 2 * * * /root/mysql_daily_backup.sh  /root/backup/logs/cron.log 2&1



恢复
# 恢复最新备份
gunzip < /root/backup/mysql_最新日期.sql.gz | docker exec -i mysql mysql -uroot -pZxsd@147

需要sudo权限的备份

java 复制代码
脚本内容/data/ChipletRing_web/mysql_daily_backup.sh

#!/bin/bash
set -e
BACKUP_DIR="/data/ChipletRing_web/mysql_backup"
CONTAINER="mysql"
MYSQL_USER="root"
MYSQL_PASS="Zxsd@147"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建目录
mkdir -p "$BACKUP_DIR"

echo "开始MySQL备份: $(date '+%Y-%m-%d %H:%M:%S')"
echo "备份目录: $BACKUP_DIR"

# 检查Docker权限(使用sudo)
if ! sudo docker ps >/dev/null 2>&1; then
    echo "错误: 没有Docker执行权限"
    exit 1
fi

# 检查MySQL容器
if ! sudo docker ps | grep -q "$CONTAINER"; then
    echo "错误: MySQL容器 '$CONTAINER' 未运行"
    exit 1
fi

# 执行备份
BACKUP_FILE="$BACKUP_DIR/mysql_${DATE}.sql.gz"
echo "备份文件: $BACKUP_FILE"

# 使用sudo执行docker命令
if sudo docker exec "$CONTAINER" mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" \
  --all-databases \
  --single-transaction \
  --quick \
  --routines \
  --events \
  --triggers \
  | gzip > "$BACKUP_FILE"; then
  
  # 检查备份文件是否真的有效(大于1KB)
  FILE_SIZE=$(du -k "$BACKUP_FILE" | cut -f1)
  if [ "$FILE_SIZE" -lt 10 ]; then  # 小于10KB可能有问题
    echo "警告: 备份文件大小异常 ($FILE_SIZE KB),可能备份失败"
    rm -f "$BACKUP_FILE"
    exit 1
  fi
  
  echo "✓ 备份成功"
  FILE_SIZE_H=$(du -h "$BACKUP_FILE" | cut -f1)
  echo "文件大小: $FILE_SIZE_H"
  
  # 清理30天前的备份
  find "$BACKUP_DIR" -name "mysql_*.sql.gz" -type f -mtime +30 -delete
  
  echo "备份完成"
else
  echo "✗ 备份失败"
  exit 1
fi

# 给权限
chmod +x mysql_daily_backup.sh

sudo ./mysql_daily_backup.sh

# 1. 编辑当前用户的crontab
crontab -e

# MySQL每日备份 - 凌晨2点执行
0 2 * * * sudo /data/ChipletRing_web/mysql_daily_backup.sh >> /data/ChipletRing_web/mysql_backup/backup.log 2>&1


恢复
# 恢复最新备份
gunzip < /data/ChipletRing_web/mysql_backup/mysql_最新日期.sql.gz | docker exec -i mysql mysql -uroot -pZxsd@147
相关推荐
一灰灰blog3 分钟前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
Nandeska35 分钟前
15、基于MySQL的组复制
数据库·mysql
神梦流1 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
AllData公司负责人1 小时前
AllData数据中台-数据同步平台【Seatunnel-Web】整库同步MySQL同步Doris能力演示
大数据·数据库·mysql·开源
加油,小猿猿1 小时前
Java开发日志-双数据库事务问题
java·开发语言·数据库
山岚的运维笔记2 小时前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
Gain_chance2 小时前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
郝学胜-神的一滴2 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
未来之窗软件服务2 小时前
计算机等级考试—高频英语词汇—东方仙盟练气期
数据库·计算机软考·东方仙盟
lekami_兰2 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务