具体实操篇
整体说通俗易懂点就好比:是一个人,被火或者其他烧伤破坏了,躯壳坏了,然后重修找一个躯壳(新建一个数据库),然后依照前面的躯壳画像(上面得到的sql),在造一个躯壳出来,然后在把内在的骨骼血肉那些(以前的数据)给安在新的躯壳上,最后整个完整的人就号了(数据就恢复了)。上述就需要.frm(躯壳),ibd(骨骼血肉)
只是删除ibdta1文件,在确保.frm及.ibd文件在的情况下 恢复数据:
通过mysqlfrm来进行恢复(如果你能明确的知道表名甚至是表结构、数据类型的情况下,上篇文章即可解决,此篇主要是获取表结构),直接就不介绍.frm和.ibd文件了。
1.mysqlfrm
mysqlfrm是一个恢复性质的工具,可以用来读取.frm文件并从该文件中找到表定义,生成ddl语句,生成的ddl语句多用于在另一台服务器上创建表或进行诊断等。但有些信息不存在于.frm文件中,这些信息将会被忽略,如自增长序列。
安装:官方下载链接: https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
//注意是在linux环境下
//安装目录 自己创建
cd /mysqlfrm/
//解压文件
tar -xf mysql-utilities-1.6.5.tar.gz
ls
//进入解压好的文件夹
cd mysql-utilities-1.6.5/
//build构建
python ./setup.py build
//install安装
python ./setup.py install
//安装成功查看命令
mysqlfrm --version
buildj截图
install截图
成功及版本截图
2.简单说下mysqlfrm模式,其他命令可去官网或者help 查看
模式介绍
–basedir:需指定服务器的基本目录,相当于再生一个数据库实例,还需指定prot,user及.frm文件位置等信息,指定的prot不能与在运行的数据库冲突,可在原数据库无法打开情况下使用,在读取.frm文件后,再生的实例将被关闭,所有的临时文件将被删除。
例:mysqlfrm --basedir=/mysql/mysqld/ --port=3333 --user=mysql /mysql/data/test/tables.frm --show-stats
–server:需指定数据库的连接字符串,需在原数据库可以打开的情况下使用,指定数据库用户名,密码,端口号及.frm文件位置等信息。
例:mysqlfrm --server=root:Root#123@localhost:3306 /mysql/data/test/tables.frm --port=3310 --user=mysql
注意:如数据库还可以正常连接,推荐使用–server模式
3.操作
首先来看下在没恢复前,所有库所有表都是没有空的,但是数据库是可以连接的。
运行mysqlfrm 命令找到以前表结构
mysqlfrm --server=root:Root#123@localhost:3306 /mysql/data/test/tables.frm --port=3310 --user=mysql
//参数说明以及注意事项
root:Root#123@localhost:3306 => 账号:密码@本地(或者指定ip):端口
/mysql/data/test/tables.frm => 需要恢复的.frm文件
--port=3310 => 这个3310 端口一定不要和前面那个端口一样,前者是本生数据库端口,后者是mysqlfrm映射的端口
?
得到最关键的表结构以及类型,如上图
4.具体操作
4.1得到sql语句后,就需要在新的数据库执行,创建新的数据库表。
4.2 丢弃新的骨骼,换入旧的骨骼
ALTER TABLE `WIRELESS_ORDER_BUILD_ZX` DISCARD TABLESPACE;
此时少了一个.ibd文件,然后去旧的数据库文件夹里面复制拷贝出来
?4.3?数据库重新导入.ibd文件(进行融合)
ALTER TABLE `WIRELESS_ORDER_BUILD_ZX` IMPORT TABLESPACE; SHOW WARNINGS;
最后大功告成,旧库直接删除,用新库。
希望大家能早日成功恢复数据!!!