MySQL-5.7物理数据恢复(ibd恢复)

一次恢复数据库表结构和数据的实战,仅以此贴作为记录(本文为后期模拟)

由于,前几天我们使用的数据库被入侵(顺便鄙视一下安全管理人员),数据库中的表都显示不存在(仅剩一个黑客自建的----qq_xxxxx的表,但物理文件都在,例如:.frm、.ibd文件等)。因此,产生了这次恢复表结构和表数据的实战。以下开始记述:

我们对数据库很多知识都不太了解,而像这种恢复数据的工作也没有做过,因此首先百度了一下.frm和.ibd文件是做什么的,见下:

MySQL中.frm文件:保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关。

MySQL中.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。

物理ibd文件恢复数据:(企业案例)

损坏库:olda库下的student无法使用,但是ibd文件还存在(student表有20万条数据)

新库:创建一个一模一样结构的表,拷贝损坏表的ibd文件到新库的指定库路径下,重新导入表空间数据。

mysql-01节点:(损坏库,找到损坏库的表结构语句)

#复制损坏表的表格式语句,到新的MySQL的指定库下创建一样格式的表(如果损坏到无法查看,那就开发找损坏表格式)
mysql> show create table student;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生学号',
  `name` varchar(50) NOT NULL COMMENT '学生姓名',
  `cardid` char(18) NOT NULL,
  `age` tinyint(3) unsigned NOT NULL DEFAULT '18' COMMENT '学生年龄',
  `gender` enum('男','女') NOT NULL DEFAULT '男' COMMENT '学生性别',
  `birthday` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '学生入学时间',
  `telm` char(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `cardid` (`cardid`),
  UNIQUE KEY `telnum` (`telm`)
) ENGINE=InnoDB AUTO_INCREMENT=200001 DEFAULT CHARSET=utf8                          |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

mysql-02节点:(新库,创建与损坏表一样表结构的表)

mysql> create database olda;
Query OK, 1 row affected (0.00 sec)

mysql> use olda;
Database changed

mysql> CREATE TABLE `student` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生学号',
    ->   `name` varchar(50) NOT NULL COMMENT '学生姓名',
    ->   `cardid` char(18) NOT NULL,
    ->   `age` tinyint(3) unsigned NOT NULL DEFAULT '18' COMMENT '学生年龄',
    ->   `gender` enum('男','女') NOT NULL DEFAULT '男' COMMENT '学生性别',
    ->   `birthday` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '学生入学时间',
    ->   `telm` char(11) DEFAULT NULL,
    ->   PRIMARY KEY (`id`),
    ->   UNIQUE KEY `cardid` (`cardid`),
    ->   UNIQUE KEY `telnum` (`telm`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=200001 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.11 sec)

mysql-02节点:(新库,移除新库的表空间数据ibd文件)

mysql> alter table olda.student discard tablespace;
Query OK, 0 rows affected (0.01 sec)

mysql-01节点:(损坏库,拷贝ibd文件到新库的指定库下)

[root@mysql-01 olda]# scp /usr/local/mysql/mydata/olda/student.ibd 172.16.1.30:/usr/local/mysql/mydata/olda/
root@172.16.1.30's password: 
student.ibd                                                                                                     100%   52MB  52.0MB/s   00:01

mysql-02节点:(新库,重新导入student表空间数据ibd文件)

#授权文件给mysql用户
[root@mysql-02 ~]# chown -R mysql.mysql /usr/local/mysql/mydata/olda/student.ibd

#重新导入损坏库的ibd文件对应的表空间数据
mysql> alter table olda.student import tablespace;
Query OK, 0 rows affected, 1 warning (2.19 sec)

查看数据:(mysql-02节点)

mysql> select * from olda.student limit 5;
+----+--------+--------------------+-----+--------+---------------------+-------------+
| id | name   | cardid             | age | gender | birthday            | telm        |
+----+--------+--------------------+-----+--------+---------------------+-------------+
|  2 | olda_0 | 558028812249598585 |  26 | 女     | 2019-03-12 13:58:20 | 97124093860 |
|  3 | olda_1 | 797671815953624647 |  62 | 男     | 2019-03-12 13:58:20 | 55671735114 |
|  4 | olda_2 | 917621002201308892 |  99 | 女     | 2019-03-12 13:58:20 | 01255766912 |
|  5 | olda_3 | 103233400938302068 |   7 | 男     | 2019-03-12 13:58:20 | 98291102596 |
|  6 | olda_4 | 864538584193844687 |   4 | 女     | 2019-03-12 13:58:20 | 16790101875 |
+----+--------+--------------------+-----+--------+---------------------+-------------+
5 rows in set (0.00 sec)

如果表数量过多,用concat字符串拼接成SQL语句!

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论