我正在使用LINUX,我错误地删除了mysql文件夹中的ibdata1文件。
我重启了'mysqld'服务,现在当我试图从数据库中读取数据时,它无法找到旧表。
我遇到了大麻烦吗?如果有任何想法,请详细说明。
感谢您的时间。
谢谢和问候, SachinJadhav。
答案 0 :(得分:6)
你遇到了大麻烦......
默认情况下,ibdata1包含所有表的数据(因此丢失)。即使你将它配置为每个表使用一个单独的文件,所有内部MySQL的数据都存储在该文件中,据我所知,没有办法恢复它。
真的希望你有备份......
答案 1 :(得分:1)
除非您定义innodb_file_per_table
,否则这是一个表空间,与事务日志(存储在ib_logfile*
中)一起保存您的表数据。
删除它将有效删除InnoDB
表中存储的所有数据。
答案 2 :(得分:0)
如果启用了innodb_file_per_table
,则可以通过this和this恢复表。
对于MyISAM表mydb.mytable,您应该有三个文件
\bin\mysql\mysql5.6.12\data\mydb\mytable.frm
\bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
\bin\mysql\mysql5.6.12\data\mydb\mytable.MYI
由于每个文件都包含所需的数据,元数据和索引信息,因此它们应该已经可以作为表访问。它们共同构成表格。没有外部存储引擎机制可以访问。
看看这个InnoDB的图片表示形式
将ibdata1附加到.ibd
文件的唯一方法是数据字典。
如果您决定接受它,您的任务是创建每个表并在.ibd
中进行交换
执行任何操作之前,请将“ \ bin \ mysql \ mysql5.6.12 \ data”的完整副本复制到另一个
这是一个样本
假设您有一个数据库mydb
和表mytable
。这意味着
\bin\mysql\mysql5.6.12\data\mydb
mytable.frm
mytable.ibd
您需要.frm
。如果您看一下我的帖子https://dba.stackexchange.com/questions/44314/how-can-extract-the-table-schema-from-just-the-frm-file/44316#44316,则可以下载一个MySQL实用程序,该实用程序可以生成创建表所需的SQL。
您现在应该执行以下操作
mytable.ibd
移至\bin\mysql\mysql5.6.12\data
ALTER TABLE mydb.mytable DISCARD TABLESPACE;
(这将删除\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd
)\bin\mysql\mysql5.6.12\data\mytable.ibd
复制到\bin\mysql\mysql5.6.12\data\mydb
ALTER TABLE mydb.mytable IMPORT TABLESPACE;
(这会将\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd
注册到数据字典中)此后,应该可以完全访问表mydb.mytable
。您只需运行以下命令即可测试该可访问性:
SELECT * FROM mydb.mytable LIMIT 10;
尝试一下!
不是MySQL的一部分,但是Percona Xtrabackup之类的工具使导出/备份表的过程更快一些,从而允许使用正则表达式或列表进行过滤:
要导入表列表,可以使用诸如this one found on Bill Karwin tools之类的一些自动化oneliner:
mysqldump --no-data $schema > schema-ddl.sql
mysql -N -B <<'EOF' > discard-ddl.sql
SELECT CONCAT('ALTER TABLE `', table_name, '` DISCARD TABLESPACE;') AS _ddl
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$schema' AND ENGINE='InnoDB';
EOF
mysql -N -B <<'EOF' > import-ddl.sql
SELECT CONCAT('ALTER TABLE `', table_name, '` IMPORT TABLESPACE;') AS _ddl
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$schema' AND ENGINE='InnoDB';
EOF
基本上,您可以使用information_schema.tables
表使用“动态sql”列出所需的表。例如,将$schema
更改为所需的数据库名称。