shell脚本实现mysql定时备份、删除、恢复功能

mysql备份脚本:

脚本实现:按照数据库名称,全量备份mysql数据库并定期删除

#!/bin/bash
#全备方式,一般在从机上执行,适用于小中型mysql数据库
#删除15天以前备份
#作者:lcm_linux
#时间:2019.08.06

source ~/.bash_profile #加载用户环境变量
set -o nounset    #引用未初始化变量时退出
set -o errexit   #执行shell命令遇到错误时退出
#备份用户---需要在mysql中提前创建并授权
#GRANT SELECT,RELOAD,LOCK TABLES,REPLICATION CLIENT,SHOW VIEW,TRIGGER,EVENT ON *.* TO 'backup'@'%' IDENTIFIED BY 'baifendian';
user="backup"
#备份用户密码
password="123456"
#mysql连接端口
port="3306"
mysql_path="/usr/local/mysql"
date=$(date +%Y-%m-%d_%H-%M-%S)
del_date=$(date +%Y-%m-%d)
#备份路径---需要修改
backup_path="/opt/mysql_backup/new-bak/data"
backup_log_path="/opt/mysql_backup/new-bak/log"
day=0
backup_log="/opt/mysql_backup/new-bak/log/mysqldump_backup_${date}.log"
# 除了127.0.0.1以外的ip截取 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
#删除以前备份
find ${backup_path} -type f -mtime +$day -name "*.tar.gz" -exec rm -rf {} \; > /dev/null 2>&1 

for f in `ls $backup_path`;
do
  if [[ $f = ${del_date}_* ]]; then
    rm -rf $backup_path/$f
  fi
done
#建立备份目录
if [ ! -e $backup_path/${date} ];then
 mkdir -p {$backup_path/${date},$backup_log_path}
fi

#echo "开始备份所有数据库"
echo "备份开始,结果查看 $backup_log"
echo "==========All databases backups begin==========" >>$backup_log
#备份并压缩
 for dbname in $(mysql -P$port -u$user -p$password -A -e "show databases\G"|grep Database|grep -v schema|grep -v test|awk '{print $2}')
 do
 sleep 1
 mysqldump -P$port -u$user -p$password $dbname > $backup_path/${date}/$dbname.sql
 if [[ $? == 0 ]];then
  cd $backup_path/${date}
  size=$(du $backup_path/${date}/$dbname.sql -sh | awk '{print $1}')
  echo "备份时间:${date} 备份方式:mysqldump 备份数据库:$dbname($size) 备份状态:成功!" >>$backup_log
 else
  cd $backup_path/${date}
  echo "备份时间:${date} 备份方式:mysqldump 备份数据库:${dbname} 备份状态:失败,请查看日志." >>$backup_log
 fi

 done

 cd $backup_path
 tar zcpvf mysql_all_databases_$date.tar.gz $date
 rm -rf $backup_path/$date

du mysql_all_databases_$date.tar.gz -sh | awk '{print "文件:" $2 ",大小:" $1}'
echo "==========All databases backups over==========" >>$backup_log

配置定时任务:

crontab -e

内容如下:

0 1 * * * /bin/bash /opt/script/mysql_shell/mysqlbackup.sh

附上恢复脚本A:

目标实现:对于删除数据库,根据上述备份脚本产生的备份文件内容,进行恢复数据库操作,包括创建数据库名称

注意:恢复脚本需要手动操作

#! /bin/bash
source /etc/profile  #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset    #引用未初始化变量时退出
set -o errexit   #执行shell命令遇到错误时退出
date_tar=$(date +%Y-%m-%d_%H-%M-%S)
date=$(date +%Y-%m-%d)
local_path=${PWD}
user="root"
#备份用户密码
password="123456"
#mysql连接端口
port="3306"
DB_HOST=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
mysql_path="/usr/local/mysql"
read -ep "请输入数据库备份文件的路径: " choose_path
if [ ! -d ${choose_path} ];then
	echo "请输入正确路径,已退出"
	exit
else
echo "以下为检测到的数据库文件名称:"
cd ${choose_path}
for file in $(ls ${choose_path})
do
  [ -f ${file} ] && echo ${file%.*} && echo ${file%.*} >> ${local_path}/list.txt #先判断是否是目录,然后再输出
