如何从ibd文件中恢复数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从ibd文件中恢复数据相关的知识,希望对你有一定的参考价值。
创建已经丢失的表结构
先要安装 mysql-utilities。
// RedHatyum -y install mysql-server mysql-utilities// Debianapt install mysql-utilities
使用 mysqlfrm 从 .frm 文件里面找回建表语句。
// 分析一个 .frm 文件生成建表的语句mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm// 分析一个目录下的全部.frm文件生成建表语句root@username:~# mysqlfrm --diagnostic /var/lib/mysql/my_db/bk/ >createtb.sqlroot@username:~# grep "^CREATE TABLE" createtb.sql |wc -l124
可以看到一共生成了 124 个建表语句。
有很多时候也可以从其它库里面生成建表语句,如同一个应用的其它数据库或不同的测试环境,采用下面的 mysqldump 生成建表语句:
mysqldump --no-data --compact my_db>createtb.sql
登录 MySQL 生成表。
mysql> create database my_db;mysql> use my_dbDatabase changedmysql> source createtb.sqlQuery OK, 0 rows affected (0.07 sec)......
导入旧的数据文件
将新建的没有包括数据的 .ibd 文件抛弃
root@username:/var/lib/mysql/my_db# ll *.ibd|wc12411167941root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v Tables_in_my_db \\| while read a; do mysql -e "ALTER TABLE my_db.$a DISCARD TABLESPACE"; doneroot@username:/var/lib/mysql/my_db# ll *.ibd|wcls: cannot access '*.ibd': No such file or directory000
可以看到所有的 .idb 文件都已经被抛弃了。然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。
root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v Tables_in_my_db \\| while read a; \\do mysql -e "ALTER TABLE my_db.$a import TABLESPACE"; done
导入完成后检查表
使用 mysqlcheck 对数据库 my_db 下的所有表进行检查:
root@username:/var/lib/mysql/my_db# mysqlcheck -c my_dbmy_db.cdp_backup_point OK......
所有的表都导入成功。
从 ibd 文件恢复数据数据库不起作用
【中文标题】从 ibd 文件恢复数据数据库不起作用【英文标题】:Restore data database from ibd file not working 【发布时间】:2017-06-18 23:57:03 【问题描述】:Mysql 5.5 InnoDB 坏了。我只有带有 .frm 和 ibd 文件的文件夹 mysql。
我在https://dba.stackexchange.com/questions/71596/restoring-mysql-tables-from-ibd-frm-and-mysqllogbin-files 找到了答案。在我升级 Mysql 5.6 并在http://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/ 使用 Method #2 的教程后,但表 wp_posts in database wordpress 上的任何数据都不正确。当我 ALTER TABLE wp_posts IMPORT TABLESPACE 时,它会中断 mysql(丢失连接)。我无法恢复它。请帮帮我。
这是我修复后的一条记录(数据在列之间杂乱无章):
************************* 1. row *************************
ID: 2
post_author: 1
post_date: 0000-00-09 05:24:20
post_date_gmt: 9272-08-30 08:00:00
post_content: V??<<iframe style="width: 100%;" src="https://docs.google.com/forms/d/e/1FAIpQLSe1mpUtq1EYSoLzsVJL_gAv8KCR023wO7uyxU0Tgps1UhHjjg/viewform?embedded=true" frameborder="0" margin margin>Đang tải...</i
post_title: frame>Đăng ký tư
post_excerpt:
post_status: vấnp
comment_status: ublish
ping_status: clos
post_password:
post_name: edopendang-ki-
to_ping:
pinged:
post_modified: 0909-02-09 08:38:31
post_modified_gmt: 1378-05-31 30:54:42
post_content_filtered:
post_parent: 1922960506717475414
guid: ??? http://duhocvaxuatkhau.co
menu_order: -315670672
post_type: age_
post_mime_type:
comment_count: -1629109878096134144
1 row in set (0.00 sec)
【问题讨论】:
mysqld.err 中有什么? @RickJames 我只有文件夹 mysql 文件夹。它没有文件 mysqld.err。之前查看mysql错误日志,提示“InnoDB is crash”,无法启动mysql。 【参考方案1】:更新: 建议先阅读这篇文章。 https://dba.stackexchange.com/questions/288860/restoring-mysql-data-from-ibd-file/288861#288861
我今天遇到了同样的问题,经过几次调查终于发现,在调用 IMPORT TABLESPACE
之前,将新文件的所有权更改为 mysql:mysql
非常重要。
所以:
No.1-
ALTER TABLE my_table DISCARD TABLESPACE;
2号-
CP /var/lib/mysql/old_db/my_table.ibd /var/lib/mysql/new_db/my_table.ibd
3号-
sudo chown mysql:mysql /var/lib/mysql/new_db/my_table.ibd
4号-
ALTER TABLE my_table IMPORT TABLESPACE;
它对我有用,我非常高兴:)
【讨论】:
以上是关于如何从ibd文件中恢复数据的主要内容,如果未能解决你的问题,请参考以下文章