1

我正在寻找 ibdata1 文件大小,但看到它只有 11MB,我感到很奇怪。还有另一个名称manu与数据库名称相同的文件夹,大小为 15GB。(在我的本地机器上)

我查看了实时服务器,他们的情况完全相反!

ibdata1 文件为 128 GB,具有 .frm + .MYD +.MYI 文件大小的文件夹较小。

如果我查找统计信息(本地机器)-

manu DB is 15GB
ibdata1 is 11MB

除此之外,在“manu”文件夹中,每个表格都有 3 个文件 - (仅作为示例:表格NEWS)。

NEWS.frm
NEWS.MYD
NEWS.MYI

很多次我已经从'manu'(在我的本地)中删除了所有表格并重新创建了表格。

我的问题是-为什么实时数据库在 ibdata 中包含所有内容(我假设 ibdata1 将包含我们在 mysql 表中看到的所有数据)以及为什么实时 ibdata1 非常少并且与它们相关的文件很大。它不是将所有数据存储在我本地的 ibdata1 中吗?

可能是什么问题。

实际上我想重建数据库并设置 innodb_file_per_table 因为许多已删除的表还没有释放空间并且数据库大小越来越大。

4

2 回答 2

3

这是因为您的本地服务器使用的表引擎与您的实时服务器不同。

当表属于引擎 InnoDB 时,它们的数据存储在 ibdata1 中,当它们存储在 .MY* 文件中时,它们属于引擎 MyISAM。

在数据库中,甚至可以混合使用不同引擎的表。

主要区别在于,InnoDB 能够处理事务。这意味着当任何失败时语句可以恢复,而这在 MyISAM 中是不可能的。

创建数据库时可以为新创建的表指定默认引擎。我猜你的情况就是这样。CREATE TABLE您可以简单地转储您的表,并在创建的备份脚本中,您可以在每个语句的末尾替换引擎。然后再次插入数据就可以了。

于 2013-02-04T13:48:02.287 回答
0

我知道这是一个有点老的问题,但要补充的重要一点是 ibdata 通过两种方式存储 InnoDB 表中的数据:

1- 如果没有启用 my.cnf (my.ini) innodb_file_per_table,InnoDB 表中的所有数据都存储到 ibdata 文件中,如果它有些损坏,恭喜,你失去了一切!

2-启用 my.cnf (my.ini) innodb_file_per_table 后,每个表 (.frm) 将有自己的数据文件 (.ibd),并且 ibdata1 将用作“缓存”/“工作文件”,如果您损坏了 mysql您可以使用 .ibd 文件恢复数据。

恢复表以进行转储的一些方法(在操作后表变得无用)如下: http://www.chriscalender.com/recovering-an-innodb-table-from-only-an-ibd-file/ http ://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB- MySQL-files-using-MAMP-on-a-Mac

如果您丢失数据,永远不要在备份文件之前使用“innodb_force_recovery”,因为这会破坏您的 ibdata 文件,即使值为 1、2 和 3,也存在风险,值为 4、5 和 6,其肯定会造成损害,因为它们是强制 mysql 读取数据以进行转储的更具侵略性的方式。(详情:http ://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_force_recovery )

最后但同样重要的是,为避免获取损坏的 ibdata 文件并丢失数据,在 my.cnf (my.ini) 文件中始终明确声明 innodb_fast_shutdown=0,如果您不声明它,它的默认值是“ 1",快速关机会忽略一些安全操作,很容易损坏你的ibdata文件。详细信息: http: //dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_fast_shutdown

更多 InnoDB 参数: http ://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

于 2014-11-05T21:03:12.443 回答