done
fi
cat_list=`cat ${local_path}/list.txt`
function recovery(){
    for dbname in ${cat_list};do
        sleep 1
        create_db="create database IF NOT EXISTS \`${dbname}\`"
        mysql -h$DB_HOST -P$port -u$user -p$password -e "${create_db}"
        mysql -h$DB_HOST -P$port -u$user -p$password -A $dbname < ${choose_path}/$dbname.sql
         if [[ $? == 0 ]];then
            echo "恢复时间:${date} 恢复方式:mysqldump 恢复数据库:$dbname 恢复状态:成功!" >> $local_path/recovery_${date}.log
        else
            echo "恢复时间:${date} 恢复方式:mysqldump 恢复数据库:${dbname} 恢复状态:失败,请查看日志." >> $local_path/recovery_${date}.log

        fi
    done  

}

read -ep "全部恢复输入(A/a),单个恢复输入(B/b):" choose
    if [ $choose = 'A' -o $choose = 'a' ];then
	recovery
	 elif [ $choose = 'B' -o $choose = 'b' ];then
	   read -ep "正在单个恢复数据库,请输入想要恢复的数据库名称:" mydatabase
       echo "正在恢复$mydatabase 请稍后....."
	   create_db="create database IF NOT EXISTS \`${mydatabase}\`"
	   mysql -h$DB_HOST -P$port -u$user -p$password -e "${create_db}"
       mysql -h$DB_HOST -P$port -u$user -p$password -A $mydatabase < $choose_path/$mydatabase.sql
       echo "$mydatabase 已成功恢复,恭喜!"
    	   exit			

	else
		echo "输入不符合规则,请重新执行..."
	   exit
	  fi	

附上恢复脚本B:

脚本实现:在未删除数据库的情况下,对mysql数据库进行数据恢复,可以选择全部恢复或者逐个恢复。

注意:恢复脚本需要手动操作

#! /bin/bash
source /etc/profile  #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset    #引用未初始化变量时退出
set -o errexit   #执行shell命令遇到错误时退出
user="root"
#备份用户密码
password="123456"
#mysql连接端口
port="3306"
DB_HOST=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
mysql_path="/usr/local/mysql"
date=$(date +%Y-%m-%d_%H-%M-%S)
#备份路径---需要修改
#recovery_path="/opt/mysql_backup/new-bak"
#recovery_log="${recovery_path}/mysqldump_recovery_${date}.log"
mysql_list=`mysql -h$DB_HOST -P$port -u$user -p$password -A -e "show databases\G"|grep Database|grep -v schema|grep -v test|awk '{print $2}'`
echo "数据库名称列表如下:"
echo "${mysql_list}"

read -p "全部恢复输入(A/a),单个恢复输入(B/b):" choose
#echo $choose
#	if [ $choose = 'A' -o $choose = 'a' -o $choose != 'B' -o $choose != 'b' ];then
    if [ $choose = 'A' -o $choose = 'a' ];then
	read -p "正在准备恢复全部数据库,请输入恢复数据文件所在路径:" allpath
		if [ ! -d $allpath ];then
			echo "此路径不存在,请重新执行..."
			exit
		fi
	for dbname in ${mysql_list};do
		sleep 1
		create_db="create database IF NOT EXISTS ${dbname}"
		mysql -h$DB_HOST -P$port -u$user -p$password -e "${create_db}"
		mysql -h$DB_HOST -P$port -u$user -p$password -A $dbname < $allpath/$dbname.sql
		 if [[ $? == 0 ]];then
			cd $allpath
  			size=$(du $allpath/$dbname.sql -sh | awk '{print $1}')
  			echo "恢复时间:${date} 恢复方式:mysql 恢复数据库:$dbname($size) 恢复状态:成功!" >> $allpath/recovery_${date}.log
 		else
  			cd $allpath
  			echo "恢复时间:${date} 恢复方式:mysqldump 恢复数据库:${dbname} 恢复状态:失败,请查看日志." >> $allpath/recovery_${date}.log

		fi
	done
	 elif [ $choose = 'B' -o $choose = 'b' ];then
	   read -p -e "正在单个恢复数据库,请输入想要恢复的数据库名称:" mydatabase
	   read -p -e "请输入数据库恢复的路径:" mypath
		if [ ! -d $mypath ];then
    		echo "此路径不存在,请重新执行..."
    		 	exit
		elif [ ! -f $mypath/$mydatabase.sql ];then
			echo "此路径下没有目标数据库文件,请重新执行..."
			exit
		   elif [ $mydatabase != $mysql_list ];then
                echo "$mydatabase 不在此数据库中,请确认数据库名称后再试,再见!"
			 else
                echo "正在恢复$mydatabase 请稍后....."
								create_db="create database IF NOT EXISTS ${dbname}"
								mysql -h$DB_HOST -P$port -u$user -p$password -e "${create_db}"
                mysql -h$DB_HOST -P$port -u$user -p$password -A $mydatabase < $mypath/$mydatabase.sql
                echo "$mydatabase 已成功恢复,恭喜!"
    			 	exit
			 fi
