MySQL数据库数据备份还原

12 篇文章 0 订阅
4 篇文章 0 订阅

#!/bin/bash

#Author Mr.Wu

#mysql数据库数据备份和恢复

#2023-2-10 13:58:53

#######################################################

read -p "请输入账户名:" users

read -p "请输入账户密码:" psw

backup_dir1="/opt/mysql_backup/"

backup_dir2="/opt/mysql_backup_add/"

backup_log="/root/mysql_backup.log"

data_dir="/data/mysql/log"

dev_dir="/dev/null"

all_sql="/opt/mysql_backup/all.sql"

colour=(31 34)

result=("失败!!!" "成功!!!")

messages=("全库备份" "指定库完全备份" "指定库增量备份" "指定库完全备份恢复" "指定库增量备份恢复")

#######################################################

delimiter(){#定义分界符

echo -e "\033[32;1m**************************\033[0m"

}

echoinfo(){#定义输入信息

echo -e "\033[35;1m#$1\033[0m"

}

echoresult(){#定义输出信息

echo -e "\033[$1;1m$2$3\033[0m"

}

if_test(){#定义if判断语句

if [ $? -eq 0 ];then

echoresult ${colour[1]} $1 ${result[1]}

else

echoresult ${colour[0]} $1 ${result[0]}

exit

fi

}

checkall_sql(){#检查是否存在全库备份文件

if [ ! -f $all_sql ];then

echo "$all_sql不存在,无需操作" &>> $backup_log

else

mv -f $all_sql /opt/all.sql.bak`date "+%Y%m%d%H%M%S"` &> $dev_dir

fi

sleep 2

}

check_dir1(){#判断完全备份目录是否存在

if [ ! -d $backup_dir1 ];then

mkdir $backup_dir1

elif [ -d $backup_dir1 ];then

echo "$backup_dir1目录已存在,请判断是否为空!!!" &>> $backup_log

if [ ! -z "$backup_dir1" ];then

tar -zcvf /opt/mysqlfull_`date "+%Y%m%d%H%M%S"`.tar.gz $backup_dir1 --remove-files &> $dev_dir

elif [ -z "$backup_dir1" ];then

echo "$backup_dir1目录为空,可以使用" &>> $backup_log

fi

fi

sleep 2

}

fullback(){#全库备份

delimiter | tee -a $backup_log

echoinfo ${messages[0]} | tee -a $backup_log

checkall_sql | tee -a $backup_log

mysqldump -u $users -p$psw -A > $all_sql &> $dev_dir#先做一次全库数据备份

sleep 2

if_test ${messages[0]} | tee -a $backup_log

}

dumpfulback(){#指定库完全备份

delimiter | tee -a $backup_log

echoinfo ${messages[1]} | tee -a $backup_log

mysqldump -u $users -p$psw --single-transaction --flush-logs -B test > $backup_dir1test_db_`date "+%Y%m%d%H%M%S"`.sql &> $dev_dir

num="$[$(cat $data_dir/mysql_bin.index | wc -l) -1]"

if [ ! -f $backup_dir1num.txt ];then

touch $backup_dir1num.txt &> $dev_dir

fi

echo "$num" > $backup_dir1num.txt

ls -l $data_dir/ &>> $backup_log

ls -l $backup_dir1 &>> $backup_log

sleep 2

if_test ${messages[1]} | tee -a $backup_log

}

check_dir2(){#判断增量备份目录是否存在

if [ ! -d $backup_dir2 ];then

mkdir $backup_dir2

elif [ -d $backup_dir2 ];then

if [ ! -z "$backup_dir2" ];then

tar -zcvf /opt/mysqladd_`date "+%Y%m%d%H%M%S"`.tar.gz $backup_dir2 --remove-files &> $dev_dir

elif [ -z "$backup_dir2" ];then

echo "$backup_dir2目录为空,可以使用" &>> $backup_log

fi

fi

sleep 2

}

backup_recover(){#备份及还原

#指定库增量备份

delimiter | tee -a $backup_log

echoinfo ${messages[2]} | tee -a $backup_log

check_dir2 | tee -a $backup_log

num="$(cat $backup_dir1num.txt)"

mysql -u $users -p$psw -e "insert into test.test1(id,name) values(100,"Tom"),(110,"Jerry"),(111,"Marry");" &> $dev_dir

mysql -u $users -p$psw -e "update test.test1 set id=888 where name="Marry";" &> $dev_dir

mysql -u $users -p$psw -e "drop database test;" &> $dev_dir

mysql -u $users -p$psw -e "flush logs;" &> $dev_dir

num1="$(cat $data_dir/mysql_bin.index | wc -l)"

num2=1

while [ $num2 -lt $num1 ]

do

if [ $num2 -gt $num1 ];then

binlogname="$(sed -n "${num2}p" $data_dir/mysql_bin.index)"

#binlogname="$data_dir/$(ls -lt $data_dir | grep -v "mysqld.log" | grep -v "mysql_bin.index" | grep -v "总用量" | awk '{print $9}' | sed -n "${num2}p")"

\cp -rf $binlogname $backup_dir2

if [ $? -eq 0 ];then

echo -e "\033[40;32m$binlogname增量备份成功\033[0m" &>> $backup_log

fi

fi

num2=$((num2+1))

done

num3=$[$(cat $data_dir/mysql_bin.index | wc -l) -1]

if [ ! -f $backup_dir1num.txt ];then

touch $backup_dir1num.txt

fi

echo "$num3" > $backup_dir1num.txt

sleep 2

if_test ${messages[2]} | tee -a $backup_log

#完全备份恢复

delimiter | tee -a $backup_log

echoinfo ${messages[3]} | tee -a $backup_log

test_sql="$(ls $backup_dir1 -lrt | sed -n "2p" | awk '{print $9}')"

mysql -u $users -p$psw -e "set sql_log_bin=0;" &> $dev_dir

mysql -u $users -p$psw < $backup_dir1$test_sql &> $dev_dir

mysql -u $users -p$psw -e "select * from test.test1;" &>> $backup_log

sleep 2

if_test ${messages[3]} | tee -a $backup_log

#增量备份恢复,需手动进行节点恢复

#delimiter | tee -a $backup_log

#echoinfo ${messages[4]} | tee -a $backup_log

#atnum="$(mysqlbinlog -v $binlogname | grep -in -A 13 -B 13 "drop" | awk /at/'{print $3}' | sed -n "1p")"

#mysqlbinlog --stop-position=$atnum $binlogname | mysql -u $users -p$psw &> $dev_dir

#mysql -u $users -p$psw -e "select * from test.test1;" &>> $backup_log

#sleep 2

#if_test ${messages[4]} | tee -a $backup_log

}

#######################################################

check_dir1

wait

checkall_sql

wait

fullback

wait

dumpfulback

wait

check_dir2

wait

backup_recover

wait

#######################################################

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值