👤

重置密码

发送中...
返回登录

数据备份至关重要。

Linux 141 浏览 5 分钟阅读

今晚搞好CDN后在网上冲浪发现一位老博主数据库GG了!

汗颜,这让我仿佛想到了多年前的自己,没有爱备份的习惯,导致数据GG。

现在已经有数据备份的意识了,我把我当前的备份手段分享给大家,供大家参考下,也可以分享下你们的备份机制是怎么做的,互相交流下!

因为我用的腾讯云的服务器,相对而言和一些小众IDC个人觉得还是比较稳定的,所有我的计划是每个月月初凌晨3点自动备份一次数据库和网站的根目录。

先备份数据库,使用的是下面的脚本:

#!/bin/bash

# MySQL备份脚本:每月1号凌晨2点自动备份rpzm数据库

# MySQL连接信息
MYSQL_USER="user"
MYSQL_PASSWORD="password"
MYSQL_DATABASE="rpzm"

# 设置日期格式
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_TIME=$(date +%H%M%S)

# 备份目录
BACKUP_DIR="/data/backup"
MYSQL_BACKUP_DIR="${BACKUP_DIR}/mysql"

# 备份文件名(包含日期和时间)
BACKUP_FILE="${MYSQL_BACKUP_DIR}/rpzm_blog_${BACKUP_DATE}_${BACKUP_TIME}.sql.gz"

# 日志文件
LOG_FILE="${BACKUP_DIR}/mysql_backup.log"

# 检查MySQL服务是否运行
if ! systemctl is-active --quiet mysqld && ! systemctl is-active --quiet mariadb; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:MySQL/MariaDB服务未运行!" >> "$LOG_FILE"
    exit 1
fi

# 检查备份目录是否存在,不存在则创建
if [ ! -d "$MYSQL_BACKUP_DIR" ]; then
    mkdir -p "$MYSQL_BACKUP_DIR"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 创建MySQL备份目录:$MYSQL_BACKUP_DIR" >> "$LOG_FILE"
fi

# 测试MySQL连接
if ! mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:无法连接到MySQL数据库" >> "$LOG_FILE"
    exit 1
fi

# 检查数据库是否存在
if ! mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "USE $MYSQL_DATABASE;" >/dev/null 2>&1; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:数据库 $MYSQL_DATABASE 不存在" >> "$LOG_FILE"
    exit 1
fi

# 执行MySQL备份
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始备份MySQL数据库:$MYSQL_DATABASE ..." >> "$LOG_FILE"

# 使用mysqldump备份并压缩
if mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    "$MYSQL_DATABASE" | gzip > "$BACKUP_FILE" 2>> "$LOG_FILE"; then
    
    # 检查备份文件是否创建成功
    if [ -f "$BACKUP_FILE" ]; then
        FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 数据库备份成功:$BACKUP_FILE (大小: $FILE_SIZE)" >> "$LOG_FILE"
        
        # 获取数据库统计信息
        TABLE_COUNT=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$MYSQL_DATABASE';")
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 数据库 $MYSQL_DATABASE 包含 $TABLE_COUNT 个表" >> "$LOG_FILE"
        
        # 删除90天前的MySQL备份文件(可选)
        find "$MYSQL_BACKUP_DIR" -name "rpzm_blog_*.sql.gz" -mtime +90 -delete 2>/dev/null
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 已清理90天前的MySQL备份文件" >> "$LOG_FILE"
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:数据库备份文件创建失败" >> "$LOG_FILE"
    fi
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:数据库备份过程中出现错误" >> "$LOG_FILE"
fi

echo "$(date '+%Y-%m-%d %H:%M:%S') - MySQL备份任务完成" >> "$LOG_FILE"

然后再备份网站的根目录,使用下面的脚本

#!/bin/bash

# 备份脚本:每月1号凌晨3点自动打包/data/wwwroot目录

# 设置日期格式
BACKUP_DATE=$(date +%Y%m%d)

# 源目录和目标目录
SOURCE_DIR="/data/wwwroot"
BACKUP_DIR="/data/backup"

# 备份文件名(包含日期)
BACKUP_FILE="${BACKUP_DIR}/wwwroot_backup_${BACKUP_DATE}.tar.gz"

