当前位置: 首页 > 面试题库 >

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

沙星波
2023-03-14
问题内容

我将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.6版本开始启用此功能。

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

[mysqld]
innodb_file_per_table=1

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

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

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

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

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



 类似资料:
  • 本文向大家介绍MySQL问答系列之如何避免ibdata1文件大小暴涨,包括了MySQL问答系列之如何避免ibdata1文件大小暴涨的使用技巧和注意事项,需要的朋友参考一下 0、导读 ibdata1文件是什么? ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。如果file-per-table选项打开的话,该

  • 几天前,我无法让mysql运行了(xampp),经过一些谷歌搜索,我发现了这篇文章:xampp-MySQL意外关机 它说删除ibdata1文件,我做了,mysql再次启动,但一个数据库的表不见了,但我仍然可以看到数据文件夹中包含值的表(ibd和frm文件),我可以恢复这些表吗?

  • 问题内容: Ingredient_list是一个显示诸如…(“糖”,“ 1杯”)之类的列表,依此类推… def是针对所选组合框的,所以我想要的是清除树形视图而不是只是继续添加更多的成分。不幸的是我没有看到一种方法。 如果有一种编程的方式来识别首先存在的内容(枚举行数将是个好方法……),这真让我发疯。我确实在文档中注意到您可以使用delete方法,但是它想知道要删除的项目…如果使用: 我懂了 所以我

  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

  • 问题内容: 我在寻找类似c ++函数 的原始类型。 还是应该只创建一个新地图? 更新:谢谢您的回答。通过查看答案,我刚刚意识到有时创建新地图可能会导致某些我们不希望出现的不一致情况。考虑以下示例: 我的意思是,这仍然与c ++中的功能不同,后者将清除对象中的内容。 问题答案: 您可能应该只创建一个新地图。没有真正的理由去尝试清除现有的代码,除非同一段映射被多个代码引用,并且一个代码段明确需要清除值