1

Y 日経過したデータについて X 日ごとにテーブル A から履歴テーブル B にデータを移動し、Z 日より古いデータを履歴テーブル B から削除しようとしています。

これを達成するためのさまざまな方法を模索しているだけです。したがって、任意の提案をいただければ幸いです。

変数の例 X - 7 日 Y - 60 日 z - 365 日

ありがとうございました

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 部分を高速化できるはずです。挿入されたすべての行が 1 つのパーティションから取得されるため、INSERT 部分も高速になる可能性があります (パーティションを正しく作成した場合)。

スキーマが同じである場合、パーティションをあるテーブルから別のテーブルに比較的瞬時に移動できるようにする何らかのトリックが存在する可能性もあります。

于 2009-04-30T17:26:55.097 に答える