数据备份脚本:
#!/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_dirbackup $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的表文件,然后由开发去对比,如果数据无误再覆盖现在的表数据
如图所示已经能够查询到恢复的表数据名
查询恢复的表里面有数据即可,对比数据的事交给开发去完成