首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL取消ibdata文件中的导入孤儿数据。

MySQL取消ibdata文件中的导入孤儿数据。
EN

Server Fault用户
提问于 2011-10-14 11:45:43
回答 1查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
mysql -uroot -ppassword < mysqldump.sql

当我收到警告说硬盘快满了的时候。我惊慌失措,把进口货弄走了。两次。

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

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

如何清除这些孤立的数据?我在硬盘上还有大约100 on .

EN

回答 1

Server Fault用户

回答已采纳

发布于 2011-10-14 12:08:13

这是MySQL:一三四一中的一个已知错误。这事已经持续8年了。您可能想尝试一种解决办法,张贴在StackOverflow上

ibdata1并没有缩小,这是MySQL的一个特别恼人的特性。除非删除所有数据库、删除文件并重新加载转储,否则ibdata1文件实际上无法缩小。

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

很久以前我就这么做了。但是,若要设置服务器对每个表使用单独的文件,则需要更改my.cnf以启用以下操作:

代码语言:javascript
复制
[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选项而不关闭数据库。这样做的目的是:

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

这里有一篇详细的文章。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/321435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档