暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL全备数据文件恢复单库单表方法

运维特工 2018-06-16
389

一、从mysqldump备份文件中恢复单库单表方法

1.全备中恢复指定库

从mysqldump全备中恢复指定库,使用 --one-database
 简写 -o
的参数,极大地方便了我们恢复数据的灵活性。

  1. # mysql -uroot -p --one-database DBname < dump.sql

复制

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

  1. # sed -n -e '/CREATE TABLE `tbname`/,/UNLOCK TABLES/p'  dump.sql > tb_name_$(date +%F).sql

复制

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

可以用下面的脚本来测试

  1. #!/bin/bash

  2. # by pangguoping


  3. for i in `seq 10`

  4. do

  5.        mysql -uroot -punixfbi -S /tmp/mysql3307.sock -e "create database db$i;"

  6.        for a in `seq 10`

  7.        do

  8.                mysql -uroot -punixfbi -S /tmp/mysql3307.sock -e "create table db$i.tb${a} (uid  int(11)  NOT NULL  AUTO_INCREMENT,name varchar(32)  DEFAULT NULL,add_time  datetime DEFAULT NULL,PRIMARY KEY (uid)) ENGINE=InnoDB;"

  9.                for n in `seq 10`

  10.                do

  11.                        sleep 1;

  12.                        mysql -uroot -punixfbi -S /tmp/mysql3307.sock -e "insert into db$i.tb${a}(name,add_time) values('db${i}_tb${a}_${n}',now());"

  13.                done

  14.        done



  15. done

复制

3.根据控制MySQL权限进行恢复

这种方法是根据对表的权限控制来实现的,例如我想恢复db1.tb2表中的数据,那么我们可以创建一个用户,该用户只对db1.tb2表有权限,这样就可以实现。下面我们来试一下。 例如:我们根据3307实例的全备数据,把db1.tb2表中的数据恢复到3308实例 在3308实例创建用户:

  1. mysql> grant  all   privileges   on  db1.tb2  to  'unixfbi'@'%' identified  by '123456';

复制

创建db1库:

  1. mysql> create database db1;

复制

把3307实例数据进行全备:

  1. # mysqldump -uroot -punixfbi -S /tmp/mysql3307.sock -A -B --single-transaction --master-data=2 > backup.sql

复制

把数据导入到3308实例:

  1. # mysql -uunixfbi -p123456 -f -S /tmp/mysql3308.sock db1 <  backup.sql 2>/dev/null

复制

需要使用 -f
参数,强制导入。否则一直报 ERROR1210(HY000)at line21:Incorrectarguments to EXECUTE
 的错误,无法导入到3308实例中。还有如果不使用 2>/dev/null
 的话,导入数据时就会显示满屏去权限的报错。

4.全备文件中提取指定表结构

