在实际工作中,一个MySQL实例中可能存在多个数据库。我们在备份的时候,通常会使用全量备份,将所有的数据库备份到一个文件中。但是,偶尔会只恢复一个数据库或一张表。如何解决?1.使用全量备份恢复一个数据库(数据库)的数据案例:群里有朋友问,MySQL全量数据库备份。如何只恢复一个数据库?1.使用--one-database选项。不推荐使用此方法,并且经常会出现问题。#mysql-uroot-pxx-Ddb1-o2,从全量备份文件中取出所需数据库的建表语句和INSERT数据,然后导入#sed-n'/^--CurrentDatabase:`db1`/,/^--CurrentDatabase:`/p'all.dmp>db1.sql#mysql-uroot-pxx-Ddb12.使用fullbackup恢复一个表(table)的数据在生产中,开发同事更新表的时候,不加where条件,调用order_status列,所有数据更新为0。通常,mysqldump会备份整个数据库。恢复时把整个库都还原,太费时,没必要。所以,我们只恢复我们想要的表。在mysqldump备份中,表结构和INSERTINTO语句都包含数据。所以接收者的内容可以是两部分。1.获取表结构#sed-e'/./{H;$!d;}'-e'x;/CREATETABLE`ecs_ugo_order_info`/!d;q'mysqldump_2017-05-23.sql2.获取INSERTINTO语句,用于数据恢复#grep-i'INSERTINTO`ecs_ugo_order_info`'mysqldump_2017-05-23.sql>data.sql&3.根据获取的表结构建表,导入数据mysql-uroot-pxxxxx4。拼接更新语句mysql>selectconcat('updatexx.ecs_ugo_order_infosetorder_status=',order_status,'whereorder_id=',order_id,';')fromecs_ugo_order_infointooutfile'/tmp/ecs_ugo_order_info_rercovery.sql';结果如下:updatexx.ecs_ugo_order_infosetorder_status=82whereupdaterorder4xid=82.ecs_ugo_order_infosetorder_status=6whereorder_id=3254824;updatexx.ecs_ugo_order_infosetorder_status=6whereorder_id=3254870;5.恢复生产数据库中order_status为正常值#mysql-uroot-pxxxxx
