达到大小限制时删除记录

时间:2018-10-29 11:39:40

标签: mysql

我正在使用MySQL Workbench 6.3.7,我想确保当表达到一定数量的存储数据(例如2 GB)时,可以自动从中删除存储的最旧的500 MB。对我来说可能有用的另一种选择是,当达到2GB时,将其保存在脚本(或类似文件)中并自动删除表。如何实现这两个选项(或至少其中一个)?

谢谢!

1 个答案:

答案 0 :(得分:0)

假设您的表中存在列ID,且列ID=1的行早于ID=2,依此类推。我将按照以下步骤操作:

  1. 检查表是否超出大小限制。
  2. 如果是这样,请计算平均行大小N,以计算需要删除多少记录,以便释放500MB的存储空间。
  3. 删除最旧的N行(即,按ID升序对表格进行排序)。

以下存储过程应该可以解决问题:

DELIMITER $$
CREATE PROCEDURE `checkSizeAndDeleteRows`(IN tableName VARCHAR(30), IN schemaName VARCHAR(30))
BEGIN
    -- Get the size of the table
    SELECT  @countMB := round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
    FROM information_schema.TABLES 
    WHERE table_schema = schemaName
        AND table_name = tableName;

    IF @countMB > 2000 THEN
        -- Compute the average row size.
        SET @s = CONCAT('SELECT @avgRowSize := @countMB / (SELECT COUNT(*) FROM ', schemaName, '.', tableName, ') INTO @avgRowSize');
        PREPARE averageSizeStmt FROM @S;
        EXECUTE averageSizeStmt; 
        SELECT @avgRowSize;

        -- Compute how many records need to be deleted in order to free up space of 500MB
        SELECT @noOfRecordsToBeDeleted := CEILING(500 / @avgRowSize);

        -- Delete the records
        SET @del = CONCAT('DELETE FROM ', schemaName, '.', tableName, ' ORDER BY ID LIMIT ?');
        PREPARE deleteStmt FROM @del;
        EXECUTE deleteStmt USING @noOfRecordsToBeDeleted;
     END IF;
END $$
DELIMITER ;

您可以通过执行

来调用它
CALL checkSizeAndDelete('your_table', 'your_schema');

您可以将作业添加到调度程序中,并在任意间隔和所需的每个表中执行该作业。

相关问题