小编典典

如何在 MySQL 中收缩/清除 ibdata1 文件

all

我在 localhost 中使用 MySQL 作为在 R 中执行统计的“查询工具”,也就是说,每次我运行 R
脚本时,我都会创建一个新数据库(A),创建一个新表(B),将数据导入 B ,提交查询得到我需要的,然后我丢B,丢A。

它对我来说工作正常,但我意识到 ibdata 文件大小正在迅速增加,我在 MySQL 中没有存储任何内容,但 ibdata1 文件已经超过 100 MB。

我正在使用或多或少的默认 MySQL 设置进行设置,有没有办法在固定时间后自动收缩/清除 ibdata1 文件?


阅读 979

收藏
2022-03-08

共1个答案

小编典典

ibdata1不缩小是 MySQL 的一个特别烦人的特性。除非您删除所有数据库,删除文件并重新加载转储,否则该ibdata1文件实际上无法缩小。

但是您可以配置 MySQL,以便将每个表(包括其索引)存储为单独的文件。这样ibdata1就不会长得那么大,从 MySQL 的 5.6.6 版开始默认启用此功能。

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

[mysqld]
innodb_file_per_table=1

https://dev.mysql.com/doc/refman/5.6/en/innodb-file-per-table-
tablespaces.html

由于您想从中回收空间,因此ibdata1实际上必须删除该文件:

  1. 执行除 数据库 之外的 所有mysqldump数据库、过程、触发器等 mysql``performance_schema
  2. 删除 除上述2个数据库之外的所有数据库
  3. 停止mysql
  4. 删除ibdata1ib_log文件
  5. 启动mysql
  6. 从转储中恢复

当您在步骤 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=innodbOPTIMIZE TABLE <tablename>可以从
ibdata1 中提取数据和索引页面到单独的文件中。但是,除非您执行上述步骤,否则 ibdata1 不会缩小。

关于information_schema,没有必要也不可能放弃。它实际上只是一堆只读视图,而不是表。并且没有与它们关联的文件,甚至没有数据库目录。它informations_schema正在使用内存数据库引擎,并在
mysqld
停止/重新启动时被删除并重新生成。请参阅https://dev.mysql.com/doc/refman/5.7/en/information-
schema.html。

2022-03-08