XAMPP环境下导入ibd文件恢复WordPress MySQL数据遇阻求助
用ibd文件恢复WordPress wp_posts和wp_postmeta表的步骤
核心前提
必须确保新建空表的结构、引擎、字符集和原表完全一致,否则导入会失败。
1. 导出原表结构(用备份的frm文件)
如果不确定原表结构,用mysqlfrm工具(XAMPP自带,可在xampp/mysql/bin目录找到)导出frm文件对应的表结构:
mysqlfrm --diagnostic C:/xampp/mysql/data/你的数据库名/wp_posts.frm mysqlfrm --diagnostic C:/xampp/mysql/data/你的数据库名/wp_postmeta.frm
把输出的CREATE TABLE语句复制出来,这就是原表的准确结构。
2. 创建空表并删除二级索引
针对wp_posts
先执行CREATE TABLE语句创建空表,然后删除所有非主键的二级索引:
-- 先创建空表(替换成你导出的完整结构) CREATE TABLE `wp_posts` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_author` bigint(20) unsigned NOT NULL DEFAULT 0, `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content` longtext NOT NULL, `post_title` text NOT NULL, `post_excerpt` text NOT NULL, `post_status` varchar(20) NOT NULL DEFAULT 'publish', `comment_status` varchar(20) NOT NULL DEFAULT 'open', `ping_status` varchar(20) NOT NULL DEFAULT 'open', `post_password` varchar(20) NOT NULL DEFAULT '', `post_name` varchar(200) NOT NULL DEFAULT '', `to_ping` text NOT NULL, `pinged` text NOT NULL, `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content_filtered` longtext NOT NULL, `post_parent` bigint(20) unsigned NOT NULL DEFAULT 0, `guid` varchar(255) NOT NULL DEFAULT '', `menu_order` int(11) NOT NULL DEFAULT 0, `post_type` varchar(20) NOT NULL DEFAULT 'post', `post_mime_type` varchar(100) NOT NULL DEFAULT '', `comment_count` bigint(20) NOT NULL DEFAULT 0, PRIMARY KEY (`ID`), KEY `post_name` (`post_name`), KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), KEY `post_parent` (`post_parent`), KEY `post_author` (`post_author`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 删除所有二级索引 ALTER TABLE wp_posts DROP INDEX post_name; ALTER TABLE wp_posts DROP INDEX type_status_date; ALTER TABLE wp_posts DROP INDEX post_parent; ALTER TABLE wp_posts DROP INDEX post_author;
针对wp_postmeta
同样操作:
-- 创建空表(替换成你导出的完整结构) CREATE TABLE `wp_postmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_id` bigint(20) unsigned NOT NULL DEFAULT 0, `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext DEFAULT NULL, PRIMARY KEY (`meta_id`), KEY `post_id` (`post_id`), KEY `meta_key` (`meta_key`(191)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 删除二级索引 ALTER TABLE wp_postmeta DROP INDEX post_id; ALTER TABLE wp_postmeta DROP INDEX meta_key;
3. 替换ibd文件并导入表空间
- 进入XAMPP的
mysql/data/你的数据库名/目录,删除刚创建的wp_posts.ibd和wp_postmeta.ibd文件。 - 把你备份的这两个ibd文件放到该目录下,确保文件权限和其他MySQL数据文件一致(Windows默认即可,Linux需设置为
mysql:mysql权限)。 - 回到phpMyAdmin或MySQL命令行,执行导入命令:
-- 处理wp_posts ALTER TABLE wp_posts DISCARD TABLESPACE; ALTER TABLE wp_posts IMPORT TABLESPACE; -- 处理wp_postmeta ALTER TABLE wp_postmeta DISCARD TABLESPACE; ALTER TABLE wp_postmeta IMPORT TABLESPACE;
如果执行成功,就说明数据已经导入。
4. 恢复二级索引
导入成功后,把之前删除的二级索引重新添加回去:
-- 恢复wp_posts的索引 ALTER TABLE wp_posts ADD INDEX post_name (`post_name`); ALTER TABLE wp_posts ADD INDEX type_status_date (`post_type`,`post_status`,`post_date`,`ID`); ALTER TABLE wp_posts ADD INDEX post_parent (`post_parent`); ALTER TABLE wp_posts ADD INDEX post_author (`post_author`); -- 恢复wp_postmeta的索引 ALTER TABLE wp_postmeta ADD INDEX post_id (`post_id`); ALTER TABLE wp_postmeta ADD INDEX meta_key (`meta_key`(191));
额外注意事项
- 如果导入时提示版本不兼容,说明重装的XAMPP中MySQL版本和原版本差异过大,建议下载和原版本一致的XAMPP,用相同环境恢复后再导出SQL备份。
- 操作全程不要关闭MySQL服务,替换文件前确保表没有被访问。
- 恢复成功后,立刻导出SQL备份(phpMyAdmin里选择表导出为SQL),避免再次出现问题。
内容的提问来源于stack exchange,提问作者Jack The Baker
相关产品推荐
相关产品推荐

