MySQL自动备份脚本实战

说明

该脚本实现了自动备份MySQL数据库中任意数据库,适合放在crond中运行,定时备份数据库,且在有需要的时候实现自动恢复备份。该脚本只针对库备份,无法实现对表备份

配置信息

DB_HOST=192.168.0.51 				#数据库主机IP
DB_PORT=3306						#数据库端口
DB_USER=root						#以什么身份运行
DB_PASSWORD=password				#数据库密码
DB_EXPIRE=7							#自动清理一周以前的备份文件
DB_BACKUP_DIR=/backup/mysql			#备份文件保存位置
BASE_DIR=$(cd $(dirname $0);pwd) 	#脚本运行的路径
BACK_LOG=$BASE_DIR/backup.log		#备份与恢复日志保存位置

命令格式

# 备份
	bash mysql-backup.sh backup database-name1 database-name2 database-name3 .....
# 恢复
	bash mysql-restore.sh restore /the/path/backup1.sql.gz /the/path/backup2.sql.gz .....

日志内容

--------------------------------------------
[ OK ] 当前身份: ROOT
[ OK ] 时间: 2021-05-09 22:05:56,需要备份的数据库有: test1 test2
[ OK ] 时间: 2021-05-09 22:05:58,数据库: test1 备份成功,备份文件存放路径为: /backup/mysql/test1-2021-05-09.sql.gz
[ OK ] 时间: 2021-05-09 22:05:00,数据库: test2 备份成功,备份文件存放路径为: /backup/mysql/test2-2021-05-09.sql.gz
--------------------------------------------
[ OK ] 当前身份: ROOT
[ OK ] 时间: 2021-05-09 22:05:14,需要恢复的备份有: /backup/mysql/test1-2021-05-09.sql.gz /backup/mysql/test2-2021-05-09.sql.gz
[ OK ] 时间: 2021-05-09 22:05:18,/backup/mysql/test1-2021-05-09.sql.gz 备份文件恢复成功
[ OK ] 时间: 2021-05-09 22:05:21,/backup/mysql/test2-2021-05-09.sql.gz 备份文件恢复成功

脚本内容

#!/bin/bash 
DB_HOST=192.168.0.51
DB_PORT=3306
DB_USER=root
DB_PASSWORD=password
DB_EXPIRE=7
DB_BACKUP_DIR=/backup/mysql
BASE_DIR=$(cd $(dirname $0);pwd)
BACK_LOG=$BASE_DIR/backup.log

function error_text(){	
	echo "[ ERROR ] $@" >>$BACK_LOG
}

function ok_text(){
	echo "[ OK ] $@" >>$BACK_LOG
}

function check_dir(){
	if [ ! -d $DB_BACKUP_DIR ]; then
		mkdir -p /backup/mysql
	fi
}

function check_user(){
	if [ $(id -u -n) != "root" ];then
		error_text "请使用root运行脚本"
		exit 1
	else
		ok_text "当前身份: ROOT"
	fi
}

function check_mysql(){
	# 检查服务是否起来
	if [ $(ps -aux|grep mysql|grep -v mysql-backup|grep -v grep|wc -l) -eq 0 ]; then
		error_text "MySQL服务没有启动"
        exit 1
	fi
	# 连接数据库,检查是否能正常使用
	mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -e "show processlist;" &>/dev/null
	if [ $? -ne 0 ]; then
		error_text "MySQL服务异常"
        exit 1
	fi
}

function backup(){
	# 检查是否带了备份数据库的参数
	if [ $# -eq 0 ]; then
    	echo -e "[ ERROR ] 必须在脚本后边带要备份的数据库,空格分开多个数据库" >> $BACK_LOG
    	exit 1
	fi

	# 开始备份
    ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),需要备份的数据库有: $@"
	for i in $@
	do
		if [ $(mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -e "show databases"|grep -oE "^$i$"|wc -l) -ne 1 ]; then
			error_text "数据库: $i 备份失败,没有这个库" >>$BACK_LOG
		else
			mysqldump -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -B $i --master-data=2 --single-transaction|gzip>${DB_BACKUP_DIR}/${i}-$(date "+%F").sql.gz	
			if [ $? -eq 0 ];then
				ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),数据库: $i 备份成功,备份文件存放路径为: ${DB_BACKUP_DIR}/${i}-$(date "+%F").sql.gz"
			else
				error_text "数据库: $i 备份失败" >>$BACK_LOG
			fi
		fi
	done	
}

function check_expire(){
	find  $DB_BACKUP_DIR -mtime +7 -exec rm -rf {} \;
}

function restore(){
	# 检查是否带了恢复数据库的参数
	if [ $# -eq 0 ]; then
    	echo -e "[ ERROR ] 必须在脚本后边带要恢复的数据库,空格分开多个数据库" >> $BACK_LOG
    	exit 1
	fi

	# 开始恢复
    ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),需要恢复的备份有: $@"
	for i in $@
	do
		if [ ! -f $i ]; then
			error_text "$i 备份文件不存在,无法恢复"
		else
			if [[ "$i" == *".gz" ]]; then
				/bin/bash -c gunzip < $i | mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD
				if [ $? -eq 0 ]; then
					ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),$i 备份文件恢复成功"
				else
					error_text "$i 备份文件恢复失败"
				fi
			else
				error_text "$i 文件格式不对,无法恢复"
			fi
		fi
	done	
}

function useage(){
  echo -e "\033[32m***************************************\033[0m"
  echo -e "\033[32mMySQL数据库备份与恢复管理脚本使用帮助\033[0m"
  echo -e "\033[32mUsage: \033[0m"
  echo -e "\033[32m   backup 要备份的数据库名字(空格隔开)\033[0m"
  echo -e "\033[32m   restore 要恢复的数据库文件(空格隔开)\033[0m"
  echo -e "\033[32mMySQL 脚本配置信息                       \033[0m"
  echo -e "\033[32mMySQL IP: $DB_HOST                     \033[0m"
  echo -e "\033[32mMySQL PORT: $DB_PORT                   \033[0m"
  echo -e "\033[32mMySQL USER: $DB_USER                   \033[0m"
  echo -e "\033[32mMySQL PASSWORD: $DB_PASSWORD           \033[0m"
  echo -e "\033[32mMySQL LOG: $BACK_LOG                   \033[0m"
  echo -e "\033[32mMySQL EXPIRE: ${DB_EXPIRE}day          \033[0m"
  echo -e "\033[32mMySQL BACKUP DIR: $DB_BACKUP_DIR       \033[0m"
  echo -e "\033[32m***************************************\033[0m"
}

action=$1
case $1 in
    backup)
		echo "--------------------------------------------" >>$BACK_LOG
        shift
		check_user 
		check_mysql
		check_dir
		backup $@
		check_expire
    ;;
    restore)
		echo "--------------------------------------------" >>$BACK_LOG
        shift 
		check_user
		check_mysql
		restore $@
    ;;
    *)
        useage
    ;;
esac
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔_牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值