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

我在localhost中使用MySQL作为“查询工具”在R中执行统计,也就是说,每次我运行R脚本时,我都会创建一个新数据库(a),创建一个新表(B),将数据导入B,提交一个查询以获得所需的数据,然后删除B和a

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

我在设置中或多或少使用了默认的MySQL设置,有没有办法在一段固定时间后自动收缩/清除ibdata1文件

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

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

那是很久以前的事了。但是,要将服务器设置为对每个表使用单独的文件,您需要更改my.cnf,以启用此功能:

[mysqld]
innodb_文件每_表=1

https://dev.mysql.com/doc/refman/5.6/en/innodb-file-per-table-tablespaces.html

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

  1. 对所有数据库、过程、触发器等执行mysqldump,除了mysqlperformance\u schema数据库
  2. 删除除上述两个数据库以外的所有数据库
  3. 停止mysql
  4. 删除ibdata1ibu日志文件
  5. 启动mysql
  6. 从转储还原

在步骤5中启动MySQL时,将重新创建ibdata1ibu log文件

现在你可以走了。创建新数据库进行分析时,表将位于单独的ibd*文件中,而不是ibdata1中。由于您通常很快就会删除数据库,ibd*文件将被删除

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

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

使用命令altertable<表名>ENGINE=innodb优化表格<表名&gt可以将数据和索引页从ibdata1提取到单独的文件中。但是,除非执行上述步骤,否则ibdata1不会收缩

关于信息\u模式,不需要也不可能删除。实际上,它只是一堆只读视图,而不是表。并且并没有和它们相关联的文件,甚至并没有数据库目录。informations_schema正在使用内存数据库引擎,在mysqld停止/重新启动时删除并重新生成。看见https://dev.mysql.com/doc/refman/5.7/en/information-schema.html.

发表评论