#		   fi
#		fi
#	   fi
	else
#	  if [ $choose != 'B' -o $choose != 'b' -o $choose != 'A' -o $choose != 'a' ];then
		echo "输入不符合规则,请重新执行..."
	   exit
	  fi

总结

以上所述是小编给大家介绍的 shell脚本实现mysql定时备份、删除、恢复 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 使用shell脚本每天对MySQL多个数据库自动备份的讲解

    Linux下使用shell脚本,结合crontab,定时备份MySQL下多个数据库,每次备份的数据存放于以日期命名的文件夹中,同时删除超过设定的备份保留时间的数据. 以下例子设定备份保留时间为1个月(-1month),可根据需求修改 #! /bin/bash # MySQL用户 user="root" # MySQL密码 userPWD="123456" # 需要定时备份的数据表列表 dbNames=(db_test1 db_test2 db_test3 db_te

  • 完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存

    今天学习php,当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境, 一键安装对新手很友好,与时作为一个新手,便跟着教程安装了phpstudy集成环境. 很快安装好了,嗯.对新手确实很友好.phpmyadmin,Apache,php直接配置安装好了.省去了很多时间. 可是安装后却遇到一个麻烦事,就是这个Mysql启动后就会过几秒就显示Mysql已经停止(这个是我现在的我已经解决这个问题了,应该是个红色的方框,不要介意,/嘿嘿).重启了很多遍.还是无法启动. 这个时候不仅ph

  • mysql 从 frm 文件恢复 table 表结构的3种方法【推荐】

    mysql 正常运行的时候,查看 table 的结构并不是困难的事. 但是有时 mysql 发生故障,这种方法便不再可行. 当遇到故障,通常使用新的 mysql 实例来恢复当前的数据. 建表是非常重要的步骤,我们必须有其它的方法来寻找 table 的结构. table 结构定义在哪里 通常关注的用户数据,底层都实际存储在 mysql 数据目录.  其它的元数据也不例外,比如 table 表结构的定义. mysql 数据目录文件结构是非常清晰的, •目录对应数据库 •frm 文件存储了 table

  • mysql中mysql-bin.000001是什么文件可以删除吗

    用ports安装了mysql以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001.mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的. 这样做主要有以下两个目的: 1:数据恢复 如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题

  • MySQL数据库定时备份的实现方法

    1. 创建shell脚本 vim backupdb.sh 创建脚本内容如下: #!/bin/sh db_user="root" db_passwd="123456" db_name="userdb" name="$(date +"%Y%m%d%H%M%S")" /usr/bin/mysqldump -u$db_user -p$db_passwd $db_name >>/home/backup/$

  • MySQL数据库运维之数据恢复的方法

    之前三篇文章分别介绍了MySQL数据库常见的备份方法,其中包括逻辑备份和物理备份,本篇将总结一下MySQL数据库的数据恢复相关内容.这些数据恢复方案在之前备份内容介绍时,此处总结一下恢复方案,并结合数据库的二进制日志做下数据恢复的示范! 一.恢复方案 1.数据量不是特别大,可以将mysqldump命令备份的数据使用mysql客户端命令或者source命令完成数据的恢复: 2.使用Xtrabackup完成数据库的物理备份恢复,期间需要重启数据库服务: 3.使用LVM快照卷完成数据库物理备份恢复,期

  • shell脚本操作mysql数据库删除重复的数据

    由于之前的业务,造成数据库上产生了脏数据,写个脚本删除重复的数据.由于是开发测试环境,所以选择任意删除相同uid中的一条.由于每次执行只删除重复数据的一条,需要重复执行,如果本轮没有数据被删就OK #!/bin/sh # delete all company's duplicate uid MYSQL_BIN_PATH=/data/mysql/server/mysql_3306/bin MYSQL_SOCK_PATH=/data/mysql/server/mysql_3306/tmp DBUSE

  • shell脚本实现mysql定时备份、删除、恢复功能

    mysql备份脚本: 脚本实现:按照数据库名称,全量备份mysql数据库并定期删除 #!/bin/bash #全备方式,一般在从机上执行,适用于小中型mysql数据库 #删除15天以前备份 #作者:lcm_linux #时间:2019.08.06 source ~/.bash_profile #加载用户环境变量 set -o nounset #引用未初始化变量时退出 set -o errexit #执行shell命令遇到错误时退出 #备份用户---需要在mysql中提前创建并授权 #GRANT

  • shell脚本实现mysql数据库双机定时备份的方法

    目录 1 缘起与目的 2 确认环境 2.1 导出数据库sql脚本 2.2 跨机器拷贝 2.3 docker容器确认环境 3 构建脚本 3.1 脚本内容 3.2 手动执行脚本确认正常 4 定时任务 1 缘起与目的 最近有个需求,要求实现对某个数据库进行双机备份,每天凌晨备份一次,要求主机器只保留最近十五天的记录.经过深思熟虑的研究(疯狂baidu),我们决定用shell脚本加定时任务的方式来实现这个需求. 考虑到有的小伙伴mysql使用docker部署,最后我们也会贴出docker环境下的部署脚本

  • 用shell写一个mysql数据备份脚本

    思路 其实很简单 写一个shell脚本通过mysql的mysqldump,将数据导出成对应的sql文件:使用linux的crontab定时运行对应脚本,将sql,文件保存到对应的目录下:可想而知,随着数据量的增加和备份的频率都会导致备份服务器的硬盘资源使用率也会直线攀升:为了解决这个问题,我们就需要,定时清理备份内容:而我还是简单的使用了个shell脚本,通过crontab定时去清理: 注意 这里有几个问题需要注意的: 通过mysqldump来导出对应的库表的sql,这样必然会造成mysql服务

  • Windows下MySQL定时备份脚本的实现

    在windows服务器上,想要定时备份数据库数据,可采用windows的任务计划程序+数据库备份脚本组合.其中,MySQL数据库备份,起到关键作用是mysqldump.有关于mysqldump命令的用法,可以找MySQL的官方文档了解. 1 备份脚本 @echo off echo 设置MySql数据库的连接信息 set host=127.0.0.1 set port=3306 set user=root set pass=admin echo 设置要备份MySql数据库名称 set dbname

  • MySQL定时备份方案(利用Linux crontab)

    前言 虽说现在这世道有些爱情是有价的,但是数据是无价的,数据备份是尤为的重要,可以在你未来的某一天不小心删库了,不用着急跑路. 本片文章介绍的方案是利用Linux自身的crontab定时任务功能,定时执行备份数据库的脚本. 技术要点: 数据库备份dump命令 shell脚本 Linux定时任务crontab 数据备份dump 数据库都有一个导出数据库内数据和结构的命令,就是备份. 将备份的数据还原会将原来的数据中的表删了重建,再插入备份中的数据,这是恢复. 这一点需要注意,如果恢复之前的数据比备

  • 浅析mysql 定时备份任务

    简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份.而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份.首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份. 本文章的mysql数据库是安装在docker容器当中,以此为例进行讲解.没有安装到docker容器当中也可以参照参照. contab定时任务 使用crontab -e来编写我们的定时任务. 0 5 * * 1 [command] 前面的5个数字分别代表分.时.日.月.

  • MySQL定时备份数据库(全库备份)的实现

    目录 一.MySQL数据备份 1.1. mysqldump命令备份数据 1.2. mysqldump常用操作示例 1.3. 还原mysql备份内容 二. 编写脚本维护备份的数据库文件 2.1. 编写BASH维护固定数量备份文件 2.2. 使用crontab定期执行备份脚本 一.cron服务 二.crontab语法 三.创建cron脚本 三.执行效果截图 本文参考: 一.MySQL数据备份 1.1. mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具m

  • centos7中如何利用crontab进行mysql定时备份

    目录 centos7用crontab进行mysql定时备份 备注 附crontab文件的一些例子 总结 centos7用crontab进行mysql定时备份 1.建立 mysql3306_backup.sh 文件 文件名及路径可以自定义,个人习惯将脚本.脚本日志.备份的数据放在mysql的data路径下,方便查找 mysql3306_backup.sh内容: #!/bin/bash # 以下配置信息请自己修改 mysql_user="USER" #MySQL备份用户 mysql_pas

  • Navicat for MySQL定时备份数据库及数据恢复详解

    在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库.本篇文章主要讲述Navicat for MySQL定时备份数据库和数据恢复等功能,同时可以定时播放电影等设置,希望对您有所帮助,如果文章中存在错误或不足之处,还请海涵~ 一. 设置计划任务定时备份数据库 计划任务就是让电脑在指定的时间内执行指定的动作,这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的!其实再通俗一点也就是相当于你在那个时间里面进行了对某个东西对鼠标双击的操作. 1.

  • 深入分析MySQL 的备份和恢复机制

    本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型: MyISAM 和 Innodb ,文中设计的 MySQL 版本为 5.0.22. 目前 MySQL 支持的免费备份工具有: mysqldump.mysqlhotcopy ,还可以用 SQL 语法进行备份: BACKUP TABLE 或者 SELECT INTO OUTFILE ,又或者备份 二进制日志(binlog) ,还可以是 直接拷贝数据文件和相关的配置文件 .MyISAM 表是保存成文件的形式,因此相对比

随机推荐