首页 文章

为什么ibdata1文件占用的空间少于.frm .MYD .MYI文件?

提问于
浏览
1

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

我查看了直播服务器,它们正好相反!

ibdata1文件是128 GB,文件夹的.frm .MYD .MYI文件大小较少 .

如果我查找统计数据(本地机器) -

manu DB is 15GB
ibdata1 is 11MB

与此同时,在文件夹'manu'中,每个表都有3个文件 - (仅用于示例:table NEWS ) .

NEWS.frm
NEWS.MYD
NEWS.MYI

很多次我从“manu”(在我的本地)和重新创建的表中删除了所有表 .

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

可能是什么问题 .

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

2 回答

  • 0

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

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

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

    主要区别在于,InnoDB能够进行交易 . 这意味着当任何失败时语句可以被还原,而MyISAM则无法做到这一点 .

    创建数据库时,可以指定新创建的表的默认引擎 . 我想这发生在你的情况下 . 您可以简单地转储表,并在创建的备份脚本中替换每个 CREATE TABLE 语句末尾的引擎 . 然后再次插入数据,你没事 .

  • 3

    我知道这是一个有点老问题,但重要的是ibdata以2种方式存储来自InnoDB Tables的数据:

    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

相关问题