【问题标题】:MySQL event .csv outputfile with timestamp in nameMySQL 事件 .csv 输出文件,名称中带有时间戳
【发布时间】:2017-04-24 12:11:53
【问题描述】:

我有一个带有 3 个表(日志数据)的 MySQL 数据库。每个表都有相同的结构。

现在我想编写一个每 6 个月运行一次的事件,并导出 csv 文件中的所有行,这些行超过半年并在第二个删除它们。文件名应包含导出的时间戳。

一开始我尝试用静态名称导出一个表 - 效果很好(这里用更小的时间间隔进行测试):

CREATE EVENT exportLog
ON SCHEDULE
EVERY 1 MINUTE
DO
SELECT *
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/exporttest.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM mytable WHERE timestamp < (NOW() - INTERVAL 5 DAY)

现在我尝试使用包含导出时间戳的动态文件名来处理这个问题。因此,旧文件也永远不会被覆盖。但这不起作用。有人可以帮忙吗?

CREATE EVENT exportLog
ON SCHEDULE
EVERY 1 MINUTE
DO
BEGIN
SET @sql_stmt := concat("SELECT * FROM logtable INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/export_", DATE_FORMAT(now(),'%Y-%m-%d %H%i%s'),".csv'");
PREPARE extrct FROM @sql_stmt;
EXECUTE extrct;
DEALLOCATE PREPARE extrct;
END $$
DELIMITER;

感谢您的帮助!

【问题讨论】:

    标签: mysql mysql-event


    【解决方案1】:
    DELIMITER $$
    drop event if exists exportLog  $$
    CREATE EVENT exportLog
    ON SCHEDULE
    EVERY 1 MINUTE
    DO
    BEGIN
    declare cnt tinyint(1) default 1;
        table_loop: LOOP
            SET @sql_stmt := concat("SELECT *  INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/export_", elt(cnt, 'logtable', 'logtable1', 'logtable2'), DATE_FORMAT(now(),'%Y-%m-%d %H%i%s'),".csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n' FROM ", elt(cnt, 'logtable', 'logtable1', 'logtable2'));
            PREPARE extrct FROM @sql_stmt;
            EXECUTE extrct;
            DEALLOCATE PREPARE extrct;
            SET cnt = cnt + 1;
    
            IF cnt < 4 THEN
              ITERATE table_loop;
            END IF;
            LEAVE table_loop;
        END LOOP table_loop;
    
    END $$
    DELIMITER ;
    

    【讨论】:

    • 感谢您的回答。当我使用您的 Set-Statement 时,我仍然遇到语法错误:缺少分号。
    • 好吧,尝试在最后使用分号,即使我没有分号也可以
    • 很高兴检查...您的show full processlist contins 事件调度程序吗?
    • 感谢您的回复!使用您的代码,我没有在工作台中收到 sql 代码的语法错误。当我比较您的代码时,我发现我在语法中丢失了一个 "。但是出现了下一个问题。我用您的代码设置了事件。在工作台中它运行没有错误。但是在我的目录中没有写入导出文件. 你有什么想法吗?
    • 有效!服务器重新启动后,事件调度程序被禁用。所以我必须通过启动服务器来设置事件调度程序:) 我有另一个问题:我有 3 个表(具有相同的结构)要导出。所以我可以为每张桌子做 3 次你的代码。在数组中声明 3 个表名并为每个表运行它是更好的方法吗?
    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多