MySQL管理工具MySQL Utilities->mysqlfrm,frm和ibd恢复数据

文章介绍了当innodb_file_per_table设置为1时,表数据文件(t1.ibd)在独立表空间的情况,以及在共享表空间中数据文件位于ibdata01。mysqlfrm工具用于从.frm文件中恢复表定义,它有两种模式:默认模式用于再生实例,诊断模式则逐字节读取.frm文件。默认模式不包含自增序列和外键约束信息,而诊断模式有更多限制。文章提供了使用mysqlfrm的示例,展示了两种操作模式的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库要求:innodb_file_per_table=1  独立表空间:数据库wubo,表t1,此时在磁盘wubo目录下有t1.frm表结构和t1.ibd数据文件

数据库要求:innodb_file_per_table=1 共享表空间:数据库wubo,表t1,此时在磁盘wubo目录下有t1.frm表结构但是没有t1.ibd数据文件。此时的数据文件在ibdata01里面

frm:表结构

ibd:数据

需要先安装mysql-connector-python

wget https://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-2.1.7-1.el6.x86_64.rpm

wget ftp://ftp.pbone.net/mirror/dev.mysql.com/pub/Downloads/MySQLGUITools/mysql-utilities-1.6.5-1.el6.noarch.rpm

wget ftp.pbone.net/mirror/dev.mysql.com/pub/Downloads/MySQLGUITools/mysql-utilities-extra-1.5.6-1.el6.noarch.rpm

第一种方式:

mysqlfrm 是一个恢复性质的工具,用来读取.frm文件并从该文件中找到表定义数据生成CREATE语句。在大多数情况下,生成的CREATE语句用于在另一个服务器上创建表或进行诊断等。然而,有些功能是不保存在.frm文件中的,因此这些功能将被忽略的。如:

  • 外键约束
  • 自增长序列

mysqlfrm 有两种操作模式。默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例。这种过程不会改变原始的.frm文件。该模式也需要指定--port选项来给再生的实例使用,该端口不能与现有的实例冲突。在读取.frm文件后,再生的实例将被关闭,所有的临时文件将被删除的。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-utilities-mysqlfrm/

另一个模式是诊断模式,需要指定 --diagnostic 选项。byte-by-byte读取.frm文件 尽可能多的恢复信息。该模式有更多的局限性,不能校验字符集。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-utilities-mysqlfrm/

当使用默认模式无法读取文件或者该服务器上没有安装MySQL实例就使用诊断模式。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-utilities-mysqlfrm/

需要指定.frm文件的路径,也可以指定一个目录,该目录下的所有.frm文件将被读取。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-utilities-mysqlfrm/

可以指定数据库名称用来产生CREATE语句,格式如下:database_name:table_name.frm,如:oltp:t1.frm。可选的数据库名称也可以使用路径,如 /home/me/oltp:t1.frm,将使用oltp作为数据库名。如果省略了数据库名称和路径,最后的一个文件夹将作为数据库名称的。如 /home/me/data1/t1.frm,data1将作为数据库名。如果不想最后的文件夹作为数据库名,只需指定冒号,如 /home/me/data1/:t1.frm,在这种情况下,CREATE语句将忽略数据库。

1. 创建一个临时实例来解析frm文件。

2. 使用诊断模式解析frm文件。

以下表进行测试,看看,

1.  mysqlfrm解析的结果与原生表结构的区别。

2.  两种操作模式解析结果的不同。

首先看看第一种操作模式。

既然是创建临时实例,肯定需要知道软件所在的位置,有两种方式。

1. 指定--basedir

$ mysqlfrm --basedir=/usr/local/mysql7 /tmp/t_child.frm --port=3333

2. 指定--server

$ mysqlfrm --server=root:123456@127.0.0.1:3307 /tmp/t_child.frm  --port=2323

https://www.cnblogs.com/ivictor/p/9302069.html

 注意,指定--server和--basedir没有多大区别,主要也是为了获取basedir。

从上面的输出可以看到,相对于其原生表结构,打印出的表结构,

1. 没有自增主键的序列信息。

2. 没有外键约束。

再来看看通过诊断模式解析的结果。

$ mysqlfrm --diagnostic /tmp/t_child.frm

操作过程:

1. 默认模式:
mysqlfrm --server=root:1@103.164.33.207:3306 /data/jettechbasic/*.frm --diagnostic > jettechbasic_frm.sql
或
诊断模式:
mysqlfrm   --server=root:1@103.164.33.207:3306 /data/jettechbasic/frm/:*.frm --port=3307 --user=mysql >a
2. mysql -uroot -p1 -h103.164.33.207 -P3306 -e "select concat('alter table ',table_name,'  discard tablespace; ') from information_schema.tables where table_schema='jettechbasic';" > j1_discard.sql
3. mysql -uroot -p1 -h103.164.33.207 -P3306 -e "select concat('alter table ',table_name,'  import tablespace; ') from information_schema.tables where table_schema='jettechbasic';" > j2_import.sql
4.mysql -uroot -p1 -h103.164.33.207 -P3306 jettechbasic < j1_discard.sql
5.mysql -uroot -p1 -h103.164.33.207 -P3306 jettechbasic < j2_import.sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值