# 日志文件
LOG_FILE="${BACKUP_DIR}/backup.log"

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:源目录 $SOURCE_DIR 不存在!" >> "$LOG_FILE"
    exit 1
fi

# 检查目标目录是否存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 创建备份目录:$BACKUP_DIR" >> "$LOG_FILE"
fi

# 执行备份
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始备份 $SOURCE_DIR ..." >> "$LOG_FILE"

# 使用tar命令打包
if tar -czf "$BACKUP_FILE" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" 2>> "$LOG_FILE"; then
    # 检查备份文件是否创建成功
    if [ -f "$BACKUP_FILE" ]; then
        FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份成功:$BACKUP_FILE (大小: $FILE_SIZE)" >> "$LOG_FILE"
        
        # 删除30天前的备份文件(可选)
        find "$BACKUP_DIR" -name "wwwroot_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 已清理30天前的备份文件" >> "$LOG_FILE"
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:备份文件创建失败" >> "$LOG_FILE"
    fi
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:备份过程中出现错误" >> "$LOG_FILE"
fi

echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份任务完成" >> "$LOG_FILE"

当然也可以通过脚本手动执行备份,为了实现任务自动化我将使用了Linux系统自带的crontab命令,创建定时任务计划如下:

还是那句话,数据无价!备份做好!好了,不啰嗦了,就这样。

18

  1. 瓦匠
    瓦匠

    自从转Sqlite后,备份简单多了js直接复制一份文件结束 laugh1

    1. 陈阳
      陈阳 文章作者

      @瓦匠你这个有点高级,还方便嘞

      1. 瓦匠
        瓦匠

        @陈阳我以前也用mysql,备份太麻烦了,就转Sqlite了

  2. 灰常记忆
    灰常记忆

    搞个计划任务 我每天备份2-3次

    1. 陈阳
      陈阳 文章作者

      @灰常记忆会不会太频繁了……

  3. 满心
    满心

    以前也遭遇过,后来涨心眼了,一天一备份,有备无患

    1. 陈阳
      陈阳 文章作者

      @满心一天一次备份,还得是你 good

  4. Vind
    Vind

    我查了宝塔面板自动备份到网盘,是需要付费插件的,按天计算费用,一天几毛钱。但是长期使用下来,一年也要一两百?非商业网站,花这钱就没意思了。还是自己想起来时候去手动下载一次最新备份吧。

    1. 陈阳
      陈阳 文章作者

      @Vind咱不是花不起那点钱,而是自己动手更有意义~

  5. Vind
    Vind

    老IT人了,数据备份应该铭记于心 yes
    obaby的数据损坏好多天了,说是接下来可能换域名重新做。
    我是 宝塔面板每天自动备份的,但是也在服务器本地硬盘,如果这个硬盘数据找不回,估计我的数据也没了。之后要考虑有没有自动备份到网盘或NAS上的方法。不能自动备份的话,就只能定期手动下载了。

    不过我最近也还有把过发的都丢掉,把照片再做整理和精选,然后重新发的想法。

    1. 陈阳
      陈阳 文章作者

      @Vind向你学习,一直精益求精的精神!

  6. ymz316
    ymz316

    备份数据我一直没有找到有效的自动化手段。目前是在navicat中转储和运行sql文件(结构及数据)来备份数据,然后再通过 filezilla 拷贝usr下的backup目录。

    1. 陈阳
      陈阳 文章作者

      @ymz316我们两的方式几乎一样的

  7. fengc's blog
    fengc's blog

    系统固然重要,但系统服务的对象是数据,所以数据才是最重要的。

    1. 陈阳
      陈阳 文章作者

      @fengc’s blog是的!没毛病! blum

  8. 威言威语
    威言威语

    可能她只是想休息休息 laugh

    1. 陈阳
      陈阳 文章作者

      @威言威语原来如此 boast

    2. 公子扶苏
      公子扶苏

      @威言威语威哥言之有理。。。这位小姐姐好多域名的~ https://h4ck.org.cn/ 一般来说,就算没有最新的备份,老一些的备份总会有的

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注