我在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以覆盖您希望保留的所有数据库。
其他回答
在新版的mysql服务器菜谱上面会粉碎“mysql”数据库。 在旧版本中,它是有效的。在new中,一些表切换到INNODB类型,这样做会损坏它们。 最简单的方法是:
转储所有数据库 卸载mysql服务器, 添加remain my.cnf:
[mysqld]
innodb_file_per_table=1
删除/var/lib/mysql中的所有文件 安装mysql服务器 恢复用户和数据库
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/
快速脚本接受的答案的过程在bash:
#!/usr/bin/env bash
dbs=$(mysql -BNe 'show databases' | grep -vE '^mysql$|^(performance|information)_schema$')
mysqldump --events --triggers --databases $dbs > alldatabases.sql && \
echo "$dbs" | while read -r db; do
mysqladmin drop "$db"
done && \
mysql -e 'SET GLOBAL innodb_fast_shutdown = 0' && \
/etc/init.d/mysql stop && \
rm -f /var/lib/mysql/ib{data1,_logfile*} && \
/etc/init.d/mysql start && \
mysql < alldatabases.sql
保存为purge_binlogs.sh并以root用户运行。
不包括mysql, information_schema, performance_schema(和binlog目录)。
假设您在/root/.my.cnf中有管理员凭证,并且您的数据库位于默认的/var/lib/mysql目录中。
您也可以在运行此脚本后清除二进制日志,以重新获得更多的磁盘空间:
PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;
当你删除innodb表时,MySQL不会释放ibdata文件中的空间,这就是为什么它一直在增长。这些文件几乎从不缩小。
如何缩小现有的ibdata文件:
https://dev.mysql.com/doc/refman/5.6/en/innodb-system-tablespace.html#innodb-resize-system-tablespace
您可以编写脚本,并安排脚本在固定的时间后运行,但对于上面描述的设置,多个表空间似乎是更简单的解决方案。
如果使用配置选项innodb_file_per_table,则会创建多个表空间。也就是说,MySQL为每个表创建单独的文件,而不是一个共享文件。这些单独的文件存储在数据库的目录中,当您删除该数据库时,它们将被删除。在您的情况下,这样就不需要收缩/清除ibdata文件了。
关于多个表空间的更多信息:
https://dev.mysql.com/doc/refman/5.6/en/innodb-file-per-table-tablespaces.html
似乎没有人提到innodb_undo_log_truncate设置可能产生的影响。
在阅读了Percona关于这个主题的博客文章后,我在MariaDB 10.6中启用了截断UNDO LOG条目的功能,它填充了ibdata1的95%,在完全删除和恢复之后,从那时起,ibdata1就不再增长了。
在默认innodb_undo_log_truncate = 0的情况下,我的ibdata1很容易就达到了数据库空间占用的10%,也就是几十gb。
innodb_undo_log_truncate = 1时,ibdata1的大小为76 Mb。