我正在使用MySQL Workbench 6.3.7,我想确保当表达到一定数量的存储数据(例如2 GB)时,可以自动从中删除存储的最旧的500 MB。对我来说可能有用的另一种选择是,当达到2GB时,将其保存在脚本(或类似文件)中并自动删除表。如何实现这两个选项(或至少其中一个)?
谢谢!
答案 0 :(得分:0)
假设您的表中存在列ID
,且列ID=1
的行早于ID=2
,依此类推。我将按照以下步骤操作:
N
,以计算需要删除多少记录,以便释放500MB的存储空间。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');
您可以将作业添加到调度程序中,并在任意间隔和所需的每个表中执行该作业。