章
目
录
在工作开发过程中,我们经常需要对MySQL数据库的数据进行定时备份,以防数据丢失或误操作导致系统崩溃,那么如何去通过脚本代码实现MySQL定时备份呢?下面潘老师来带大家看下该脚本的具体实现。
一、前期准备
先声明一下,这里的备份时MYSQL的全备,增量备份在后面的一篇文章有写。另外提醒大家一个注意事项,以防有些同学不知道,大家写shell脚本一般都是在window下写,然后上传到Linux系统去运行,而windows系统下的换行符和linux下的换行符是不一样的,如果编辑器格式没调整好直接将写好的shell基本上传的到Linux系统运行很容易报错,一般类似如下这篇文章:
文章目录 问题原因 解决方法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
参数 –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
这个日志文件里去了。
这里潘老师在测试定时执行脚本的时候出现一个奇怪的问题,就是通过定时任务执行的备份文件大小是空的,而通过手工执行的备份文件是正常有数据的,原因在于这里定时任务执行的脚本中出现了错误,如果你也出现了这个问题请参考如下文章去解决:
文章目录 原因分析 解决办法 总结 潘老师最近写了一个MySQL定时备份的shell脚本,但是发现通过定时任务 […]
总结
以上就是MySQL数据库定时备份shell脚本代码全部实现,整体而言还是非常简单的。