我试图从innodb定义的表中复制的文件夹中恢复旧的innodb数据库。目前没有二进制日志文件和my.ini文件。我手边没有ibdata日志文件。我只需要能够重新读取表信息,以便我可以重新制作那些丢失的表。
我也将失去外键关系。
如何恢复数据进入不可用日志文件的表格结构?
当我尝试访问这些表时,一些帮助错误消息是:
1. Can't find file: 'college_users' (errno: 2 - No such file or directory)
2. Table 'college.college_batches' doesn't exist
答案 0 :(得分:3)
有一个名为dbsake
的程序,它有一个名为frmdump
的命令。
解码MySQL .frm文件并输出CREATE VIEW或CREATE TABLE语句。
此命令不需要MySQL服务器,并根据类似于MySQL服务器的规则解释.frm文件。
有关此命令的工作方式的更多信息,请参见Description of the .frm format
示例:
$ dbsake frmdump --type-codes /var/lib/mysql/mysql/plugin.frm
--
-- Table structure for table `plugin`
-- Created with MySQL Version 5.5.35
--
CREATE TABLE `plugin` (
`name` varchar(64) NOT NULL DEFAULT '' /* MYSQL_TYPE_VARCHAR */,
`dl` varchar(128) NOT NULL DEFAULT '' /* MYSQL_TYPE_VARCHAR */,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL plugins';
更多详细信息:https://dbsake.readthedocs.io/en/latest/commands/frmdump.html
答案 1 :(得分:1)
更新:从那时起,我启动了在线工具,以从.frm文件中恢复结构。 https://recovery.twindb.com/
要从actor.frm文件恢复结构,请执行以下操作:
在数据库测试中创建虚拟表actor(请注意伪造的5.6个字段,原始表必须匹配):
mysql> use test
Database changed
mysql> create table actor(id int);
Query OK, 0 rows affected (0.01 sec)
对于5.6,create语句为create table actor(id1 int, id2 int, id3 int, id4 int);
。您如何知道表中的实际字段数。检查错误日志中的以下行:
2014-06-20 03:09:20 3741 [Warning] InnoDB: table test/actor contains 1 user defined columns in InnoDB, but 4 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how to resolve it
停止MySQL
将/var/lib/mysql/test/actor.frm替换为您的actor.frm文件:
cp /path/to/my/actor.frm `mysql -NBe"select @@datadir"`/test
使用innodb_force_recovery = 6启动MySQL
# cat /etc/my.cnf
...
[mysqld]
innodb_force_recovery=6
on windows put" innodb_force_recovery = 6"到[mysqld] group下的my.ini文件。
启动MySQL
阅读表actor的结构:
mysql> show create table actor\G
*************************** 1. row ***************************
Table: actor
Create Table: CREATE TABLE `actor` (
`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`actor_id`),
KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8