如何在MySQL中定期存档数据

时间:2016-05-02 05:57:37

标签: mysql sql

我得到了这个场景:

我在表格中有2个特定列,称为cs_start_time(Type:Datetime)cs_time_length(Type:int (seconds))

现在我想在cs_start_time + cs_time_length < NOW() (Current Datetime)时自动删除这些行并将它们插入到另一个表中(当然应该在删除这些行之前)。

或者,当有人对这些行执行选择查询时(触发相似)

,我会处理它

这甚至可以用mysql吗? (我是mysql的新手)

2 个答案:

答案 0 :(得分:4)

您可以将MySQL event scheduler用于此目的:

我已经模拟了您的场景,创建了数据最初保留的主表。之后,过期的数据将存档在名为archiveTableevent scheduler的表格中。

  • 主表结构和数据:
-- ----------------------------
-- Table structure for `maintable`
-- ----------------------------
DROP TABLE IF EXISTS `maintable`;
CREATE TABLE `maintable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cs_start_time` datetime NOT NULL,
  `cs_time_length` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

-- ----------------------------
-- Records of maintable
-- ----------------------------
INSERT INTO `maintable` VALUES ('1', '2016-05-01 12:00:00', '10');
INSERT INTO `maintable` VALUES ('2', '2016-05-02 12:00:00', '5');
INSERT INTO `maintable` VALUES ('3', '2016-05-03 12:00:00', '15');
  • 归档表格结构和数据:
DROP TABLE IF EXISTS `archivetable`;
CREATE TABLE `archivetable` (
  `id` int(11) NOT NULL,
  `cs_start_time` datetime NOT NULL,
  `cs_time_length` int(11) NOT NULL
);
  • 首先设置事件调度程序

SET GLOBAL event_scheduler = ON;

  • 创建活动:
    DROP EVENT IF EXISTS `archiveEvent`;
    delimiter $$
    CREATE EVENT `archiveEvent` ON SCHEDULE EVERY 1 MINUTE STARTS '2016-05-02 00:00:00' ON COMPLETION PRESERVE ENABLE DO

    BEGIN
        INSERT INTO archivetable (
            id,
            cs_start_time,
            cs_time_length
        ) SELECT
            MT.id,
            MT.cs_start_time,
            MT.cs_time_length
        FROM
            maintable MT
        WHERE
            MT.cs_start_time + INTERVAL MT.cs_time_length SECOND < NOW() ; 

        DELETE
        FROM
            maintable
        WHERE
            cs_start_time + INTERVAL cs_time_length SECOND < NOW() ;
        END$$

    delimiter ;

注意:查看事件开始时间设置为2016-05-02 00:00:00。之后,将每隔一分钟安排一次活动。您可以根据需要在任何间隔单位中更改计划时间。

<强>建议:

引述我的评论:

  

您可以使用mysql事件调度程序来实现此目的。但我愿意   建议您可以在选择查询中过滤掉这些条目。什么是   删除这些条目的大部分,而你可以轻松绕过   这些在你的选择查询?你必须检查每一秒   调度程序是否符合要删除的条件;

答案 1 :(得分:0)

您所描述的内容看起来像是一个在时钟上运行的重复过程 - 每当&#34; now()&#34;值达到某一点,你想要执行一些动作。

实现此目的的一种方法是编写CRON作业。 Cron是Unix / Linux中的内置系统,允许您按给定的计划运行命令。例如,您可以每小时运行一个执行SQL查询的脚本(选择应移动的所有记录,移动它们并删除它们);然后将执行结果输出到日志文件以监视您的进程。