分区和释放磁盘空间

swo*_*ded 5 mysql innodb partitioning disk-space

我正在使用 innodb_file_per_table 运行 MySql innodb。

作为日常脚本,我想为一组表创建一个新分区,并删除昨天的分区。需要运行什么命令来删除旧分区以释放磁盘空间?我希望避免系统因数据库磁盘使用而耗尽磁盘空间。我还想避免关闭 Mysql。

编辑:我读过丢弃表空间应该删除占用大部分空间的 .ibd 文件。

ALTER TABLE tbl_name DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)

但是,在分区表上使用此命令存在一个已知错误。

Rol*_*DBA 2

该错误的状态被标记为“无法修复”,我可以理解在这种情况下的原因。

正确的方法是运行,ALTER TABLE tbl_name DROP PARTITION;因为MySQL 文档ALTER TABLE Partition Operations说:

DROP PARTITION 可用于删除一个或多个 RANGE 或 LIST 分区。该语句不能与HASH或KEY分区一起使用;相反,请使用 COALESCE PARTITION(见下文)。存储在partition_names 列表中指定的已删除分区中的所有数据都将被丢弃。

ALTER TABLE t1 删除分区 p0, p1;

一旦运行ALTER TABLE tbl_name DISCARD TABLESPACE;,数据字典应该不再知道孤立.ibd文件的物理存在。但是,由于该错误不会回收磁盘空间,因此表的数据字典条目可能完好无损。让我们来看看吧。

警告:您应该运行service mysql stop并进行物理备份/var/lib/mysql

首先这样做:SHOW CREATE TABLE tbl_name\G

然后,运行SELECT * FROM tbl_name WHERE (stuff from partition #x) LIMIT 10;

测试表各分区的可用性。

一旦您对表格的可用性感到满意,您可以执行以下任一操作:

删除您想要的任何分区

ALTER TABLE tbl_name DROP PARTITION partition-name;
Run Code Online (Sandbox Code Playgroud)

如果您不信任ALTER TABLE tbl_name DROP PARTITION partition-name;,请手动执行

CREATE TABLE tbl_name2 LIKE tbl_name;
ALTER TABLE tbl_name2 DROP PARTITION partition-name;
INSERT INTO tbl_name2 SELECT * FROM tbl_name WHERE (anything but stuff from partition-name)
ALTER TABLE tbl_name RENAME tbl_name9;
ALTER TABLE tbl_name2 RENAME tbl_name;
DROP TABLE tbl_name9;   
Run Code Online (Sandbox Code Playgroud)

删除分区中的所有数据但保留分区

ALTER TABLE tbl_name TRUNCATE PARTITION partition-name;
Run Code Online (Sandbox Code Playgroud)

如果您不信任ALTER TABLE tbl_name TRUNCATE PARTITION partition-name;,请手动执行

CREATE TABLE tbl_name2 LIKE tbl_name;
INSERT INTO tbl_name2 SELECT * FROM tbl_name WHERE (anything but stuff from partition-name)
ALTER TABLE tbl_name RENAME tbl_name9;
ALTER TABLE tbl_name2 RENAME tbl_name;
DROP TABLE tbl_name9;   
Run Code Online (Sandbox Code Playgroud)

创建一个空白表

CREATE TABLE tbl_name2 LIKE tbl_name;
DROP TABLE tbl_name;
ALTER TABLE tbl_name2 RENAME tbl_name;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

更新 2013-05-20 18:41 美国东部时间

我很高兴您能够删除分区。

我有一些令人痛苦的消息:如果不转储所有数据、删除 ibdata1、重新启动 mysql 并重新加载,就不可能收缩 ibdata1。

以下是我过去关于如何安全地做到这一点的帖子: