我在localhost中使用MySQL作为在R中执行统计的“查询工具”,也就是说,每次我运行R脚本时,我都会创建一个新的数据库(a),创建一个新的表(B),将数据导入到B中,提交一个查询以获得我需要的数据,然后我删除B和删除a。
这对我来说很好,但我意识到ibdata文件的大小正在迅速增加,我在MySQL中没有存储任何东西,但ibdata1文件已经超过100 MB。
我正在使用或多或少的默认MySQL设置进行设置,是否有一种方法可以让我在一段固定的时间后自动收缩/清除ibdata1文件?
我在localhost中使用MySQL作为在R中执行统计的“查询工具”,也就是说,每次我运行R脚本时,我都会创建一个新的数据库(a),创建一个新的表(B),将数据导入到B中,提交一个查询以获得我需要的数据,然后我删除B和删除a。
这对我来说很好,但我意识到ibdata文件的大小正在迅速增加,我在MySQL中没有存储任何东西,但ibdata1文件已经超过100 MB。
我正在使用或多或少的默认MySQL设置进行设置,是否有一种方法可以让我在一段固定的时间后自动收缩/清除ibdata1文件?
当前回答
再加上约翰P的回答,
对于linux系统,步骤1-6可以用这些命令完成:
Mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql Mysqladmin -u [username] -p[root_password] drop [database_name] sudo /etc/init.d / mysqld停止 Sudo rm /var/lib/mysql/ibdata1 执行rm /var/lib/mysql/ib_logfile* sudo /etc/init.d / mysqld开始 Mysqladmin -u [username] -p[root_password] create [database_name] Mysql -u [username] -p[root_password] [database_name] < dumpfilename.sql . zip
警告:如果你在这个mysql实例上有其他数据库,这些指令将导致你丢失其他数据库。确保修改步骤1、2和6、7以覆盖您希望保留的所有数据库。
其他回答
再加上约翰P的回答,
对于linux系统,步骤1-6可以用这些命令完成:
Mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql Mysqladmin -u [username] -p[root_password] drop [database_name] sudo /etc/init.d / mysqld停止 Sudo rm /var/lib/mysql/ibdata1 执行rm /var/lib/mysql/ib_logfile* sudo /etc/init.d / mysqld开始 Mysqladmin -u [username] -p[root_password] create [database_name] Mysql -u [username] -p[root_password] [database_name] < dumpfilename.sql . zip
警告:如果你在这个mysql实例上有其他数据库,这些指令将导致你丢失其他数据库。确保修改步骤1、2和6、7以覆盖您希望保留的所有数据库。
If you use the InnoDB storage engine for (some of) your MySQL tables, you’ve probably already came across a problem with its default configuration. As you may have noticed in your MySQL’s data directory (in Debian/Ubuntu – /var/lib/mysql) lies a file called ‘ibdata1′. It holds almost all the InnoDB data (it’s not a transaction log) of the MySQL instance and could get quite big. By default this file has a initial size of 10Mb and it automatically extends. Unfortunately, by design InnoDB data files cannot be shrinked. That’s why DELETEs, TRUNCATEs, DROPs, etc. will not reclaim the space used by the file.
我想你可以在那里找到很好的解释和解决方案:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
在新版的mysql服务器菜谱上面会粉碎“mysql”数据库。 在旧版本中,它是有效的。在new中,一些表切换到INNODB类型,这样做会损坏它们。 最简单的方法是:
转储所有数据库 卸载mysql服务器, 添加remain my.cnf:
[mysqld]
innodb_file_per_table=1
删除/var/lib/mysql中的所有文件 安装mysql服务器 恢复用户和数据库
如果您的目标是监视MySQL的空闲空间,而您又不能停止MySQL来缩小ibdata文件,那么可以通过表状态命令来获取它。例子:
MySQL > 5.1.24:
mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'
MySQL < 5.1.24:
mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'
然后将这个值与ibdata文件进行比较:
du -b ibdata1
来源:http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
如前所述,您不能收缩ibdata1(为此需要转储和重新构建),但通常也没有真正的必要。
使用autoextend(可能是最常见的大小设置),ibdata1预分配存储空间,在存储空间接近满时增长。这使得写入速度更快,因为已经分配了空间。
当你删除数据时,它不会缩小,但文件内部的空间被标记为未使用。现在,当您插入新数据时,它将在进一步增长文件之前重用文件中的空白空间。
所以只有当你真的需要这些数据时,它才会继续增长。除非您确实需要为另一个应用程序使用空间,否则可能没有理由缩小它。