centos 7 mysql数据库shell脚本自动备份还原方法

作者: admin 分类: MySQL 发布时间: 2018-02-23 14:50

    目录
 

  1.   系统环境
  2.   原理与工具
  3.   查询数据库名称备份
  4.   新建shell脚本
  5.   修改shell脚本属性,赋予执行权限
  6.   定时执行脚本
  7.   建议
  8.   crontab文件概要
  9.   crontab文件介绍
  10.   MySQL恢复
  11.   导出



这里,我们讲解一种全量备份的方法,来实现定时备份数据到mysql脚本文件,并且支持过期删除。

  系统环境

  CentOS7 64位 Minimal版(VMware)

  MySQL5.7

  原理与工具

  shell脚本

  mysqldump程序

  crontab命令

  查询数据库名称备份

	  show databases; #先查看一下数据库
mysql> show databases;
+-----------------------------+
| Database                    |
+-----------------------------+
| information_schema   |
| dedec d                       |
| mysql                          |
| performance_schema |
| sys                              |
+-----------------------------+
5 rows in set (0.00 sec)
 
mysql> quit
 

  新建shell脚本

	  vi /opt/mysqlBackup.sh
	  #!/bin/bash
	  # 以下配置信息请自己修改
	  mysql_user="USER" #MySQL备份用户
	  mysql_password="PASSWORD" #MySQL备份用户的密码
	  mysql_host="localhost"
	  mysql_port="3306"
	  mysql_charset="utf8" #MySQL编码
	  backup_db_arr=("db1" "db2") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
	  backup_location=/opt/mysql #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
	  expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
	  expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效
	  # 本行开始以下不需要修改
	  backup_time=`date +%Y%m%d%H%M` #定义备份详细时间
	  backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
	  backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
	  backup_dir=$backup_location/$backup_Ymd #备份文件夹全路径
	  welcome_msg="Welcome to use MySQL backup tools!" #欢迎语
	  # 判断MYSQL是否启动,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 "ERROR:MySQL is not running! backup stop!"
	  exit
	  else
	  echo $welcome_msg
	  fi
	  # 连接到mysql数据库,无法连接则备份退出
	  mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <
	  use mysql;
	  select host,user from user where user='root' and host='localhost';
	  exit
	  end
	  flag=`echo $?`
	  if [ $flag != "0" ]; then
	  echo "ERROR:Can't connect mysql server! backup stop!"
	  exit
	  else
	  echo "MySQL connect ok! Please wait......"
	  # 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
	  if [ "$backup_db_arr" != "" ];then
	  #dbnames=$(cut -d ',' -f1-5 $backup_database)
	  #echo "arr is (${backup_db_arr[@]})"
	  for dbname in ${backup_db_arr[@]}
	  do
	  echo "database $dbname backup start..."
	  `mkdir -p $backup_dir`
  `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz` 
  flag=`echo $?` 
  if [ $flag == "0" ];then 
  echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz" 
  else 
  echo "database $dbname backup fail!" 
  fi 
  done 
  else 
  echo "ERROR:No database to backup! backup stop" 
  exit   fi 
  # 如果开启了删除过期备份,则进行删除操作 
  if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then 
  #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;` 
  `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf` 
  echo "Expired backup data delete complete!" 
  fi 
  echo "All database backup success! Thank you!" 
  exit 
  fi

  注意:如果这个sh文件是在win下编辑的,需要用编辑器转换为unix格式,否则sh会执行不成功,如图:

win下编辑器转换为unix格式

 

  修改shell脚本属性,赋予执行权限

	  chmod 600 /opt/mysqlBackup.sh
	  chmod +x /opt/mysqlBackup.sh

  定时执行脚本

  方式一:

  执行crontab -e命令

	  crontab -e

  输入以下内容,设置每天凌晨3:00定时自动备份

	  00 03 * * * /root/mysqlBackup.sh

  方式二:

  打开自动执行文件

	  vi /etc/crontab

  在etc中加入如下内容,让其每天凌晨3:00自动执行任务。


	  00 03 * * * /root/mysqlBackup.sh

  建议

  在添加任务时,可以如下写,表示每分钟备份一次,用以验证是否成功


	  */1 * * * * /usr/sbin/bakmysql.sh1

  看是否每分钟增加一份数据


	  ls /bak/mysqldata

  检查有没安装crond,如果没有,先安装


	  yum -y install vixie-cron

	  yum -y install crontabs

	  启动服务 :service crond start
  在CentOS系统中加入开机自动启动: chkconfig - - level 345 crond on

 

  crontab文件概要

  用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

  minute hour day month week command

  分   时  日  月   周   命令

  其中:

  minute: 表示分钟,可以是从0到59之间的任何整数。(每分钟可用*或者*/1表示)

  hour:表示小时,可以是从0到23之间的任何整数。(0表示0点)

  day:表示日期,可以是从1到31之间的任何整数。

  month:表示月份,可以是从1到12之间的任何整数。

  week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

  command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

  在以上各个字段中,还可以使用以下特殊字符:

  星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

  逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

  中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

  举例如下:

  00 8,12,16 * * * /data/app/scripts/monitor/df.sh

  30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh

  10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh

  10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh

  10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

  43 21 * * * 每天的21:43 执行

  15 05 * * *    每天的05:15 执行

  0 17 * * * 每天的17:00 执行

  0 17 * * 1 每周一的 17:00 执行

  0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行

  0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行

  0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行

  42 4 1 * *     毎月1日的 4:42分 执行

  0 21 * * 1-6   周一到周六 21:00 执行

  0,10,20,30,40,50 * * * * 每隔10分 执行

  */10 * * * *        每隔10分 执行

  * 1 * * *         从1:0到1:59 每隔1分钟 执行

  0 1 * * *         1:00 执行

  0 */1 * * *        毎时0分 每隔1小时 执行

  0 * * * *         毎时0分 每隔1小时 执行

  2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行

  30 5 1,15 * *       1日 和 15日的 5:30 执行

  crontab文件介绍

  /etc/crontab、/etc/cron.deny 、 /etc/cron.allow文件介绍

  系统调度的任务一般存放在/etc/crontab这个文件下,里面存放了一些系统运行的调度程序,通过命令我们可以看一下里面的内容:

[root@hostloiu ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
 

  这些任务都会是系统在运行起来后自动进行调度的。同时在/etc目录下还存放了/etc/cron.deny 和 /etc/cron.allow 文件

  /etc/cron.deny 表示不能使用crontab 命令的用户

  /etc/cron.allow 表示能使用crontab的用户。

  如果两个文件同时存在,那么/etc/cron.allow 优先。

  如果两个文件都不存在,那么只有root用户可以安排作业。

  查看crontab服务状态:systemctl status crond

  crontab 定时执行的日志记录在/var/spool/mail/root中,可查看日志记录


	  vi /var/spool/mail/root

  MySQL恢复


	  mysql -u username -p databse < backup.sql

	  mysqldump -u用户 -p密码 数据库名 <(目录)导入文件名

       导出


	  1mysql>source /root/test.sql

Linux 命令大全

更多

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!