如果启用了innodb_file_per_table,则可以通过this 和this 恢复表。
MyISAM
对于一个 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
看看这个 InnoDB 的图示
InnoDB Architecture
唯一将 ibdata1 附加到 .ibd 文件的是数据字典。
如果您决定接受,您的任务是创建每个表并交换.ibd
在你做任何事情之前,将“\bin\mysql\mysql5.6.12\data”完整复制到另一个
这是一个示例
假设您有一个数据库mydb 和表mytable。这意味着
- 你有文件夹
\bin\mysql\mysql5.6.12\data\mydb
- 在该文件夹中,您有
您需要.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
- 运行 SQL 创建 InnoDB 表
- 登录mysql并运行
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
- 登录mysql并运行
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:
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 更改为所需的数据库名称。