今晚搞好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
自从转Sqlite后,备份简单多了js直接复制一份文件结束
@瓦匠你这个有点高级,还方便嘞
@陈阳我以前也用mysql,备份太麻烦了,就转Sqlite了
搞个计划任务 我每天备份2-3次
@灰常记忆会不会太频繁了……
以前也遭遇过,后来涨心眼了,一天一备份,有备无患
@满心一天一次备份,还得是你
我查了宝塔面板自动备份到网盘,是需要付费插件的,按天计算费用,一天几毛钱。但是长期使用下来,一年也要一两百?非商业网站,花这钱就没意思了。还是自己想起来时候去手动下载一次最新备份吧。
@Vind咱不是花不起那点钱,而是自己动手更有意义~
老IT人了,数据备份应该铭记于心
obaby的数据损坏好多天了,说是接下来可能换域名重新做。
我是 宝塔面板每天自动备份的,但是也在服务器本地硬盘,如果这个硬盘数据找不回,估计我的数据也没了。之后要考虑有没有自动备份到网盘或NAS上的方法。不能自动备份的话,就只能定期手动下载了。
不过我最近也还有把过发的都丢掉,把照片再做整理和精选,然后重新发的想法。
@Vind向你学习,一直精益求精的精神!
备份数据我一直没有找到有效的自动化手段。目前是在navicat中转储和运行sql文件(结构及数据)来备份数据,然后再通过 filezilla 拷贝usr下的backup目录。
@ymz316我们两的方式几乎一样的
系统固然重要,但系统服务的对象是数据,所以数据才是最重要的。
@fengc’s blog是的!没毛病!
可能她只是想休息休息
@威言威语原来如此
@威言威语威哥言之有理。。。这位小姐姐好多域名的~ https://h4ck.org.cn/ 一般来说,就算没有最新的备份,老一些的备份总会有的