MySQL数据库定时备份脚本代码实现

Java技术 潘老师 2年前 (2022-02-28) 1234 ℃ (0) 扫码查看

在工作开发过程中,我们经常需要对MySQL数据库的数据进行定时备份,以防数据丢失或误操作导致系统崩溃,那么如何去通过脚本代码实现MySQL定时备份呢?下面潘老师来带大家看下该脚本的具体实现。

一、前期准备

先声明一下,这里的备份时MYSQL的全备,增量备份在后面的一篇文章有写。另外提醒大家一个注意事项,以防有些同学不知道,大家写shell脚本一般都是在window下写,然后上传到Linux系统去运行,而windows系统下的换行符和linux下的换行符是不一样的,如果编辑器格式没调整好直接将写好的shell基本上传的到Linux系统运行很容易报错,一般类似如下这篇文章:

Linux系统执行shell脚本提示^M报错问题解决

文章目录 问题原因 解决方法1:windows本地解决 解决方法2:Linux系统上解决 1)编辑重设编码 2 […]

因此我们一般使用Notepad++去写会比较好,并且要将编码设置为UTF-8和右下角的格式设置为unix的脚本文件格式,具体的参考上面的这篇文章即可。

二、MySQL定时备份脚本

下面我们直接看下MySQL定时备份脚本,它的代码实现如下:

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="****"
mysql_password="****"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4"
#设置需要备份的数据库(此处假设数据库是scada)
db_name="scada"
# 备份数据和日志存放地址(根据实际情况填写,如果不存在需要自己创建好该目录)
backup_dir=/home/mysql/backup
backup_data=$backup_dir/data
backup_log=$backup_dir/log
#备份时间
backup_time=`date +%Y%m%d%H%M`
log_time=`date +'%Y-%m-%d %H:%M:%S'`
# 是否删除过期数据
expire_backup_delete="ON"
expire_days=5
welcome_msg="start backup $db_name database, please wait..."
#备份文件目录(这里为了节约磁盘空间,进行了压缩)
filename=$backup_data/$db_name-$backup_time.sql.gz
# 判断mysql实例是否正常运行
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo "$(date +'%Y-%m-%d %H:%M:%S'): ERROR:MySQL is not running! backup stop!"
        exit
else
        echo "$(date +'%Y-%m-%d %H:%M:%S'):$welcome_msg"
fi
# 备份指定数据库中数据(定时执行时mysqldump最好写成全路径,参考文章最后)
mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $db_name | gzip > $filename
flag=`echo $?`
if [ $flag == "0" ];then
        echo "$(date +'%Y-%m-%d %H:%M:%S'): database $db_name success backup to $filename"
else
        echo "$(date +'%Y-%m-%d %H:%M:%S'): database $db_name backup fail!"
fi

# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a  "$backup_data" != "" ];then
        `find $backup_data/ -type f -mtime +$expire_days | xargs rm -rf`
        echo "$(date +'%Y-%m-%d %H:%M:%S'): Expired backup data delete complete!"
fi
提示:mysqldump支持指定一些参数来实现一些功能,关于mysqldump的一些参数说明如下:
参数 –lock-all-tables:锁定所有数据库;
参数 -A:备份所有库;
参数 -B:指定多个库,增加建库语句和 use 语句;
参数 -F:刷新 binlog 日志;
参数 –master-data=0|1|2:
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句;
参数 –single-transaction:适合 innodb 事务数据库备份;
参数 –events:导出事件;
参数 gzip:备份压缩文件。

三、上传文件授权

我们将该MySQL备份脚本文件命名为mysqlbackup.sh,然后上传到linux系统,然后添加执行权限:

chmod +x mysqlbackup.sh

这时候我们其实就已经可以手工执行脚本进行备份操作了。但是一般我们会定时执行备份功能,所有请继续往下看。

四、创建定时任务

最后我们需要定时任务,这里使用crontab的方式,需要配置如下:

#执行如下命令
crontab -e

然后新增如下定时配置:

#mysql定时备份,这里是每天23点执行
00 23 * * * /home/mysql/backup/script/mysqlbackup.sh >> /home/mysql/backup/log/mysql_backup.log

然后我们这里还将脚本的输出都写入到mysql_backup.log这个日志文件里去了。

注意

这里潘老师在测试定时执行脚本的时候出现一个奇怪的问题,就是通过定时任务执行的备份文件大小是空的,而通过手工执行的备份文件是正常有数据的,原因在于这里定时任务执行的脚本中出现了错误,如果你也出现了这个问题请参考如下文章去解决:

crontab定时执行mysql备份脚本出错导致数据为空

文章目录 原因分析 解决办法 总结 潘老师最近写了一个MySQL定时备份的shell脚本,但是发现通过定时任务 […]

最后给大家看下运行的日志输出:
MySQL数据库定时备份日志

总结

以上就是MySQL数据库定时备份shell脚本代码全部实现,整体而言还是非常简单的。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/4582.html
喜欢 (2)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】