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

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

我正在导入一个数据库转储 — — 大小接近 1GB:

mysql -uroot -ppassword < mysqldump.sql

当我收到硬盘快满了的警告时,我慌了,按下 Ctrl-C 键,取消了导入。两次。

查看我的数据库,我可以看到导入已被取消。但是当我查看时,/var/lib/mysql/我发现ibdata1它仍然太大 - 我猜它仍然包含所有导入的数据。它大约是数据库中可用数据大小的两倍。

我运行了mysqlcheck -optimize -A但它却使ibdata1文件变得更大了。

我该如何清除这些孤立数据?我的硬盘上还剩下大约 100MB 的空间……

答案1

这是 MySQL 中的一个已知错误:1341。这种情况已经持续了 8 年。你可能想尝试一种解决方法,发布在 StackOverflow 上

ibdata1缩小是 MySQL 的一个特别令人讨厌的功能。ibdata1除非您删除所有数据库、移除文件并重新加载转储,否则文件实际上无法缩小。

但是您可以配置 MySQL,以便将每个表(包括其索引)存储为单独的文件。这样ibdata1就不会变得太大。

我很久以前就这样做过。但是,要将服务器设置为对每个表使用单独的文件,您需要进行更改my.cnf才能实现这一点:

[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时,ibdata1ib-log文件将被重新创建。

现在您可以开始了。当您创建新的数据库进行分析时,表将位于单独的ibd*文件中,而不是 中ibdata1。由于您通常会在之后不久删除数据库,因此ibd*文件将被删除。

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

或者,如果您想在执行此操作时保持数据库运行,您可以尝试以下操作:

无需关闭数据库即可启用 innodb_file_per_table 选项。思路是:

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

详细文章请参见此处。

相关内容