暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL数据库备份脚本

运维特工 2017-09-06
683

一、为什么要写备份数据脚本

大家都知道数据对于每个公司都很重要,这就要求我们必须备份数据了,以便线上数据库出现问题,我们可以快速的使用备份数据进行恢复数据。

备份数据我们也不可能每天都去手动执行备份操作,备份数据一般都是选择数据库访问量比较少的是,像我们一般备份都是凌晨备份,所以我们不能每天半夜起来手动执行备份,我们也没有这个精力做重复性的工作。

这就需要我们写一个备份数据的脚本,并把这个脚本放到系统的定时任务中。

二、脚本内容

1.编写脚本

我们创建脚本为:backup_mysql.sh

  1. #!/bin/bash

  2. #######################

  3. # Name: backup_mysql.sh

  4. # Description: backup mysql db

  5. # Author: pangguoping

  6. # Version:0.0.1

  7. # Datatime: 2017-09-05 15:56:38

  8. # Usage: backup_mysql.sh

  9. #######################

  10. HOST="127.0.0.1"

  11. SQL_PATH="/backup/data/"

  12. DATE=$(date +%F-%H%M)

  13. USER="backup"

  14. PASSWD="unixfbi.com"

  15. LOG_FILE="/tmp/`basename $0`.log"

  16. DB_NAME=(

  17. db1

  18. db2

  19. db3



  20. )

  21. echo start-`date` >> $LOG_FILE

  22. #/usr/bin/mysqldump -h ${HOST} -u ${USER} -p ${PASSWD}  --single-transaction master-data=2 -B ${DB_NAME} > ${SQL_PATH}${DB_NAME}_${DATE}.sql

  23. for ((i=0; i<${#DB_NAME[*]}; i++))

  24. do

  25.   TAR_FILE="${DB_NAME[$i]}-${DATE}.tgz"

  26.   SQL_FILE="${DB_NAME[$i]}-${DATE}.sql"

  27.   /usr/local/mysql/bin/mysqldump -u${USER} -p${PASSWD}  --routines --single-transaction --master-data=2 -B ${DB_NAME[$i]} > ${SQL_PATH}${SQL_FILE} && cd ${SQL_PATH} && tar zcf ${SQL_PATH}${TAR_FILE} ${SQL_FILE} && rm -f ${SQL_FILE}


  28. done


  29. echo end-`date` >> $LOG_FILE

脚本中db1,db2,db3 改成您要备份的数据库名称,HOST,USER,PASSWD按照自己的要求修改即可。

我们采用分库备份的策略; mysqldump命令参数,我们这里使用了:

--routines :导出存储过程以及自定义函数。

--single-transaction:使用该选项备份数据库时不会把数据库给lock住。该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储 引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的 话,应结合使用--quick 选项。

--master-data=2:该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。

--master-data选项启用--lock-all-tables,除非还指定--single-transaction(在这种情况下,只在刚开始转储时短时间获得全局读锁定。又见--single-transaction。在任何一种情况下,日志相关动作发生在转储时。该选项自动关闭--lock-tables。

-B:导出几个数据库。参数后面所有名字参量都被看作数据库名。 备份的文件中会包含 创建数据库的语句;

2.创建备份账号

使用上面的脚本需要先创建一个备份账号backup,该账号的权限一定要严格控制,经测试我们只需要给该账户 select,REPLICATION CLIENT,reload 权限即可。

登录数据库执行如下命令:

  1. mysql> grant select,REPLICATION CLIENT,reload on *.* to backup@'localhost' identified by 'unixfbi.com';

  2. mysql> flush privileges;

3.添加到定时任务

  1. $ crontab -e

  2. 20 03 * * * /bin/bash   /home/unixfbi/scripts/backup_mysql.sh >> /tmp/backup_error.log 2>&1

然后保存,和vim使用一样。

定时任务的意思是:每天凌晨3点20分进行备份数据库。


=========================

您的阅读和关注就是对我最大的鼓励与支持。请长按下面二维码关注我的公众号。谢谢

运维特工,战胜心魔!!


文章转载自运维特工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论