我在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文件?
Answers:
这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
实际上必须删除文件:
mysqldump
所有数据库,过程,触发器等执行amysql
performance_schema
ibdata1
和ib_log
文件当您在步骤5中启动MySQL时,ibdata1
和ib_log
文件将被重新创建。
现在您可以出发了。创建新数据库进行分析时,这些表将位于单独的ibd*
文件中,而不是中ibdata1
。由于通常在不久之后ibd*
删除数据库,因此文件将被删除。
http://dev.mysql.com/doc/refman/5.1/zh-CN/drop-database.html
您可能已经看到了:http :
//bugs.mysql.com/bug.php?id=1341
通过使用该命令ALTER TABLE <tablename> ENGINE=innodb
或OPTIMIZE TABLE <tablename>
一个命令,可以将数据和索引页面从ibdata1提取到单独的文件。但是,除非执行上述步骤,否则ibdata1将不会收缩。
关于information_schema
,这是不必要的,也没有可能删除。实际上,它只是一堆只读视图,而不是表。而且没有与之关联的文件,甚至没有数据库目录。在informations_schema
使用内存数据库引擎和被丢弃,一旦停止再生/重启mysqld的。参见https://dev.mysql.com/doc/refman/5.7/en/information-schema.html。
innodb_file_per_table
默认启用。
除了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_logfile ib_logfile0
,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,以覆盖您希望保留的所有数据库。
create database database_name;
,然后grant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
提示符下键入密码(这是一种更安全的做法),只需输入-p
没有任何实际密码的密码即可。
当您删除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
如果将InnoDB存储引擎用于(某些)MySQL表,则可能已经遇到了默认配置问题。您可能已经注意到,在MySQL的数据目录(在Debian / Ubuntu – / var / lib / mysql中)中有一个名为“ ibdata1”的文件。它保存了MySQL实例的几乎所有InnoDB数据(不是事务日志),并且可能变得很大。默认情况下,此文件的初始大小为10Mb,并且会自动扩展。不幸的是,根据设计,InnoDB数据文件无法缩小。这就是为什么DELETE,TRUNCATE,DROP等不会回收文件使用的空间的原因。
我认为您可以在此处找到良好的解释和解决方案:
用bash快速编写接受答案的程序脚本:
#!/usr/bin/env bash
DATABASES="$(mysql -e 'show databases \G' | grep "^Database" | grep -v '^Database: mysql$\|^Database: binlog$\|^Database: performance_schema\|^Database: information_schema' | sed 's/^Database: //g')"
mysqldump --databases $DATABASES -r alldatabases.sql && echo "$DATABASES" | while read -r DB; do
mysql -e "drop database \`$DB\`"
done && \
/etc/init.d/mysql stop && \
find /var/lib/mysql -maxdepth 1 -type f \( -name 'ibdata1' -or -name 'ib_logfile*' \) -delete && \
/etc/init.d/mysql start && \
mysql < alldatabases.sql && \
rm -f alldatabases.sql
另存为purge_binlogs.sh
并运行为root
。
不包括mysql
,information_schema
,performance_schema
(和binlog
目录)。
假设您具有管理员凭据,/root/.my.cnf
并且数据库位于默认/var/lib/mysql
目录中。
您还可以在运行此脚本后清除二进制日志,以通过以下方法重新获得更多磁盘空间:
PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;
alldatabases.sql
在仔细检查所有表是否正常之前我不会删除。至于一些改进:innodb_fast_shutdown=0
在关机之前设置,autocommit=0
在导入SQL文件之前设置,在导入SQL文件之后执行COMMIT
并设置autocommit=1
,mysqlcheck --all-databases
在删除备份之前使用。
如果您的目标是监视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(这样做需要转储和重建),但是通常也没有真正的需要。
使用自动扩展(可能是最常用的大小设置)时,ibdata1会预分配存储,并在存储空间即将满时对其进行扩展。由于已经分配了空间,因此写入速度更快。
当您删除数据时,它不会收缩,但是文件内的空间被标记为未使用。现在,当您插入新数据时,它将在文件进一步增长之前重用文件中的空白空间。
因此,如果您确实需要这些数据,它只会继续增长。除非您实际上需要另一个应用程序的空间,否则可能没有理由缩小它。
storage leak
。