1970年1月

MySQL 5.6从*.ibd文件恢复数据

MySQL我最常用的两种数据引擎是MyISAM和InnoDB。最近在本地WAMP环境下安装了WordPress博客。某一天发现无法登录WordPress后台了,直接跳转到WordPress的安装页面。看来是PHP无法连接MySQL数据库造成的。我继续用phpMyAdmin、SQLyog等客户端工具连接数据库查询WordPress表数据都返回一句法文错误信息,翻译过来的意思是“该数据表不存在”。打开 D:\wamp\bin\mysql\mysql5.6.17\my.ini配置文件,找到lc-messages=fr_FR修改为lc-messages=en_US 保存信息变为看得懂的英文。但是奇怪的是show tables 显示出来有的表,但是运行select全部报错table doesn't exist.

又打开Windows事件查看器(eventvwr.msc),筛选事件源为MySQL,发现了大量这种的警告信息:

InnoDB: Cannot open table wordpress/wp_posts from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.

经过两天两夜的大量Gooogle,发现此文件充斥着网络,貌似是一个普遍问题,而且是一个对MySQL新手来说容易犯的错误。MyISAM数据表.frm可以从一个服务器移动到另外一个服务器,而InnoDB数据引擎则不能直接移动,否则会出现tablespace不一致的问题。这种情况下日志会这种报错:

InnoDB: in InnoDB data dictionary has tablespace id N,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?
InnoDB: This may also be a table created with CREATE TEMPORARY TABLE
InnoDB: whose .ibd and .frm files MySQL automatically removed, but the
InnoDB: table still exists in the InnoDB internal data dictionary.

了解了这么多,中文网络里面的一般做法就是修改my.ini,加上

[mysqld]
innodb_force_recovery = 1

innodb_force_recovery的值可以是1、2、3、4、5、6,具体的含义参见:https://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html。但是我尝试了这样的方法还是找不到数据表。看来从MySQL服务器配置上恢复数据的方法走不通。我想尝试直接通过InnoDB的数据文件ibdata1、ib_logfile0、ib_logfile1,还是wordpress目录下的wp_posts.frm和wp_posts.ibd文件直接恢复。用Winhex分辨查看了以上文件,发现wp_posts.ibd里面有明文的数据内容(记得将Winhex的Charset设置为UTF-8)。然后Google到了从ibd文件恢复数据的方法。此方法略微“复杂”,以下我详细的写一下:

首选需要Linux系统,我这里安装的是最新的Debian 8.0 Jessie,直接通过apt-get加软件库来安装

加入apt签名:

apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

将以下内容添加到/etc/apt/sources.list,VERSION是版本代码,比如wheezy ,jessie等。

deb http://repo.percona.com/apt VERSION main deb-src http://repo.percona.com/apt VERSION main

更新一下: $ apt-get update

安装Percona Server、Client

$ apt-get install percona-server-server-5.6 percona-server-client-5.6

注意:Percona Server不能和MySQL Server同时共存,安装Percona前请先移除MySQL Serer。

安装完成后登录MySQL

mysql -uroot -ppassword

创建一个数据库

mysql> create database tunps_com; mysql> use tunps_com;

将我丢失数据的WordPress数据库表结构SQL文件导到刚cai