我之前保存了 /var/lib/mysql/ddms 目录的副本(“ddms”是模式名称)。现在我通过运行在新安装的 Ubuntu 10.04.3 LTS 上安装了一个新的 MySQL apt-get install mysql-server
,我相信已经安装了 5.1 版。在我复制 /var/lib/mysql 下的 ddms 目录后,它的一些表工作正常,这些表具有一组关联的三个文件:一个 .frm 文件、一个 .MYD 文件和一个 .MYI 文件。
但是,有两个表具有不同的文件集:一个 .frm 文件和一个 .ibd 文件。这两个表没有出现在 phpMyAdmin 的表列表中。当我查看错误日志时,它说:
[ERROR] Cannot find or open table ddms/dictionary_item from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.
请帮助恢复这两个表。谢谢。
InnoDB 表不能像 MyISAM 表一样被复制。
只是将 .frm 和 .ibd 文件从一个位置复制到另一个位置是自找麻烦。仅当且仅当您可以保证 .ibd 文件的表空间 id 与 ibdata1 文件的元数据中的表空间 id 条目完全匹配时,复制 InnoDB 表的 .frm 和 .ibd 文件才有效。
我在 DBA StackExchange 上写了两篇关于这个表空间 id 概念的文章
这是关于如何在表空间 id 不匹配的情况下将任何 .ibd 文件重新附加到 ibdata1 的绝佳链接:http: //www.chriscalender.com/ ?tag=innodb-error-tablespace-id-in-file 。阅读本文后,您应该立即意识到复制 .ibd 文件简直是疯了。
您可以应用 Chris Calendar 链接中的建议,或者您可以回到 mysql 的旧安装,启动 mysql,然后 mysqldump
ddms
数据库。然后,将该 mysqldump 导入新的 mysql 实例。相信我,这会容易得多。我最近遇到了同样的问题。这是我用来解决它的步骤,而不必像上面提到的 RolandoMySQLDBA 那样弄乱表空间 id。我在 Mac 上,所以我使用 MAMP 将数据库恢复到可以将其导出到 MySQL 转储中的位置。
你可以在这里阅读完整的博客文章:http ://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on-a-Mac
你必须有:
-ibdata1
-ib_logfile0
-ib_logfile1
-.FRM 来自 mysql_database 文件夹的文件
- 全新安装您愿意销毁的 MAMP / MAMP Pro(如果需要)
从生产服务器(在我的情况下为 mt Plesk 环境)复制包含在 mysql 文件夹存档中的所有文件夹和文件,除非不要覆盖:
-/应用程序/MAMP/db/mysql/mysql/
-/应用程序/MAMP/db/mysql/mysql_upgrade_info
-/应用程序/MAMP/db/mysql/performance_schema
瞧,您现在应该可以从 phpMyAdmin 访问数据库了,真是一种解脱!
但是我们还没有完成,您现在需要执行 mysqldump 以将这些文件恢复到您的生产环境,并且 phpmyadmin 界面对于大型数据库会超时。请按照此处的步骤操作:
http://nickhardeman.com/308/export-import-large-database-using-mamp-with-terminal/
复制如下以供参考。请注意,在默认 MAMP 安装中,密码为“root”。
如何使用终端为 MAMP 运行 mysqldump
从 MAMP[1] 导出数据库
第一步: 打开一个新的终端窗口
第二步: 通过在终端 cd /applications/MAMP/library/bin 中输入以下行来导航到 MAMP 安装 按回车键
第三步: 编写转储命令 ./mysqldump -u [USERNAME] -p [DATA_BASENAME] > [PATH_TO_FILE] 按回车键
例子:
快速提示:要快速导航到文件夹,您可以将文件夹拖到终端窗口中,它将写入文件夹的位置。有人向我展示了这一点,这是美好的一天。
第四步: 这行文字应该在你按回车键后出现 输入密码:猜猜看,输入你的密码,记住字母不会出现,但它们在那里 按回车键
第五步: 检查你存储文件的位置,如果在那里,成功 现在你可以导入数据库,这将在下面概述。
现在您已经导出了 mysql 数据库,您可以在生产环境中导入它。
我已经使用 MySQL Utilites 和 MariaDB 10 恢复了我的 MySQL 5.5 *.ibd 和 *.frm 文件。
1) 生成创建 SQL。
您可以从 frm 文件中获取您的创建 sql。您必须使用:https ://downloads.mysql.com/archives/utilities/shell
> mysqlfrm --server=root:pass@localhost:3306 c:\MY\t1.frm --port=3310
您可能有其他方式你创建 sql 的。
2) 创建您
的表 在数据库上创建您的表。
3) alter table xxx discard tablespace
丢弃你想要替换*.ibd 文件的表。
4) 将您的 *.ibd 文件(MySQL 或 MariaDB)复制到 MariaDB 的数据路径
首先我尝试使用 MySQL 5.5 和 5.6 进行恢复,但数据库崩溃并立即停止关于表空间 id 损坏的错误。( ERROR 1030 (HY000): Got error -1 from storage engine )
在我使用 MariaDB 10.1.8 之后,我已经成功恢复了我的数据。
5) alter table xxx import tablespace
当你运行这个语句时,MariaDB 会警告文件但它并不比恢复你的数据重要:) 数据库仍然继续,你可以看到你的数据。
我希望这些信息对您有所帮助。
我只有将文件作为备份时遇到了完全相同的问题。
我为解决它所做的是将数据库文件复制到/var/lib/mysql/yourdb 和放在/var/lib/mysql 中的ibdata1。
然后我能够验证我是否可以访问表 mysql -u root -p dbname并查询以前损坏的一些表。
之后我使用mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql 转储了数据库
如果您使用的是 MAMP,并且在复制文件后无法启动 MySQL,我将其
innodb_force_recovery = 2
放入my.ini
其中,然后我能够启动 mysql 并将我的数据库导出。Note: Try to install MySQL same version, if your crashed MySQL version was 5.6, please install MySQL 5.6. (
brew install [email protected]
). If following process fails try the same things with MariaDB. (In my case, by MariaDB, I get back all database)Process 1
brew services stop mysql
), For MariaDBbrew services stop mariadb
Process 2
ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
end of every CREATE TABLE....ENGINE=InnoDB otherwise table may not created.mysqldump -uroot -p --databases newtestdb > testdb.sql
mysql -u root -p
SHOW DATABASES;
USE newtestdb;
ALTER TABLE tablename DISCARD TABLESPACE;
if you check newtestbd .ibd file will disapear.ALTER TABLE tablename IMPORT TABLESPACE;
(首先,你需要在你的操作系统中安装一个名为“mysql-utilities”的小包,
mysqlfrm --port=3333 your_table.frm > result.sql --basedir=/path/to/your/installation-folder/mysql
用于恢复建表sql),之后,我收集了类似主题的帖子,没有提到在本主题中:解决方案0:https ://dba.stackexchange.com/a/57157/44247
解决方案1:https ://dba.stackexchange.com/a/59978
解决方案2:https ://dba.stackexchange.com/a/71785 (+其他帖子)
解决方案 3:表恢复工具包:https ://twindb.com/how-to-recover-innodb-dictionary/
解决方案 4:从 ibd 文件中恢复没有 ibdata1 的数据文件夹中的 MySQL 数据库
解决方案5:https ://dba.stackexchange.com/a/159001
解决方案6:https ://dba.stackexchange.com/a/144573
如果您能够将 *.ibd 文件恢复到原始 MySQL 服务器,请不要忘记也恢复文件访问权限。就我而言(CentOS7 上的 MySQL8),我将文件恢复到 /var/lib/mysql/db/tablename.ibd 并运行:
在修复访问权限之前,访问表导致错误“2006 MySQL 服务器已消失”。修复访问权限后,该表工作(即使没有重新启动 mysqld 服务)。
我只想为 macos El Capitan 用户再添加一件事。此版本不支持 MySQL 实用程序,因此 mysqlfrm 命令没有帮助。我所做的是使用 dbsake 恢复我的表结构,如以下链接所示:https ://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-using-dbsake/
您需要做的就是安装 dbsake:
然后使用 frmdump 命令并提供 .frm 文件的路径:
你会得到 create 语句。完成此操作后,我只需按照@Ecd 已经提到的步骤 2 到 5 进行操作。希望它可以帮助某人。
我非常感谢 Ecd。什么对我有用:
1.-几个月前我有一个基础备份,这帮助我在 Windows 10 的 xampp 中解除了这个备份并创建了具有结构的表 (配置:Windows 10,xampp-windows-x64-7.1.30- 5-VC14) mysql my.ini 配置文件末尾
2.-启动旧数据库后,我继续对要恢复的数据库中的每个表执行 alter table xxx discard tablespace,然后在 C:/xampp/mysql/data/system 中的 data 文件夹的 .ibd 文件已被删除(在这种情况下是这条路径)
3.-我继续将 .ibd 文件从要恢复的数据库复制到旧数据库的 xampp 文件夹中
4.-复制完文件,运行:alter table xxx import tablespace 对于数据库中的每个表,都会出现警告但我们将忽略它,数据将加载到表中,稍后可以导出。
5.-将整个数据库导出到一个 sql 文件中,然后继续在生产中构建它并成功!
I hope it helps someone who has this situation, regards.
English provided by Google