2009-04-30 25 views
1

Y日前のデータに対してX日ごとにテーブルAから履歴テーブルBにデータを移動し、Z日より古い履歴テーブルBからデータを削除することを検討します。MySQLのアーカイブ/履歴テーブルに「Y」日より古いデータを移動する方法はありますか?

これを達成するためのさまざまな方法を模索しています。だから、どんな提案も高く評価されます。 7日 Y - - 変数 X用

例60日 Z - 365日

ありがとう

答えて

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

この手順を7日ごとに実行する方法はありますか、それを実行するスクリプトをCRONする必要がありますか?再度ありがとう –

+0

いいえ、あなたはcronを使用する必要があります。 – Quassnoi

+0

これはクールな解決策です。 1つのバリエーションを検討してください。 新しい行を履歴に追加すると同時に、それらがメインテーブルに追加されます(おそらくトリガーを介して)。これには、2つの互いに素な集合ではなく、常にbの部分集合であるという効果があります。これは、いくつかの文脈で利点があります。したがって、クリーンアップは2つの削除文に縮小されます。 – yetanotherdave

0

もちろんの最も簡単な方法は、歴史にオンラインテーブルから行を挿入することであろうテーブルを削除してください。 QuassnoiがSPROCにまとめたことは、完璧であることを示唆しています。

さらに良い方法は、partitioningを利用することです。テーブルを日付別にパーティション化している場合は、関連するパーティションを削除するだけで、少なくともDELETEパーツを高速化できるはずです。挿入されたすべての行が1つのパーティションから来るため(パーティションを正しく作成した場合)、INSERTの部分が高速になることもあります。

スキーマが同じ場合は、パーティションを1つのテーブルから別のテーブルに比較的瞬時に移動させることができるようなトリックもあります。

+0

ありがとうございました。 –

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ファイルに含めることができますが、スケーラビリティなどのためにはスクリプトファイルにすることをおすすめします。

+0

ありがとうございました。私はCRONにとってかなり新しいです。 –

+0

@Josh 設定に応じて、 export editor = vi をcrontabコマンドの前に入力するとよいでしょう。デフォルトのcrontabエディタよりはるかに簡単なviを使うことができます – Eddie

1

MySQL 5.1を使用している場合は、おそらくcronの代わりにイベントスケジューラを使用できます。 私はそれを使用していませんが、私はSQL Serverで同様のものを使用しています。

関連する問題