MySQL取消了ibdata文件中的导入孤立数据

我正在导入一个数据库转储 – 几乎1GB的价值:

mysql -uroot -ppassword < mysqldump.sql 

当我收到警告说硬盘快满了。 我惊慌和Ctrl-Ced导入。 两次。

看着我的数据库,我可以看到导入被取消。 但是,当我看在/var/lib/mysql/我可以看到ibdata1仍然太大 – 我想它仍然有所有导入的数据。 这大约是数据库中可用数据的两倍。

我运行mysqlcheck -optimize -A但如果有的话,它使ibdata1文件变大。

我怎样才能清除这个孤立的数据? 硬盘上剩下大约100MB

这是MySQL中的一个已知错误: 1341 。 现在已经有8年了。 您可能想尝试一个解决方法, 张贴在StackOverflow上 :

ibdata1不缩小是MySQL特别恼人的特性。 除非删除所有数据库,删除文件并重新加载转储,否则ibdata1文件实际上不会收缩。

但是您可以configurationMySQL,以便每个表(包括其索引)都存储为一个单独的文件。 这样ibdata1将不会增长。

我刚才做了这个。 但是,要设置服务器为每个表使用单独的文件,您需要更改my.cnf以启用此function:

 [mysqld] innodb_file_per_table=1 

http://dev.mysql.com/doc/refman/5.5/en/multiple-tablespaces.html

如果您想要从ibdata1回收空间,您实际上必须删除该文件:

  1. 做所有的数据库,程序,触发器等mysqldump
  2. 删除除mysql-db之外的所有数据库
  3. 停止mysql
  4. 删除ibdata1ib_log文件
  5. 启动mysql
  6. 从转储还原

在步骤5中启动MySQL时,将重新创buildibdata1ib-log文件。

现在你可以走了。 当您创build新的数据库进行分析时,这些表将位于单独的ibd*文件中,而不是位于ibdata1 。 正如您通常在数据库后不久, ibd*文件将被删除。

http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

或者,如果你想保持数据库的运行,你可以试试这个:

在不closures数据库的情况下启用innodb_file_per_table选项。 这个想法是:

  • configuration您的原始数据库为主。 除非你的数据库已经在使用binlogs来保证安全,否则这是唯一需要重新启动MySQL的步骤。
  • 使用Xtrabackup备份原始数据库。
  • 恢复备份并运行第二个MySQL实例。
  • 在第二个实例上运行mysqldump。
  • 停止第二个实例,但不要删除它。
  • 创build一个新的数据库并使用启用的选项innodb_file_per_table启动MySQL的第三个实例。
  • 通过将其转储到MySQL的第三个实例来恢复转储。
  • 将第三个实例configuration为从属并运行复制。
  • 当初始复制完成并且从服务器赶上主服务器时,重新configuration客户端以使用新实例。
  • 而已。 您可以立即停止第一个实例并将其删除。

详细的文章可以在这里find。