1

希望每 X 天将 Y 天前的数据从表 A 中的数据移动到历史表 B,然后从历史表 B 中删除早于 Z 天的数据。

只是探索不同的方法来实现这一点。因此,任何建议将不胜感激。

变量示例 X - 7days Y - 60days z - 365days

谢谢

4

4 回答 4

3
CREATE PROCEDURE prc_clean_tables (Y INT, Z INT)
BEGIN
        BEGIN TRANSACTION;

        DECLARE _now DATETIME;
        SET _now := NOW();

        INSERT
        INTO    b
        SELECT  *
        FROM    a
        WHERE   timestamp < _now - INTERVAL Y DAY;
        FOR UPDATE;

        DELETE
        FROM    a
        WHERE   timestamp < _now - INTERVAL Y DAY;

        DELETE
        FROM    b
        WHERE   timestamp < _now - INTERVAL Z DAY;

        COMMIT;
END
于 2009-04-30T17:14:49.213 回答
1

这似乎是直截了当的。

你想要一个每晚的 cron 作业来运行一个脚本。

#crontab -e 

50 11 * * * $HOME/scripts/MyWeeklyArchive.sh

脚本文件本身也很简单。我们将只使用 mysqldump 和 Now() 函数;

#! /bin/bash

/usr/bin/mysqldump -uUser -pPassword Current_DB Table --where='date < NOW() - INTERVAL 7 DAY' | /usr/bin/mysql -uUser -pPassword archive_DB

您可以只在 cron 文件中包含该行,但出于可伸缩性等考虑,我建议将其设为脚本文件。

于 2009-04-30T17:29:29.163 回答
1

如果您使用的是 MySQL 5.1,您也许可以使用事件调度程序,而不是 cron。我没有使用过它,但我在 SQL Server 中使用过类似的东西。

于 2009-04-30T19:03:49.747 回答
0

最简单的方法当然是将在线表中的行插入到历史表中,然后进行删除。正如 Quassnoi 建议的那样,将其封装在 SPROC 中将是完美的。

另一种可能更好的方法是利用分区。如果您的表按日期分区,您应该能够通过简单地删除相关分区来加速至少 DELETE 部分。INSERT 部分也可能更快,因为所有插入的行都来自一个分区(如果您正确创建分区)。

如果模式相同,甚至可能有某种技巧可以让您相对瞬时地将分区从一个表移动到另一个表。

于 2009-04-30T17:26:55.097 回答