从 INNODB 中的表中回收空间需要多少空间

Eva*_*gas 5 mysql innodb mysql-5.5 percona-tools percona-toolkit

我继承了一个 MySQL InnoDB 表,它包含大约 200 GB 的数据,以及几个大约 500 GB 的不需要的索引。我已经在场外存档了大约 75% 的记录并从我的表中删除了这些记录,并希望回收表中的空间。我想知道我是否需要大约 200 GB 的可用空间来回收空间,或者接近 700 GB。

innodb_file_per_table 已开启。

MySQL 版本是 5.5。

我正在考虑运行 OPTIMIZE TABLE(例如从表中删除行后恢复磁盘空间)或使用 Percona Toolkit 的在线模式更改(例如http://www.percona.com/blog/2013/09/25/how-to -reclaim-space-in-innodb-when-innodb_file_per_table-is-on/)。我更愿意做后者,因为我可以避免写锁,但如果需要相当大的空间差异,我会使用 OPTIMIZE TABLE。

我是否需要接近 200 GB 或接近 700 GB 的可用空间才能从 InnoDB 回收空间?如果接近 700GB,如果我首先将表转换为 MyISAM(例如http://www.percona.com/blog/2014/08/21/the-mysql-ibdata1-disk-space-issue -and-big-tables-part-1/)?

感谢您的帮助!

Rol*_*DBA 2

适合所有 InnoDB 的磁盘空间

SELECT FORMAT(SUM(data_length+index_length)/POWER(1024,3),2) InnoDB_DiskSpace
FROM information_schema.tables
WHERE engine='InnoDB';
Run Code Online (Sandbox Code Playgroud)

数据库 mydb 表的磁盘空间

SELECT
    IFNULL(tbl,'Total') table_name,
    FORMAT(SUM(table_bytes)/POWER(1024,3),2) table_size
FROM
(
    SELECT table_name tbl,SUM(data_length+index_length)table_bytes
    FROM information_schema.tables WHERE table_schema='mydb
    GROUP BY table_name WITH ROLLUP
) A ORDER BY ISNULL(tbl) DESC,table_bytes;
Run Code Online (Sandbox Code Playgroud)

单个表的磁盘空间 (mydb.mytable)

SELECT FORMAT(SUM(data_length+index_length)/POWER(1024,3),2) Table_Diskspace
FROM information_schema.tables
WHERE table_schema='mydb;
AND table_name='mytable';
Run Code Online (Sandbox Code Playgroud)

这些查询将告诉您任何表、数据库和引擎需要多少空间。

建议#1

如果您想模拟OPTIMIZE TABLE只是为了查看磁盘空间使用情况,请运行以下步骤mydb.mytable

use mydb
CREATE TABLE mytable_new LIKE mytable;
INSERT INTO mytable_new SELECT * FROM mytable;
ANALYZE TABLE mytable_new;
SELECT FORMAT(SUM(data_length+index_length)/POWER(1024,3),2) Table_Diskspace
FROM information_schema.tables
WHERE table_schema='mydb;
AND table_name='mytable_new';
#
# Stop Here. If you are happy with the size, do the last two commands
# If you prefer, drop table mytable_new and do do the online schema change
#
RENAME TABLE mytable TO mytable_old,mytable_newTO mytable;
DROP TABLE mytable_old;
Run Code Online (Sandbox Code Playgroud)

这样做可以让您知道.ibd运行后文件有多大OPTIMIZE TABLE

建议#2

请不要将表转换为 MyISAM。它将构建两个文件(.MYD.MYI)。然后,您尝试再次转换为 InnoDB。它本质上与doing相同#SUGGESTION #1。由于没有适当的恢复过程,MyISAM 也更容易出现损坏。

结语

无论如何,如果您的数据是实时的,您可以继续使用pt-online-schema-change 。我的答案只是为您提供查询来估计表的大小以及OPTIMIZE TABLE.

如果您在下班时间执行此操作,请尝试我的帖子从表中删除行后恢复磁盘空间

试一试 !!!