我在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回收空间时,实际上必须删除该文件:
- 对所有数据库、过程、触发器等执行
mysqldump,除了mysql和performance\u schema数据库 - 删除除上述两个数据库以外的所有数据库
- 停止mysql
- 删除
ibdata1和ibu日志文件 - 启动mysql
- 从转储还原
在步骤5中启动MySQL时,将重新创建ibdata1和ibu 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或优化表格<;表名>可以将数据和索引页从ibdata1提取到单独的文件中。但是,除非执行上述步骤,否则ibdata1不会收缩
关于信息\u模式,不需要也不可能删除。实际上,它只是一堆只读视图,而不是表。并且并没有和它们相关联的文件,甚至并没有数据库目录。informations_schema正在使用内存数据库引擎,在mysqld停止/重新启动时删除并重新生成。看见https://dev.mysql.com/doc/refman/5.7/en/information-schema.html.