MySQL如何实现恢复单库或单表

  介绍

这篇文章将为大家详细讲解有关MySQL如何实现恢复单库或单表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强> 1。如何恢复单库或单表

前面文章有介绍过MySQL的备份与恢复。可能我们每个数据库实例中都不止一个库,一般备份都是备份整个实例,但恢复需求又是多种多样的,比如说我想只恢复某个库或某张表,这个时候应该怎么操作呢?

如果你的实例数据量不大,可以在另外一个环境恢复出整个实例,然后再单独备份出所需库或表用来恢复。不过这种方法不够灵活,并且只适用数据量比较少的情况。

其实从全备中恢复单库还是比较方便的,有个——一个数据库参数可以指定单库恢复、下面来具体演示下:

 #查看及备份所有库
  mysql>显示数据库;
  +--------------------+
  | |数据库
  +--------------------+
  | information_schema |
  mysql | |
  | performance_schema |
  | sbt |
  | sys |
  | | testdb
  | testdb2 |
  +--------------------+
  
  ,mysqldump -uroot -pxxxx - r - e——单独的事务——所有数据库比;all_db.sql
  
  #删除testdb库并进行单库恢复
  mysql>减少数据库testdb;
  查询好了,36行影响(2.06秒)
  
  #貌似恢复前testdb库不存在的话要手动新建
  mysql -uroot -pxxxx——一个数据库testdb & lt;all_db。sql 

除了上述方法外,恢复单库或单表还可以采用手动筛选的方法。这个时候Linux下大名鼎鼎的sed和grep命令就派上用场了,我们可以利用这两个命令从全备中筛选出单库或单表的语句,筛选方法如下:

 #从全备中恢复单库
  sed - n & # 39;/^——当前数据库:testdb/,/^——当前的数据库:“/p # 39;all_db。sql在;testdb.sql
  
  #筛选出单表语句
  猫all_db。sql | sed - e & # 39;/?{H;美元! d;} & # 39;- e & # 39; x/创建表的test_tb/! d;提问# 39;比;/tmp/test_tb_info.sql
  猫all_db。sql | grep,忽略大小写& # 39;插入“test_tb”& # 39;比;/tmp/test_tb_data.sql 

, <强> 2。小心有坑

对于上述手动筛选来恢复单库或单表的方法,看起来简单方便,其实隐藏着一个小坑,下面我们来具体演示下:

 #备份整个实例
  ,mysqldump -uroot -pxxxx - r - e——单独的事务——所有数据库比;all_db.sql
  
  #手动备份下test_tb然后删除test_tb
  mysql>创建表test_tb_bak像test_tb;
  查询好,0行影响(0.03秒)
  
  mysql>从test_tb插入test_tb_bak select *;
  查询好,4行影响(0.02秒)
  记录:4重复:警告:0
  
  mysql>删除表test_tb;
  查询好,0行影响(0.02秒)
  
  #从全备中筛选test_db建表及插数据语句
  猫all_db。sql | sed - e & # 39;/?{H;美元! d;} & # 39;- e & # 39; x/创建表的test_tb/! d;提问# 39;比;test_tb_info.sql
  猫all_db。sql | grep,忽略大小写& # 39;插入“test_tb”& # 39;比;test_tb_data.sql
  
  #查看得到的语句貌似没问题
  猫test_tb_info.sql
  
  删除表如果存在“test_tb”;/* !40101集@saved_cs_client=@@character_set_client */;/* !40101集character_set_client=utf8 */;
  创建表“test_tb”(
  inc_id int (11) NOT NULL AUTO_INCREMENT评论& # 39;自增主键& # 39;,
  col1 int(11)非空,
  col2 varchar(20)默认为空,
  “col_dt”datetime默认为空,
  “create_time”默认时间戳NOT NULL CURRENT_TIMESTAMP评论& # 39;创建时间& # 39;,
  “update_time”默认时间戳NOT NULL CURRENT_TIMESTAMP> #备份文件开的头
  ——MySQL 10.13 Distrib 5.7.23转储,Linux (x86_64)
  --
  ——主持人:localhost数据库:
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  ——服务器版本5.7.23-log/* !40101集@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/* !40101集@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/* !40101集@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/* !40101集名称utf8 */;/* !40103集@OLD_TIME_ZONE=@@TIME_ZONE */;/* !40103集TIME_ZONE=& # 39; + 0 # 39;*/;
  注意上面两行/* !40014集@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS UNIQUE_CHECKS=0 */;/* !40014集@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS FOREIGN_KEY_CHECKS=0 */;/* !40101集@OLD_SQL_MODE=@@SQL_MODE SQL_MODE=& # 39; NO_AUTO_VALUE_ON_ZERO& # 39;*/;/* !40111集@OLD_SQL_NOTES=@@SQL_NOTES SQL_NOTES=0 */;
  
  
  #备份文件结尾/* !40103集TIME_ZONE=@OLD_TIME_ZONE */;/* !40101集SQL_MODE=@OLD_SQL_MODE */;/* !40014集FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/* !40014集UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/* !40101集CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/* !40101集CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/* !40101集COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/* !40111集SQL_NOTES=@OLD_SQL_NOTES */;
  
  ——转储完成> #清空test_db表数据
  mysql>截断表test_tb;
  查询好,0行影响(0.02秒)
  
  #文件开头增加时区声明
  vim test_tb_data.sql
  设置会话TIME_ZONE=& # 39; + 0 # 39;;
  插入“test_tb”值(1001 & # 39;dsfs& # 39;, & # 39; 2020-08-04 12:12:36& # 39;, & # 39; 2020-09-17 06:19:27& # 39;, & # 39; 2020-09-17 06:19:27& # 39;),
  (1002 & # 39;vfsfs& # 39;, & # 39; 2020-09-04 12:12:36& # 39;, & # 39; 2020-09-17 06:19:27& # 39;, & # 39; 2020-09-17 06:19:27& # 39;),
  (1003,& # 39;adsfsf& # 39;, NULL, & # 39; 2020-09-17 06:19:27& # 39;, & # 39; 2020-09-17 06:19:27& # 39;),
  (1004 & # 39;walfd& # 39;, & # 39; 2020-09-17 14:19:27& # 39;, & # 39; 2020-09-17 06:19:27& # 39;, & # 39; 2020-09-18 07:52:13& # 39;);
  
  #执行恢复并比对发现数据正确
  mysql>从test_tb select *;
  + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
  | inc_id | col1 | col2 | col_dt | create_time | update_time |
  + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
  | 1 | 1001 | dsf | 2020-08-04 12:12:36 | 2020-09-17 14:19:27 | 2020-09-17 14:19:27 |
  | 2 | 1002 | vfsfs | 2020-09-04 12:12:36 | 2020-09-17 14:19:27 | 2020-09-17 14:19:27 |
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

MySQL如何实现恢复单库或单表