MySQL数据库的定时备份实践

MySQL
placeholder image
admin 发布于:2023-03-19 09:48:51
阅读:loading

1.背景介绍

也许你会发现本站建站时间久远,但是本站的各类访问量总是很低,这大概是有两个方面的原因,其一是因为本站升级2.0后,所有的文章访问数据并未同步(不仅仅是文章,所有的数据均为同步,比如用户数据等,也许是这些数据并不重要吧);另一个原因则是大概在十天前执行了一个update语句(默认的MySQL客户端事务为自动提交的),把所有文章的访问量全给清零了,关于系统全站的访问量数据也是本站2.0近期(一个月内)才完善增加的,前者原因是主动放弃的,后者却是自己失误所致,所以本篇文章主要是来实现一个MySQL数据库的定时备份,也算是让数据更加安全点吧(也许站点被黑,资料被丢失了呢)。

2.备份脚本

本篇文章所实现的MySQL数据库定时备份,主要是实现与个人的契合度较高的实现,若对数据有非常高的要求,则需要使用实时备份或同步的方式实现(不是本次实践的目的),以shell脚本的方式编写备份脚本文件,并加入至系统的定时任务中,被自动执行,参考备份脚本文件(命名为backup.sh)如下文所示。

#!/bin/bash

#
# Copyright (c) 2023 by chendd 88911006
# 简单备份MySQL数据库脚本
# All rights reserved.

#数据库IP
MYSQL_HOST="localhost"
# 数据库名称
MYSQL_DATABASE="chendd-blog"
# 数据库用户名
MYSQL_USERNAME="root"
# 数据库密码
MYSQL_PASSWORD="root"
# 备份根路径
BACKUP_DIR=$(cd `dirname $0`; pwd)
# 年月日时分秒
DATETIME=$(date +%Y%m%d_%H%M%S)

# 如果不指定jdk则使用默认
if [[ -n "$MYSQL_HOME" ]] && [[ -x "$MYSQL_HOME/bin/mysqldump" ]]; then
    
MYSQL_EXE="$MYSQL_HOME/bin/mysqldump"
elif type -p mysqldump > /dev/null 2>&1; then
    
MYSQL_EXE=$(type -p mysqldump)
elif [[ -x "/app/mysql/bin/mysqldump" ]];  then
    
MYSQL_EXE="/app/mysql/bin/mysqldump"
else
    
echo "$(date "+%Y-%m-%d %H:%M:%S") ERROR Unable to find MySQL mysqldump" >> ${BACKUP_DIR}/backup.log
    
exit 1
fi

#输出一个空行
echo " " >> ${BACKUP_DIR}/backup.log
echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 开始执行批次为 [$DATETIME] 的备份" >> ${BACKUP_DIR}/backup.log

# 备份命令
COMMAND="$MYSQL_EXE --host=$MYSQL_HOST --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD $MYSQL_DATABASE > $BACKUP_DIR/backup_${MYSQL_DATABASE}_${DATETIME}.sql"
echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 开始备份数据库,命令为:$COMMAND" >> ${BACKUP_DIR}/backup.log
# 执行备份语句
echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 结束备份" >> ${BACKUP_DIR}/backup.log
/bin/sh -c "$COMMAND"
# 压缩命令(保留压缩原sql文件)
echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 开始压缩数据库文件" >> ${BACKUP_DIR}/backup.log
gzip -c $BACKUP_DIR/backup_${MYSQL_DATABASE}_${DATETIME}.sql > $BACKUP_DIR/backup_${MYSQL_DATABASE}_${DATETIME}.sql.gz
echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 结束压缩" >> ${BACKUP_DIR}/backup.log

#删除10天之前的备份
find ${BACKUP_DIR} -name backup_"*.sql" -type f -mtime +10 -exec rm -rf {} \; >> ${BACKUP_DIR}/backup.log
find ${BACKUP_DIR} -name backup_"*.sql.gz" -type f -mtime +10 -exec rm -rf {} \; >> ${BACKUP_DIR}/backup.log

echo "$(date "+%Y-%m-%d %H:%M:%S") INFO 结束执行批次为 [$DATETIME] 的备份" >> ${BACKUP_DIR}/backup.log

3.备份脚本介绍

(1)假设脚本命令为《bachup.sh》,需要赋予可执行文件的权限;

(2)有限查找MYSQL_HOME的环境变量,如果找不到默认的MySQL安装路径为/app/mysql;

(3)配置的参数有MySQL数据库服务器IP、数据库用户名、数据库密码、数据库名称、备份文件路径,这些参数需要按需自行调整;

(4)每个关键脚本执行后输出一些提示至命令的日志记录文件《backup.log》中,格式为:日期时间 + 日志级别 + 描述信息;每次开始执行和结束执行分别有提示信息;

(5)默认只备份一个数据库,本脚本不适用于备份多个数据库的场景;

(6)生成备份sql文件的格式命名为《backup_数据库名_脚本执行日期_脚本执行时间.sql》;

(7)将生产的备份sql文件压缩为《backup_数据库名_脚本执行日期_脚本执行时间.sql.gz》的压缩包文件,文件压缩后默认不删除原sql格式文件;

(8)按照文件命名格式每次在执行后,将删除10天之前的文件,在实践过程中验证过删除1分钟之前备份文件的,且定时任务的触发频率为1分钟;

4.定时执行脚本

# 查看定时任务列表:每天临时0:30分触发
crontab -l
# 增加定时任务:
echo '30 0 0 * *  sh /app/backup.sh' >> /var/spool/cron/root
#刷新定时任务
service crond reload

5.运行结果

image.png

(手工运行脚本)

image.png

(脚本执行日志)

image.png

(脚本执行文件)

脚本下载:backup.zip

 点赞


 发表评论

当前回复:作者

 评论列表


留言区