利用MySQL全备份,如何只恢复一个库或者一个表?

在实际工作中,一个MySQL实例中可能有多个database。而我们备份时,通常采用完全备份,将所有database都备份到一个文件中。但是,偶尔会遇到只恢复一个database或者一个表的情况。怎么解决呢?

一、利用全备恢复一个库(database)的数据

案例:MySQL全库备份。如何只恢复一个库?

–进行一次全备
mysqldump -uroot -prootmysql -A -B --single-transaction --master-data=2 > all.sql

1、采用–one-database 选项。不建议使用该方式,经常出现问题。

mysql -uroot -pxx -D DBname -o < all.sql
mysql -uroot -p --one-database DBname < all.sql

2、从全备份文件中将需要的库的建表语句和INSERT数据拿出来,然后再导入

sed -n ‘/^-- Current Database: db1/,/^-- Current Database: `/p’ all.sql > db1.sql
mysql -uroot -pxx -D db1 < db1.sql

二、利用全备恢复一张表(table)的数据

生产中遇到开发同事更新表时未加上where条件,造称 order_status 列所有数据都被更新为0。通常,mysqldump对全库进行备份。恢复时如果恢复全库,太耗时间又没有必要。所以,我们只恢复想要的表即可。

mysqldump备份中,既有表结构,又有INSERT INTO语句包含数据。所以获得者两部分内容即可。

1、获得表结构
sed -e’/./{H;$!d;}’ -e ‘x;/CREATE TABLE ecs_ugo_order_info/!d;q’ all.sql

2、获得INSERT INTO 语句,用于数据的恢复
grep -i 'INSERT INTO ecs_ugo_order_info’ all.sql >data.sql &

3、根据得到的表结构创建表,并导入数据
mysql -uroot -pxxx xx

4、拼接update语句
mysql> select concat(‘update xx.ecs_ugo_order_info set order_status=’,order_status,’ where order_id=’,order_id,’;’) from ecs_ugo_order_info into outfile ‘/tmp/ecs_ugo_order_info_rercovery.sql’;

结果如下:
update xx.ecs_ugo_order_info set order_status=6 where order_id=3254778;
update xx.ecs_ugo_order_info set order_status=6 where order_id=3254824;
update xx.ecs_ugo_order_info set order_status=6 where order_id=3254870;

5、在生产库中将order_status恢复成正常值
mysql -uroot -pxxx xx < /tmp/ecs_ugo_order_info_rercovery.sql

=====全备文件中提取指定表结构和数据

sed -n -e ‘/CREATE TABLE tbname/,/UNLOCK TALBES/p’ dump.sql > tb_name_$(date +%F).sql

这种方法,最好一个实例里面表名称不要相同,否则相同表名称的数据都会过滤出来。


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论