我有一个 MySQL InnoDB,它包含所有数据库表文件,但 MySQL 看不到它们,也没有加载它们。
问题发生是因为我删除了这三个文件:ibdata1,ib_logfile0和ib_logfile1
因为我在启动 mysql 时遇到了问题,我读的是删除它们,因为 MySQL 只会重新生成它们(我知道我应该备份它们但没有)。
我该怎么做才能让 MySQL 再次查看这些表?
about_member.frm site_stories.frm
about_member.ibd site_stories.ibd
db.opt stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm
FTS_00000000000000bb_CONFIG.ibd story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm
FTS_00000000000000bb_DELETED.ibd story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd
FTS_00000000000000f5_DELETED.ibd story_view_totals.frm
member_favorites.frm story_view_totals.ibd
member_favorites.ibd tags.frm
members.frm tags.ibd
members.ibd
Run Code Online (Sandbox Code Playgroud)
Rol*_*DBA 38
这就是 MySQL 看不到这些文件的原因:系统表空间 (ibdata1) 有一个存储引擎特定的数据字典,它让 InnoDB 映射出潜在的表使用:

将 InnoDB 表从一个地方移动到另一个地方需要像这样的命令
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Run Code Online (Sandbox Code Playgroud)
这是MySQL 5.5 文档的一部分,解释了需要考虑的内容
.ibd 文件的可移植性注意事项
您不能像使用 MyISAM 表文件那样在数据库目录之间自由移动 .ibd 文件。存储在 InnoDB 共享表空间中的表定义包括数据库名称。存储在表空间文件中的事务 ID 和日志序列号也因数据库而异。
要将 .ibd 文件和关联表从一个数据库移动到另一个数据库,请使用 RENAME TABLE 语句:
将表 db1.tbl_name 重命名为 db2.tbl_name;如果你有一个 .ibd 文件的“干净”备份,你可以将它恢复到它起源的 MySQL 安装,如下所示:
自您复制 .ibd 文件以来,该表不得被删除或截断,因为这样做会更改存储在表空间内的表 ID。
发出此 ALTER TABLE 语句以删除当前 .ibd 文件:
更改表 tbl_name 丢弃表空间;将备份 .ibd 文件复制到正确的数据库目录。
发出这个 ALTER TABLE 语句来告诉 InnoDB 为表使用新的 .ibd 文件:
更改表 tbl_name 导入表空间;在这种情况下,“干净”的 .ibd 文件备份是满足以下要求的备份:
.ibd 文件中没有事务未提交的修改。
.ibd 文件中没有未合并的插入缓冲区条目。
Purge 已从 .ibd 文件中删除了所有带有删除标记的索引记录。
mysqld 已将 .ibd 文件的所有修改页面从缓冲池刷新到该文件。
鉴于这些警告和协议,这里是一个建议的行动方案
对于这个例子,让我们尝试将tags表恢复到mydb数据库
确保你有这些.frm和.ibd文件的备份/tmp/innodb_data
获取CREATE TABLE tags语句并将其作为CREATE TABLE mydb.tags .... 确保它与原始结构完全相同tags.frm
tags.ibd使用 MySQL删除空的
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)
带入备份副本 tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
Run Code Online (Sandbox Code Playgroud)
将tags表添加到 InnoDB 数据字典
ALTER TABLE mydb.tags IMPORT TABLESPACE;
Run Code Online (Sandbox Code Playgroud)
测试表格的可访问性
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
如果你得到正常的结果,恭喜你导入了一个 InnoDB 表。
以后请不要删除ibdata1及其日志
我以前讨论过这样的事情
Apr 23, 2012: MySQL:如何恢复存储在 .frm 和 .ibd 文件中的表?Sep 28, 2011:如何恢复文件被移动的 InnoDB 表如果您不知道 的表结构tags怎么办?
有一些工具可以仅使用该.frm文件来获取 CREATE TABLE 语句。我也写了一篇关于这个的帖子:How can extract the table schema from only the .frm file? . 在那篇文章中,我将一个 .frm 文件从 Linux 机器复制到了一台 Windows 机器上,运行了 Windows 工具并得到了CREATE TABLE语句。
小智 10
我有同样的情况,无法删除或创建特定的 tblname。我的修复程序是:
停止 MySQL。
service mysql stop
Run Code Online (Sandbox Code Playgroud)删除 ib_logfile0 和 ib_logfile1。
cd /var/lib/mysql;
rm ib_logfile0 ib_logfile1
Run Code Online (Sandbox Code Playgroud)删除 tblname 文件。警告:这将永久删除您的数据
cd /var/lib/mysql/dbname;
rm tblname*
Run Code Online (Sandbox Code Playgroud)启动 MySQL。
service mysql start
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
138438 次 |
| 最近记录: |