例如从全备文件中提取tb3的表结构

  1. # sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `tb3`/!d;q'  dump.sql


  2. DROP TABLE IF EXISTS `tb3`;

  3. /*!40101 SET @saved_cs_client     = @@character_set_client */;

  4. /*!40101 SET character_set_client = utf8 */;

  5. CREATE TABLE `tb3` (

  6.  `uid` int(11) NOT NULL AUTO_INCREMENT,

  7.  `name` varchar(32) DEFAULT NULL,

  8.  `add_time` datetime DEFAULT NULL,

  9.  PRIMARY KEY (`uid`)

  10. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

  11. /*!40101 SET character_set_client = @saved_cs_client */;

复制

这种方法有个缺陷:如果实例库中有多个相同的表名称,那么只能提取出一个表结构。

二、从Xtrabackup备份中恢复单个表

从Xtrabackup全备中恢复单个表,主要是利用MySQL表空间传输技术进行恢复。 下面我们来恢复3307实例中的db1.tb1表数据,恢复到3308实例中。

1.创建测试数据

  1. root@localhost:mysql3307.sock [(none)]>  create database db1;

  2. root@localhost:mysql3307.sock [(none)]>  create table db1.tb1 (uid  int(11)  NOT NULL  AUTO_INCREMENT,name varchar(32)  DEFAULT NULL,add_time  datetime DEFAULT NULL,PRIMARY KEY (uid)) ENGINE=InnoDB;

  3. root@localhost:mysql3307.sock [(none)]> insert into db1.tb1(name,add_time) values('db1_tb1_1',now());

复制

查看创建后的数据:

  1. root@localhost:mysql3307.sock [db1]> select * from tb1;

  2. +-----+------------+---------------------+

  3. | uid | name       | add_time            |

  4. +-----+------------+---------------------+

  5. |   1 | db1_tb1_1  | 2018-06-15 17:12:53 |

  6. |   2 | db1_tb1_2  | 2018-06-15 17:12:54 |

  7. |   3 | db1_tb1_3  | 2018-06-15 17:12:55 |

  8. |   4 | db1_tb1_4  | 2018-06-15 17:12:56 |

  9. |   5 | db1_tb1_5  | 2018-06-15 17:12:57 |

  10. |   6 | db1_tb1_6  | 2018-06-15 17:12:58 |

  11. |   7 | db1_tb1_7  | 2018-06-15 17:12:59 |

  12. |   8 | db1_tb1_8  | 2018-06-15 17:13:00 |

  13. |   9 | db1_tb1_9  | 2018-06-15 17:13:01 |

  14. |  10 | db1_tb1_10 | 2018-06-15 17:13:02 |

  15. +-----+------------+---------------------+

  16. 10 rows in set (0.00 sec)

复制

2.在3307实例上备份数据

  1. # innobackupex --defaults=/data/mysql/mysql3307/my3307.cnf --socket=/tmp/mysql3307.sock --user=root --password=unixfbi /backup/

复制

执行apply-log:

  1. # innobackupex  --apply-log /backup/2018-06-15_17-58-07

复制

3.从备份中获取表结构

我们使用 mysqlfrm
来获取表结构,首先我们要安装 mysql-utilities

  1. # yum install mysql-utilities -y

复制

安装完成后,我们来获取tb1表结构

  1. # mysqlfrm --diagnostic /backup/2018-06-15_17-58-07/db1/tb1.frm


  2. CREATE TABLE `db1`.`tb1` (

  3.  `uid` int(11) NOT NULL AUTO_INCREMENT,

  4.  `name` varchar(96) DEFAULT NULL,

  5.  `add_time` datetime DEFAULT NULL,

  6. PRIMARY KEY `PRIMARY` (`uid`)

  7. ) ENGINE=InnoDB;

复制

4.在3308实例上创建要恢复的表结构

  1. root@localhost:mysql3308.sock [(none)]> create database db1;

  2. root@localhost:mysql3308.sock [(none)]> CREATE TABLE `db1`.`tb1` (

  3.  `uid` int(11) NOT NULL AUTO_INCREMENT,

  4.  `name` varchar(96) DEFAULT NULL,

  5.  `add_time` datetime DEFAULT NULL,

  6. PRIMARY KEY `PRIMARY` (`uid`)

  7. ) ENGINE=InnoDB;

复制

5.把3308实例上指定表空间释放掉

  1. root@localhost:mysql3308.sock [(none)]> alter table db1.tb1 discard tablespace;  

复制

这一步也就是删除tb1.ibd 文件。

6.拷贝备份中的tb1.ibd文件,然后修改权限

  1. # cp /backup/2018-06-15_17-58-07/db1/tb1.ibd  /data/mysql/mysql3308/data/db1/

  2. # chown --reference=/data/mysql/mysql3308/data/db1/tb1.frm  /data/mysql/mysql3308/data/db1/tb1.ibd

复制

7.3308实例导入表空间

  1. root@localhost:mysql3308.sock [(none)]> alter table db1.tb1 import tablespace;

复制

8.查看数据是否恢复成功

  1. root@localhost:mysql3308.sock [(none)]> select * from db1.tb1;

  2. +-----+------------+---------------------+

  3. | uid | name       | add_time            |

  4. +-----+------------+---------------------+

  5. |   1 | db1_tb1_1  | 2018-06-15 17:12:53 |

  6. |   2 | db1_tb1_2  | 2018-06-15 17:12:54 |

  7. |   3 | db1_tb1_3  | 2018-06-15 17:12:55 |

  8. |   4 | db1_tb1_4  | 2018-06-15 17:12:56 |

  9. |   5 | db1_tb1_5  | 2018-06-15 17:12:57 |

  10. |   6 | db1_tb1_6  | 2018-06-15 17:12:58 |

  11. |   7 | db1_tb1_7  | 2018-06-15 17:12:59 |

  12. |   8 | db1_tb1_8  | 2018-06-15 17:13:00 |

  13. |   9 | db1_tb1_9  | 2018-06-15 17:13:01 |

  14. |  10 | db1_tb1_10 | 2018-06-15 17:13:02 |

  15. +-----+------------+---------------------+

  16. 10 rows in set (0.00 sec)

复制

可以看出 db1.tb1
数据已经恢复成功了。

参考文档

http://www.ywnds.com/?p=13339

https://www.cnblogs.com/xuanzhi201111/p/6609867.html

本文出自 “运维特工” 博客,转载请务必保留原文链接 和 http://www.unixfbi.com

您的阅读和关注就是对我们最大的鼓励与支持。请长按下面二维码关注“运维特工”公众号。

运维特工,战胜心魔!!


文章转载自运维特工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论