mysql数据备份与恢复

数据备份脚本:

#!/bin/bash 

#声明变量
back_dir=/data/mysql_backup/`date +%F`
pwd=123456password

#备份表除触发器外的数据及结构
backup()
{
 mysqldump -uroot -p$pwd -d $1 -R -E --triggers=false > $back_dir/$1/$1.sql
  for i in `mysql -uroot -p$pwd  --skip-column-names -e "select table_name from information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = '$1'"`
 do
 echo $i
mysql -uroot -p$pwd <<EOU
use $1;
select * from $i into outfile '$back_dir/$1/$i.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
EOU
 done
}

for i in `mysql -uroot -p$pwd --skip-column-names -e "show databases"|grep -v sys |grep -v mysql |grep -v performance_schema|grep -v information_schema`
do
     mkdir -p $back_dir/$i
     chown -R mysql:mysql $back_dir

     backup $i
done

#导出触发器 
mysqldump -uroot -p$pwd -t -d -A >$back_dir/trigger.sql

#压缩
cd /data/mysql_backup
tar zcvf `date +%F`.tgz `date +%F`
rm -rf `date +%F`
find . -name "*.tgz" -mtime +7 |xargs rm -rf

数据恢复脚本:

#!/bin/bash
pwd=123456root7890
dir=/data/$1
#恢复表数据
[ ! $# -eq 3 ] && echo "需要加三个参数,第一个参数为日期,格式为年-月-日或者年-月-日-hh::mm::ss;第二个参数为库名,第三个参数为表名" && exit
mysql -uroot -p$pwd <<EOU
use $2;
create table ${3}_bak like $3;
load data infile '$dir/$2/$3.csv' into table ${3}_bak   FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
EOU

数据恢复步骤

主从架构,数据是在从库上进行备份的、每天凌晨进行全量备份,并且保留七天的备份数据,而恢复数据都是在主库上进行恢复的

首先我们需要找到最近日期的全量备份数据

从库操作:
cd /data/backup/ && ll

如图所示,我们拿2023-10-24的数据来举例,由于我恢复的数据是在主库上操作的,所以需要先将数据包由从库发送到主库的data目录下并解压,数据量较大解压可能得稍等一会,不要随便存放,全量备份一般数据量较大如果放在系统盘可能直接撑爆,所以需要放在数据盘或者共享盘等

解压后进入到2023-10-24目录中,里面包含了全量数据中所有的库

我这次需要恢复的是sbms库里面safety_checkschoolresult和safety_checkschool两个表的数据,所以需要进入到sbms目录并解压这两个数据表压缩包

如下图所示为恢复数据的脚本,我需要恢复的数据放在了 /data下,所以我修改了 dir=/data/$1

脚本中 $1 $2 $3 分别指需要恢复数据的 年月日 库名 表明,由于我只需要恢复两个表的数据且只解压了两个表文件,所以脚本获取到全量数据目录后会去找到已经解压的文件并恢复

这里我需要恢复两个表的内容,必须分开执行,所以要执行两次,只是表名不一样

如上图脚本恢复逻辑,恢复的数据不是直接覆盖目前的表数据的,而是在库中会生成一个以 表明_bak的表文件,然后由开发去对比,如果数据无误再覆盖现在的表数据

如图所示已经能够查询到恢复的表数据名

查询恢复的表里面有数据即可,对比数据的事交给开发去完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值