我一直在寻找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,因为许多已删除的表没有释放空间并且数据库大小越来越大。
答案 0 :(得分:3)
这是因为您的本地服务器对表使用的引擎与实时服务器不同。
当表格是引擎InnoDB时,它们的数据存储在ibdata1中,当它们存储在.MY *文件中时,它们是引擎MyISAM。
在数据库中,甚至可以混合使用不同引擎的表。
主要区别在于,InnoDB能够进行交易。这意味着当任何失败时语句可以被还原,而MyISAM则无法做到这一点。
创建数据库时,可以指定新创建的表的默认引擎。我想这发生在你的情况下。您可以简单地转储表,并在创建的备份脚本中替换每个CREATE TABLE
语句末尾的引擎。然后再次插入数据,你没事。
答案 1 :(得分:0)
我知道这是一个有点老问题,但重要的是ibdata以两种方式存储来自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