问题

我在localhost中使用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版本开始.

这是一段时间以前,我做到了.但是,要将服务器设置为每个表使用单独的文件,您需要更改 my.cnf 以启用此功能:

[mysqld]
innodb_file_per_table=1

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

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

  1. Do a mysqldump of all databases, procedures, triggers etc except the mysql and performance_schema databases
  2. Drop all databases except the above 2 databases
  3. Stop mysql
  4. Delete ibdata1 and ib_log files
  5. Start mysql
  6. Restore from dump

当您在第5步启动MySQL时,将重新创建 ibdata1 ib_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 = innodb OPTIMIZE TABLE< tablename> ,可以从ibdata1提取数据和索引页到单独的文件.但是,除非您按照上述步骤操作,否则ibdata1不会收缩.




相关问题推荐