定期备份数据库,并恢复指定数据库、表中的数据

本文详细介绍了使用mysqldump进行数据库定时备份的方法,包括如何恢复所有数据库、特定数据库及特定表的数据。通过示例展示了如何从备份文件中筛选所需数据库和表的SQL语句,确保数据恢复的灵活性。

定期备份数据库,并恢复指定数据库或者指定某张表中的数据

简要:本文主要以mysqldump备份全部数据库,然后从sql中截取出自己要恢复的一个或多个数据库,一个或多个表进行恢复

1.数据库定时备份

#!/bin/bash
date_str=`date +"%Y_%m_%d"`
#每天备份mysql
/usr/bin/mysqldump -uroot -p${password} -x --all-databases | gzip >/opt/mysql_bk/${date_str}_bk_all.sql.gz
if [ $? -ne 0 ]; then
    echo "mysql bk failed"
else
    echo "mysql bk succeed"
echo $date_str
#定期清除项目日志
find /opt/mysql_bk/ -type f -mtime +7 |grep "bk_all.sql.gz" |xargs rm -f
echo "mysql clean bk succeed"
fi

2.恢复所有数据库

先将压缩文件解压

在这里插入图片描述

#执行  解压,恢复
gunzaip 2020_08_24_bk_all.sql.gz
mysql -u root -p${passwd} -h ${host} <a.sql

2.恢复某个数据库

2.1.先过滤出所有数据库

cat 2020_08_24_bk_all.sql |grep 'Current Database'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7g6UpetU-1598257336031)(E:\tools\安装目录\markfiles\本地图片\1598253116957.png)]

2.2提取要恢复数据库的sql

sql分为两部分

(1)sql中 以“/!”开头、以“/”结尾的语句为可执行的mysql注释,这些语句可以被mysql执行

但在其他数据库管理系统将被作为注释忽略,这可以提高数据库的可移植性,这些注释中含有变量,(如下图)所以在截取sql时需要将备份的整个sql文件的前一部分变量添加上;不然会出现**Variable
‘time_zone’ can’t be set to the value of ‘NULL’**等无效值的错误!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w521PQd-1598257212962)(E:\tools\安装目录\markfiles\本地图片\1598251346761.png)]

cat 2020_08_24_bk_all.sql |sed -n -e '/Server version/,/Current Database: .meteorology./p' > re.sql

(2)截取要恢复数据库sql

如果所有恢复的数据库不是一上列表最后一个数据库,这里以test为例子;

# 截取命令
cat a.sql |sed -n -e '/Current Database: .test./,/yt_apple_bigdata/p' >> re.sql 

注意:因为要和(1)中的sql进行拼接,所以这块追加用 “>>

如若要恢复的数据库为列表里的数据库,用,以yt_apple_bigdata为例,用以下命令

cat a.sql |sed -n -e '/Current Database: .**yt_apple_bigdata**./,/**Dump completed**/p' >> re.sql

以上用的sed命令为截取包含 指定字符串 到 另一指定字符串所在行的所有内容;

(3)最后执行re.sql文件

mysql -u root -p${passwd} -h ${host} <re.sql

3.恢复某张表

3.1先过滤出所有的表

cat a.sql |grep 'Table structure for table'

在这里插入图片描述

3.2截取sql

然后截取sql的前一部分,

如2.2中的(1)

cat 2020_08_24_bk_all.sql |sed -n -e '/Server version/,/Current Database: .meteorology./p' > re.sql 

注:以下多种情况都以(1)为前提

(2)提取要恢复表(不包含列表里的最后一个表)的sql

这里以yt_app_flavor表为例

cat 2020_08_24_bk_all.sql | sed -n -e '/Table structure for table .**yt_apple_flavor**./,/Table structure for table .**yt_user_behavior_analysis**./p' > re.sql

(3)多张表的话 可以将前后两个表名进行修改,如下即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GpuMAZyj-1598257212964)(E:\tools\安装目录\markfiles\本地图片\1598255676964.png)]

cat 2020_08_24_bk_all.sql | sed -n -e '/Table structure for table .**plugin**./,/Table structure for table .**slow_log**./p' >> re.sql

(4)提取要恢复表(包含最后一个表)的sql

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqEzlT5Z-1598257212964)(E:\tools\安装目录\markfiles\本地图片\1598255930377.png)]

cat 2020_08_24_bk_all.sql | sed -n -e '/Table structure for table .**user**./,/Table structure for table .**Dump completed**./p' > re.sql

最后re.sql就是生成的最终的sql;

执行以下命令恢复即可:

 mysql -u root -p${passwd} -h ${host} ${dbName}<a.sql
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值