MySQL Inndob从非常大的数据库中删除/清除行

dee*_*juk 1 php mysql database lamp innodb

我在从innodb表中删除数据时遇到一些问题,从我正在阅读的内容中,大多数人都说,释放空间的唯一方法是导出所需数据创建一个新故事并导入它...这似乎是一种非常垃圾的方式这样做,特别是对近3tbs的数据.

我遇到的问题是删除3个月以前的数据以尝试释放磁盘空间,一旦数据被删除,磁盘空间似乎没有被释放.有没有办法清除或永久删除行/数据以释放磁盘空间?

是否有更可靠的方法而不删除数据库并重新启动服务以释放磁盘空间.

请某位机构可以告诉我处理删除大型数据库的最佳方法.

非常感谢您的高级时间.

谢谢 :)

oh7*_*lzb 5

一种相对有效的方法是使用数据库分区并通过删除分区来删除旧数据.它当然需要更复杂的维护,但它确实有效.

首先,启用innodb_file_per_table,以便每个表(和分区)转到自己的文件而不是单个巨大的ibdata文件.

然后,创建一个分区表,每个时间范围(一天,一个月,一周,你选择它)有一个分区,这会为你的数据集产生一些合理大小的文件.

create table foo(     
        tid INT(7) UNSIGNED NOT NULL,
        yearmonth INT(6) UNSIGNED NOT NULL,
        data varbinary(255) NOT NULL,
        PRIMARY KEY (tid, yearmonth) 
) engine=InnoDB
PARTITION BY RANGE(yearmonth) (
        PARTITION p201304 VALUES LESS THAN (201304),
        PARTITION p201305 VALUES LESS THAN (201305),
        PARTITION p201306 VALUES LESS THAN (201306)
);
Run Code Online (Sandbox Code Playgroud)

查看数据库数据目录,您将找到每个分区的文件.在此示例中,分区'p201304'将包含具有yearmonth <201304的所有行,'p201305'将具有2013-04的行,'p201306'将包含2013-05的所有行.

实际上,我实际上使用了一个包含UNIX时间戳的整数列作为分区键 - 这样随着时间的推移,更容易调整分区的大小.分区边缘不需要匹配任何日历边界,它们可以每100000秒发生一次,或者产生大量分区(数十个分区)的结果,同时仍然具有足够小的文件和数据.

然后,设置维护过程,为新数据创建新分区:ALTER TABLE foo ADD PARTITION (PARTITION p201307 VALUES LESS THAN (201307))并删除旧分区:ALTER TABLE foo DROP PARTITION p201304.删除大分区几乎与删除文件一样快,它实际上可以释放磁盘空间.此外,它不会通过在其中散布空的空间来分割其他分区.

如果可能的话,请确保您的频繁查询只访问一个或几个分区,方法是在WHERE子句中指定分区键(上例中的一个月)或一个范围 - 这将使它们作为数据库运行得更快不需要查看所有分区以查找数据.