首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从frm和ibd中恢复Mysql innodb

从frm和ibd中恢复Mysql innodb
EN

Database Administration用户
提问于 2019-06-24 09:57:44
回答 1查看 3.6K关注 0票数 0

关于如何从*.frm和*.ibd文件中恢复innodb数据库(重点是:何时有未损坏的ibdata1),有许多问题(在这个站点和互联网上的其他地方)。

形势:

我分配给一个服务器,在那里mysql数据库刚刚崩溃,无法启动。为了让它们启动,我保存了整个/var/lib/mysql文件夹,然后删除了ibdata1ib_logfile0ib_logfile101,以便让mysql服务器启动。

这起作用了,MyISAM和一些InnoDB表回到了网上。但是,有些数据库中的某些InnoDb表无法恢复操作。

事实证明,数据库中没有备份(而且它们运行的是3+年份)。所有人都认为plesk做了dayli数据库备份,但实际上并非如此(Schr dinger的备份)。

在此之后,我们还发现,我保存的ibdata1以前已经被覆盖或删除,而一个新的是由mysql创建的(我用十六进制查看文件,文件中装满了零)。我还在lost+found中查找了前面的文件,但没有结果。

有两个数据库是关键的恢复,一个wordpress网站和plesk数据库。

然后,我将保存的mysql目录复制到我的机器上,并开始尝试恢复损坏的表。

问题:

我有一个崩溃的MySQL数据库,ibdata1文件丢失了,没有数据库备份可用。在我的机器上安装了相同的mariadb版本,因此我将保存mysql目录从服务器移到服务器上,并开始尽可能多地从所有者请求的两个数据库中恢复。

我已经将innodb_force_recovery = 6行写入/etc/mysql/my.cnf,以帮助恢复损坏的表。

如本文所述:损坏的InnoDB:只启动mysqld_力_recovery=6

然后,我尝试重新导入*.ibd文件,如下所述:https://medium.com/magebit/recover-innodb-database-from-frm-and-ibd-files-99fdb0deccad 1。一种适用于小型桌子的方法。在其他更大的表(如wp_posts )上,当执行ALTER TABLE wp_posts IMPORT TABLESPACE时,mysql服务器崩溃:

InnoDB: Trying to access page number 68160 in space 15 space name admin_wordpress/wp_posts, which is outside the tablespace bounds. Byte offset 0, len 16384 i/o type 10.

那么问题是:如何在这种失败的情况下恢复表?我发现的是:

1) https://twindb.com/recover-corrupt-mysql-database/,为此,我需要ibdata1。所以这是死胡同。

2) Percona数据恢复工具用于无害数据库--理论上这可以将现有的*.ibd连接到新的ibdata1上,但是我找不到二进制包,debian包不包含ibdconnect命令。我还找到了源代码:https://github.com/jiramot/percona-data-recovery-tool-for-innodb,但这不能编译。我试着解决编译中的链接错误,但是这可能会占用更多的时间,而且这个解决方案可能不起作用。

3)最后一次机会:重建场地。我可以从ibd文件strings admin_wordpress/wp_posts.ibd中提取字符串,这样就可以提取wordpress页面上文章的文本,用这种方式来修改站点是一项Sisyphean任务。(此方法不能应用于其他数据库应该恢复)

我还有其他工作方法从*.ibd文件中提取或恢复数据吗?甚至将记录提取到例如: JSON或BSON或CSV将是很好的,应该在恢复过程中向前迈进。

1:外部站点说:删除数据库,在破损的数据库*.frm文件上使用mysqlfrm重新创建空表(结果是创建表语句)。然后执行ALTER TABLE "table" DISCARD TABLESPACE以释放新创建的*.ibd文件。将旧的*.ibd移动到服务器目录,然后执行ALTER TABLE "table" IMPORT TABLESPACE以获取旧的表空间,从而恢复数据。

EN

回答 1

Database Administration用户

发布于 2019-06-24 11:36:48

有一种方法可以解决这个问题,但它可能不会一直有效,但还是值得一试(注意,先做一个备份):

  • 执行以下命令mysqlfrm –server=root:PWD@machine_ip –port=xxxx “/path/to/mytable.frm” > “/destination/path/recovered_mytable.sql”
  • 这将生成创建表脚本,您可以执行它来创建表。
  • 删除mysql alter table mytable drop tablespace;的新表空间
  • 将原始表复制到新的表位置,例如cp /home/mysql/x.ibd /mysql/data/mydb/
  • 重新激活表空间alter table mytable import tablespace;

有关mysqlfrm的更多信息,请参考https://docs.oracle.com/cd/E17952_01/mysql-实用程序-1.4-en/mysqlfrm.html文件,可以从https://downloads.mysql.com/archives/utilities/下载。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/241260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档