定期备份数据库,并恢复指定数据库或者指定某张表中的数据
简要:本文主要以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)]](https://i-blog.csdnimg.cn/blog_migrate/700d5c353803cd24f1af71d245a0c24d.png#pic_center)
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)]](https://i-blog.csdnimg.cn/blog_migrate/a9c0f949d49a049507e0af75d4106dee.png#pic_center)
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)]](https://i-blog.csdnimg.cn/blog_migrate/3f4c59d67cd4e922c47a121489c6e22f.png#pic_center)
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)]](https://i-blog.csdnimg.cn/blog_migrate/47ee84d2ffdcaa6984afe0c10943b288.png#pic_center)
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
本文详细介绍了使用mysqldump进行数据库定时备份的方法,包括如何恢复所有数据库、特定数据库及特定表的数据。通过示例展示了如何从备份文件中筛选所需数据库和表的SQL语句,确保数据恢复的灵活性。
2538

被折叠的 条评论
为什么被折叠?



