咨询微信: dbservice1234 7 x 24 在线支持!

如何使用MySQL工具从.frm文件中恢复表结构

如何使用MySQL工具从.frm文件中恢复表结构

表结构存储在.frm文件和InnoDB数据字典中。有时,通常在数据恢复问题中,我们需要恢复这些结构,以便能够找到丢失的数据或只是重建表。

有不同的操作方式,我们已经在博客中已经写过。例如,我们可以使用数据恢复工具从InnoDB字典恢复表结构,或使用MySQL服务器从.frm文件恢复。本文将是后者的更新。我会告诉你如何轻松从.frm文件恢复结构,在某些情况下,甚至不需要使用MySQL服务器。这将使过程更快,编写脚本更轻松。

MySQL 工具和mysqlfrm

MySQL工具是由Oracle发布的一组脚本,帮助我们更简单地执行常见的DBA任务。它是用Python编写的,它唯一的依赖是Python连接器。在各种工具的名单中,我们将使用mysqlfrm工具来帮助我们恢复结构。

像往常一样,图像胜过千言万语。我们恢复一些表结构:

这是我们的表:

1

 

2

3

4

5

6

7

CREATE TABLE `new_table` (

 

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(45) DEFAULT NULL,

`age` tinyint(4) NOT NULL,

PRIMARY KEY (`id`),

KEY `name_idx` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

现在我们尝试从.frm文件恢复该信息,看看结果:

 

1

 

2

3

4

5

6

7

8

9

10

11

$ mysqlfrm –diagnostic /usr/local/mysql/data/test/new_table.frm

 

# WARNING: Cannot generate character set or collation names without the –server option.

[…]

 

CREATE TABLE `test`.`new_table` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(45) DEFAULT NULL,

`age` tinyint(4) NOT NULL,

PRIMARY KEY `PRIMARY` (`id`),

KEY `name_idx` (`name`)

) ENGINE=InnoDB;

结果挺不错

要注意的是这个工具有两种方法进行恢复。

  • 第一个是生成一个新的MySQL实例,并在那里运行结构恢复,类似于PeterZ在他的博客中解释的。你需要使用-server或-basedir目录以及-port。恢复完成后,它会关闭生成的实例。
  • 第二个与-diagnostic使用,读取.frm文件的每个字节来恢复所有可能的信息,但不需要MySQL实例。因此,这种方法可用于从损坏的.frm文件恢复所有可能的,甚至连MySQL都不能读取的信息。

正如我们在上一个例子的警告中看到的,并非所有信息可以通过第二种方法恢复。例如字符集和归类不能没有-server选项(第一种方法)进行恢复。我们看看如何使用生成的服务器来恢复.frm的信息:

 

 

1

 

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

$ mysqlfrm –server=root@127.0.0.1 –port 3307 ./new_table.frm

 

# Source on 127.0.0.1: … connected.

# Starting the spawned server on port 3307 … done.

# Reading .frm files

#

# Reading the new_table.frm file.

#

# CREATE statement for ./new_table.frm:

#

 

CREATE TABLE `new_table` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(45) DEFAULT NULL,

`age` tinyint(4) NOT NULL,

PRIMARY KEY (`id`),

KEY `name_idx` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

该工具连接到MySQL服务器,获得它需要的所有信息(basedir等),并在端口3307生成新实例。然后它使用新的实例来恢复.frm文件的信息。方便快捷:)

值得一提的是,不是所有需要的信息都存储在这些.frm文件。有一些信息是无法恢复的,例如FK约束和AI数字序列。

结论

MySQL工具是一个非常有用的工具集。在特定情况下,mysqlfrm可以用来从它们的.frm文件恢复一长列的表结构,使过程快速且易于编写脚本。