在 MySQL 中执行大量删除后,我理解你需要运行 NULL ALTER 来回收磁盘空间,这对于回收索引空间是否也同样适用?
我们的表使用了超过 10G 的索引空间,并且删除/归档了大量数据,不确定是否需要重建表以减少表的大小指数。
有人能提供一些建议吗?
我们正在尝试避免重建表,因为这会花费相当长的时间并锁定表。
谢谢!
答案1
您正在使用 InnoDB。遗憾的是,在默认配置下,InnoDB 永远不会归还磁盘空间,除非您使用innodb_file_per_table
,在这种情况下,可以通过运行 来重新回收磁盘空间optimize table foo
。
如果您不使用innodb_file_per_table
,那么您需要执行以下操作:
- 用于
mysqldump
将数据库转储到文件中。 - 删除你的数据库。
- 停止 mysql。
- 删除您的 innodb 文件(或将其移动到其他地方)。
- 启动 mysql。
- 重新创建数据库并从 mysqldump 文件重新导入。
不用说,在执行此操作之前,您最好确保有非常好的备份。此外,强烈建议innodb_file_per_table
在 mysql 停止时启用它。
答案2
我有这种方法。
将表名称更改为 tmp:
rename table pppoe_auth_users to pppoe_auth_users_tmp;
禁用键:
ALTER TABLE pppoe_auth_users_tmp DISABLE KEYS;
重新创建表:
CREATE TABLE `pppoe_auth_users` ( `host` varchar(128) CHARACTER SET latin1 DEFAULT NULL, `username` varchar(128) CHARACTER SET latin1 DEFAULT NULL, `vlan` int(20) DEFAULT NULL, `ipaddr` varchar(128) CHARACTER SET latin1 DEFAULT NULL, `interface` varchar(256) CHARACTER SET latin1 DEFAULT NULL, `qos_in_enable` int(4) DEFAULT NULL, `qos_out_enable` int(4) DEFAULT NULL, `bw_in` bigint(20) DEFAULT NULL, `bw_out` bigint(20) DEFAULT NULL, `uptime` int(20) DEFAULT '0', `clock` int(20) DEFAULT '0', KEY `t1` (`host`,`clock`,`ipaddr`), KEY `t2` (`host`,`clock`,`username`), KEY `auth_users` (`clock`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;*
禁用键:
ALTER TABLE pppoe_auth_users DISABLE KEYS;
插入所需时间片的数据,本例中为过去 60 天:
insert into pppoe_auth_users (select * from pppoe_auth_users_tmp where clock>=(unix_timestamp()-(86400*60)));
启用键:
ALTER TABLE pppoe_auth_users ENABLE KEYS;
如果需要,删除旧数据:
drop table pppoe_auth_users_tmp;