MySQL InnoDB 丢失了表但文件存在

Get*_*awn 34 mysql innodb

我有一个 MySQL InnoDB,它包含所有数据库表文件,但 MySQL 看不到它们,也没有加载它们。

问题发生是因为我删除了这三个文件:ibdata1,ib_logfile0ib_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 架构

将 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数据库

第1步

确保你有这些.frm.ibd文件的备份/tmp/innodb_data

第2步

获取CREATE TABLE tags语句并将其作为CREATE TABLE mydb.tags .... 确保它与原始结构完全相同tags.frm

第 3 步

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)

第 5 步

tags表添加到 InnoDB 数据字典

ALTER TABLE mydb.tags IMPORT TABLESPACE;
Run Code Online (Sandbox Code Playgroud)

第 6 步

测试表格的可访问性

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

如果你得到正常的结果,恭喜你导入了一个 InnoDB 表。

第 7 步

以后请不要删除ibdata1及其日志

试一试 !!!

我以前讨论过这样的事情

警告

如果您不知道 的表结构tags怎么办?

有一些工具可以仅使用该.frm文件来获取 CREATE TABLE 语句。我也写了一篇关于这个的帖子:How can extract the table schema from only the .frm file? . 在那篇文章中,我将一个 .frm 文件从 Linux 机器复制到了一台 Windows 机器上,运行了 Windows 工具并得到了CREATE TABLE语句。


小智 10

我有同样的情况,无法删除或创建特定的 tblname。我的修复程序是:

  1. 停止 MySQL。

    service mysql stop
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除 ib_logfile0 和 ib_logfile1。

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除 tblname 文件。警告:这将永久删除您的数据

    cd /var/lib/mysql/dbname;
    rm tblname*
    
    Run Code Online (Sandbox Code Playgroud)
  4. 启动 MySQL。

    service mysql start
    
    Run Code Online (Sandbox Code Playgroud)