如何收缩/清除MySQL中的ibdata1文件

我在本地主机上使用MySQL作为在R中执行统计的“查询工具”,也就是每次运行R脚本时,我创建一个新数据库(A),创建一个新表(B),将数据导入B ,提交一个查询来得到我需要的,然后我放下B并放下A.

它对我来说工作得很好,但我意识到ibdata文件的大小正在迅速增加,我没有在MySQL中存储任何内容,但ibdata1文件已经超过100 MB。

我正在使用或多或少的MySQL默认设置,是否有一种方法可以在一段固定时间后自动缩小/清除ibdata1文件?


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

但是您可以配置MySQL,以便每个表(包括其索引)都存储为单独的文件。 这样ibdata1增长就不会那么大。 根据Bill Karwin的评论,这在MySQL的5.6.6版本中是默认启用的。

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

[mysqld]
innodb_file_per_table=1

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

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

  • 执行mysqlperformance_schema数据库之外的所有数据库,过程,触发器等的mysqldump
  • 删除上述2个数据库以外的所有数据库
  • 停止mysql
  • 删除ibdata1ib_log文件
  • 启动mysql
  • 从转储还原
  • 当您在步骤5中启动MySQL时, ibdata1ib_log文件将被重新创建。

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

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

    你可能已经看到了这个:
    http://bugs.mysql.com/bug.php?id=1341

    通过使用命令ALTER TABLE <tablename> ENGINE=innodbOPTIMIZE TABLE <tablename>可以从ibdata1提取数据和索引页以分隔文件。 但是,除非您执行上述步骤,否则ibdata1不会收缩。

    关于information_schema ,这不是必要的也是可能的。 它实际上只是一堆只读视图,而不是表格。 没有与它们相关的文件,甚至没有数据库目录。 informations_schema正在使用内存数据库引擎,并在mysqld停止/重新启动时被删除并重新生成。 请参阅https://dev.mysql.com/doc/refman/5.7/en/information-schema.html。


    当你删除innodb表时,MySQL不会释放ibdata文件内部的空间,这就是它不断增长的原因。 这些文件几乎不会缩小。

    如何缩小现有的ibdata文件:

    http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html

    您可以编写脚本并安排脚本在一段固定时间后运行,但对于上述设置,似乎多个表空间是更简单的解决方案。

    如果使用配置选项innodb_file_per_table ,则可以创建多个表空间。 也就是说,MySQL为每个表创建单独的文件,而不是一个共享文件。 这些单独的文件存储在数据库的目录中,并且在您删除此数据库时将被删除。 这应该删除您的情况下收缩/清除ibdata文件的需要。

    有关多个表空间的更多信息:

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


    除了John P的回答,

    对于linux系统,可以使用以下命令完成步骤1-6:

  • mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
  • DROP DATABASE database_name
  • sudo /etc/init.d/mysqld stop
  • sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile (并删除其他可能被命名为ib_logfile0ib_logfile1等的ib_logfile1
  • sudo /etc/init.d/mysqld start
  • create database [database_name]
  • mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
  • 警告:如果您在此mysql实例上有其他数据库,这些说明将导致您丢失其他数据库。 确保步骤1,2和6,7已修改为涵盖您希望保留的所有数据库。

    链接地址: http://www.djcxy.com/p/39373.html

    上一篇: How to shrink/purge ibdata1 file in MySQL

    下一篇: How to 'insert if not exists' in MySQL?