繁体   English   中英

在 MySQL 5.6.20 中释放空间 - InnoDB

Free up space in MySQL 5.6.20 - InnoDB

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

首先,不是 DB 人。 问题来了,数据库的数据驱动器已满 96%。 在 my.cnf 中有一行具有以下内容(由于空间原因仅显示部分)

innodb_data_file_path=nmsdata1:4000M;nmsdata2:4000M; 

上升到

nmsdata18:4000M:autoextend

因此,在存储文件的文件夹中,文件 1-17 的大小为 4gb,截至今天,文件 18 的大小为 136gb。

我继承了这个系统,它没有供应商支持或很多文档。 我可以看到有几张桌子真的很大

Table_name                             NumRows              Data Length
----------                             -------              -----------
pmdata                                 100964536            14199980032
fault                                  310864227            63437946880
event                                  385910821            107896160256

我知道有大量的写入发生,应该有一个 cron 作业告诉它只保留最近 3 个月的数据,但我担心数据库碎片化并且不会释放空间以供使用。

所以我的任务是释放数据库中的空间,这样驱动器就不会填满。

1 个回复

这是 innodb 的一个弱点:表空间永远不会缩小。 它们会增长,即使您对表进行“碎片整理”,它们也会在内部写入表空间的另一部分,留下更多的表空间“空闲”供其他数据使用,但磁盘上文件的大小不会缩小.

即使您 DROP TABLE,也不会为驱动器释放空间。

长期以来,这一直是 InnoDB 的痛点: https : //bugs.mysql.com/bug.php? id =1341 (大约 2003 年报道)。

解决方法是在您的配置中使用innodb_file_per_table=1 ,因此每个表都有自己的表空间。 然后,当您使用OPTIMIZE TABLE <tablename>它通过将数据复制到新表空间以更高效、更紧凑的内部布局进行碎片整理,然后删除碎片化的表空间。

但在你的情况下,这有一个大问题。 即使您在设置innodb_file_per_table=1后优化表,它们的数据也会被复制到新的表空间中,但这仍然不会缩小或删除旧的多表表空间,例如您的nmsdata1到 18。它们仍然会很大,但是“空的。”

我要说的是你被搞砸了。 无法缩小这些表空间,而且由于磁盘空间已满,因此也无法重构它们。

这就是我要做的:构建一个新的 MySQL 服务器。 确保配置了innodb_file_per_table=1 还要配置数据文件路径的默认值: innodb_data_file_path=ibdata1:12M:autoextend 这将使中央表空间从一开始就变小。 我们将避免用数据扩展它。

然后导出当前数据库服务器的所有转储。 将其导入新的 MySQL 服务器。 它将遵守 file-per-table 设置,数据将创建和填充新表空间,每个表一个。

鉴于您对数据增长的了解,这也是构建具有更大存储空间的新服务器的机会。

导入这么多数据需要很长时间。 多长时间取决于您的服务器性能规格,但至少需要几个小时。 也许几天。 如果您的原始数据库在您导入时仍然占用流量,则这是一个问题。

解决方案是使用复制,因此您的新服务器可以从创建转储的位置“赶上”到数据库的当前状态。 此过程已记录在案,但对于不是数据库专业人士的人来说,这可能是一段相当长的学习曲线,正如您所说: https : //dev.mysql.com/doc/refman/8.0/en/replication-howto。 html

您可能应该找一位知道如何完成这项工作的顾问。

1 mysql:如何释放空间(innodb)

我有一个配置了innoDB存储引擎的mysql数据库。 我删除了数据库( drop database &lt;dbname&gt; )但是没有释放磁盘空间。 在/var/lib/mysql有一些名为ib_logfile0 , ib_logfile1和ibdata1 “大”文件,其中最后一 ...

2009-05-27 08:45:26 2 9354   mysql
2 如何在Mysql数据库中释放空间? [关闭]

很难说出这里的要求。 这个问题是模棱两可的,模糊的,不完整的,过于广泛的或修辞性的,不能以目前的形式合理地回答。 如需帮助澄清此问题以便可以重新打开, 请访问帮助中心 。 我心中有一个问题,是否有可 ...

5 如何清洁,释放空间?

我在openembedded构建目录上 如何清除不需要的文件? 旧版本,废弃目标,缓存... 有什么选择可以不对每个配方复制依赖关系吗? 我要删除一项选定任务不需要的全部 ...

6 Zimbra不释放空间

我们正在使用Zimbra 8.0协作服务器开源版本。 (在centos6上发布8.0.0_GA_5434.RHEL6_64_20120907144639 CentOS6_64 FOSS版)。 当我们删除帐户或清空文件夹时,HDD中的可用空间没有增加。 例如,如果我们删除了一个10GB大 ...

7 Oracle Reyclebin不释放空间

我在Oracle 12.1上的数据库上工作。 每当我们出于任何原因删除表时,它都会进入回收站。 通常,每当我们构建另一个需要更多空间的表时,该空间就会自动在回收站中打开。 最近,回收站根本没有释放空间。 我必须手动清除回收站,否则无法构建需要该空间的表。 如何确保将回收站设置为仅在 ...

8 Postgres Vacuum不会释放空间

我的数据库中有一个占用161GB硬盘空间的表。 200Gb硬盘只剩下5 GB的可用空间。 以下命令显示我的表占用161GB硬盘空间, select pg_size_pretty(pg_total_relation_size('Employee')); 表中有近527行。 ...

10 使用 FillAndExpand 释放空间

我正在处理XAML视图,我想创建带有左侧栏的简单视图以及带有 Grid 和内部网格的内容我有一些按钮,我想要实现的是填充所有表单 代码: 问题是由于某种原因,如果我在主StackLayout上使用 FillAndExpand,它包含可用空间 我读到过,但人们只是说我缺少 FillAndExpan ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM