2017-04-24 5 views
0

私は3つのテーブル(ログデータ)を持つMySQLデータベースを持っています。各テーブルは同じ構造を持っています。名前がタイムスタンプのMySQLイベント.csv出力ファイル

ここでは、6ヵ月ごとに実行され、半年より古いcsvファイル内のすべての行をエクスポートし、2番目に削除するイベントを書きたいと考えています。 filnameには、エクスポートのタイムスタンプを含める必要があります。私は、静的な名前でテーブルをエクスポートしようとした初めに

- (テストのための短い時間intervallsとここに)うまく機能:

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; 

ありがとうございました!

答えて

0
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 ; 
+0

ご回答ありがとうございます。私はあなたのセットステートメントを使用するとき、私はまだ構文エラーがあります:セミコロンがありません。 – Tony

+0

最後にセミコロンを適用してみますが、それがなくても機能しました – Alexey

+0

あなたの 'show full processlist' continsイベントスケジューラはどうですか? – Alexey

関連する問題