Как можно перенести данные старше Y дней в таблицу архива / истории в MySQL? - PullRequest
1 голос
/ 30 апреля 2009

Требуется перемещать данные из таблицы A в таблицу истории B каждые X дней для данных, которые имеют Y дней, а затем удалять данные из таблицы истории B, которые старше Z дней.

Просто исследую различные способы сделать это. Так что любые предложения будут оценены.

Пример для переменных X - 7 дней Y - 60 дней z - 365 дней

Спасибо

Ответы [ 4 ]

3 голосов
/ 30 апреля 2009
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
1 голос
/ 30 апреля 2009

Если вы используете MySQL 5.1, вы можете использовать планировщик событий вместо cron. Я не использовал его, но я использовал нечто подобное в SQL Server.

1 голос
/ 30 апреля 2009

Это кажется прямым.

Вы хотите, чтобы ночное задание 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 голосов
/ 30 апреля 2009

Самым простым способом, конечно, было бы вставить строки из онлайн-таблицы в таблицу истории, а затем выполнить удаление. Завершение этого в SPROC, как предполагает Кассной, было бы идеальным.

Еще один потенциально лучший способ - воспользоваться разбиением . Если ваши таблицы разбиты по дате, вы сможете ускорить хотя бы УДАЛИТЬ части, просто отбросив соответствующий раздел. Часть INSERT также может быть быстрее, поскольку все вставленные строки будут взяты из одного раздела (если вы правильно создаете свои разделы).

Если схемы одинаковые, может даже существовать какая-то хитрость, которая позволит вам просто перемещать разделы из одной таблицы в другую относительно мгновенно.

...