我正在导入一个数据库转储 — — 大小接近 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
实际上必须删除该文件:
mysqldump
对所有数据库、过程、触发器等进行检查- 删除除 mysql-db 之外的所有数据库
- 停止 mysql
- 删除
ibdata1
和ib_log
文件 - 启动mysql
- 从转储恢复
当您在步骤5中启动MySQL时,ibdata1
和ib-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 的第三个实例来恢复转储。
- 将第三个实例配置为从属并运行复制。
- 当初始复制完成并且从属服务器赶上主服务器时,重新配置您的客户端以使用新实例。
- 就这样。您现在可以停止第一个实例并将其删除。