我面临 MariaDB 数据库的磁盘空间问题,非常感谢您对解决该问题的见解。
这是场景:
MariaDB 版本:10.3
操作系统:Ubuntu 20.04
引擎:Innodb
表名:'foo'
数据长度:26GB
索引长度:16GB
可用数据:7GB
碎片 ~ 17%
innodb_file_per_table=ON
问题是存储数据库数据的主磁盘只剩下 8GB 可用空间。我们最近遇到了对“foo”表的批量删除操作,这导致了碎片。我想将空间回收回操作系统。
考虑到可用空间有限,OPTIMIZE TABLE
直接在“foo”表上运行命令是不可行的。该操作需要额外的磁盘空间来创建表的碎片整理副本。
我有一个额外的磁盘,空间足够,可以用来解决这个问题。夜间停机时间可能长达 6 小时。
这是我正在考虑的方法,非常感谢您对其可行性的反馈:
- 停止 MariaDB 服务
- 更改 mysqld.cnf 中的 datadir 位置以指向额外磁盘
- 启动 MariDB 服务
- 使用此查询优化表 -
ALTER TABLE foo ENGINE innodb;
- 重复 1-3 返回使用主磁盘。
您是否建议使用其他方法来有效处理这种情况?
对于未来的“大删除”,请参阅此处的多个提示: https: //mysql.rjweb.org/doc.php/deletebig
很多“Data_free”和“碎片”是不可避免的。特别是,4MB 到 7MB 之间的“Data_free”不太可能消失。碎片化也是难以捉摸的。不要费心去尝试
OPTIMIZE
这样的桌子。如果多个表的 Data_free 超过 7MB,请从最小的开始优化它们。但请检查大小,看看每一项是否都能在有限的磁盘空间下成功。这可以为淘气的桌子腾出足够的空间。
另一种可能有效的方法是将小表移至
ibdata1
.ibdata1
如果有大量可用空间,这将特别有帮助。执行此操作时,请观察该文件的大小,从较小的表开始:您似乎需要大约26+16 = 42GB,但只有 8GB。渐进优化或移动小表能否提供那么多空间并不明显。
今后,请避免占用超过一半的磁盘空间。或者至少为最大表的副本保留足够的可用空间。计划尽快获得更大的磁盘。
您提到了备用磁盘。为什么不简单地扩展到它呢?也就是说,不必费心将表移回当前驱动器。查看在 中指定多个磁盘驱动器的语法
my.cnf
。(MySQL/MariaDB 可以追溯到 2GB 是市场上最大磁盘的时代。)