Архивируйте данные MySQL, используя PHP каждую неделю - PullRequest
1 голос
/ 12 апреля 2011

У меня есть база данных MySQL, которая получает много данных из источника раз в неделю в определенный день недели в определенное время (около 1,2 миллиона строк) и сохраняет их, давайте назовем их «живыми» Таблица.

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

Может кто-нибудь предложить эффективный способ сделать это. Я действительно пытаюсь избежать - вставить в archive_table выберите * из живого -. Я хотел бы иметь возможность запустить этот архиватор с использованием PHP, поэтому я не могу использовать Maatkit. Есть предложения?

РЕДАКТИРОВАТЬ: Кроме того, архивные данные должны быть легко доступны. Поскольку каждая вставка имеет временную метку, если я хочу посмотреть данные за прошлый месяц, я могу просто найти их в архивах

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Подлый путь:

Не копируйте записи. Это занимает слишком много времени.

Вместо этого просто переименуйте живую таблицу и создайте заново:

RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);

Это должно быть довольно быстро и безболезненно.

РЕДАКТИРОВАТЬ: Метод, который я описал, работает лучше всего, если вы хотите, чтобы архивная таблица за период вращения. Если вы хотите сохранить единую архивную таблицу, возможно, придется усложнить работу. Однако, если вы просто хотите выполнить специальные запросы к историческим данным, вы, вероятно, можете просто использовать UNION.

Если вы хотите сохранить данные за несколько периодов, вы можете выполнить переименование несколько раз, подобно ротации журналов. Затем вы можете определить представление, которое объединяет архивные таблицы в одну большую хонкин 'таблицу.

РЕДАКТИРОВАТЬ 2: Если вы хотите сохранить материал с автоинкрементом, вы можете попробовать:

RENAME TABLE live TO archive1; 
CREATE TABLE live (...); 
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);

но, к сожалению, это не сработает. Однако, если вы управляете процессом с помощью PHP, это довольно легко обойти.

1 голос
/ 12 апреля 2011

Написать сценарий для запуска в качестве задания cron:

  1. Создать дамп архивных данных из «живой» таблицы (это, вероятно, более эффективно при использовании mysqldump из сценария оболочки)
  2. Усечение действующей таблицы
  3. Изменение операторов INSERT в файле дампа таким образом, чтобы имя таблицы ссылалось на таблицу архива, а не на живую таблицу
  4. Добавление архивных данных в таблицу архива (снова, можно просто импортировать из файла дампа через скрипт оболочки, например, mysql dbname
0 голосов
/ 12 апреля 2011

Это будет зависеть от того, что вы делаете с данными после того, как вы их заархивировали, но рассматривали ли вы возможность использования репликации MySQL?

Вы можете настроить другой сервер в качестве ведомого устройства репликации, и один раз всеесли данные реплицируются, удалите или обрежьте их до SET BIN-LOG 0, чтобы избежать репликации этого оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...