MySQL. Как скопировать строки (таблицы) из одной базы данных в другую

2022-01-17 13:09:16—2022-01-17 13:09:16

Перенос в архив больших фрагментов базы данных с историческими данными.

По работе задачка с базой данных.

В ней есть несколько сотен таблиц, в каждой таблицы от 6 до 40 миллионов записей. Есть поле updated (timestamp). Данные таблицы примерно каждый час обновляются, т.е. данные весьма быстро нарастают.

Проблемы:

Хочу "откусить" кусок более старых данных и перенести их в некоторое отдельное хранилище, обращаться в который если и понадобиться, то весьма редко.

Что думаю:

  1. Создать таблицы дубли за предыдущие периоды, тут разные варианты:
    • Создать их в этой же ДБ -- будет увеличение таблиц, которых итак много. Но можно с ними будет работать.
    • Либо в отдельной БД или даже отдельном сервере. Но тогда надо будет подключаться к БД, что не так уж и страшно
    • Склоняюсь сделать в отельной базе вида: points2022_10-11, тогда можно просто сделать экспорт таблиц и создать новые одноименные. То, что одинаковые имена у таблиц -- удобно, можно будет те же скрипты использовать при запросах поиска в древних исторических данных
  2. Выбрать все точки до некоторой даты
  3. Залить их в новые созданные таблицы.
  4. Если все норм, то удалить точки до этой даты в текущих таблицах.

Для экспорта данных, придется писать скрипты экспорта и загрузки данных, которые пробегают по сотне таблиц. По времени это займет некоторое время. Скрипты тупо на php через exec (или даже на bash).

Для дампа что-нибудь такое:
mysqldump -u root -p --where="updated >=2021-12-01" database1 table | gzip > table_2022_10-11.sql.gz;

Для развертывания дампа, примерно такое:
zcat table_2022_10-11.sql.gz | mysql -uroot -p database1

Но можно ведь, наверное, перекидывать без дампов, а напрямую из базы в базу? Да, например вот таким запросом:
insert into `database2`.table select * from database1.table where updated < '2021-12-01';

Так как у меня таких таблиц сотни. Надо просто зациклить эти инсерты, и возможно сделать паузы между запросами. Запустить это во время с минимальной востребованностью, т.е. где-то после 2 часов ночи по МСК, хотя есть приличный ломоть аудитории за пределами России.

Но есть еще более простой вариант: в adminer (и видимо phpmyadmin) есть функция: "копировать таблицы в другую базу данных". Просто, но когда таблиц много и они очень большие, лучше автоматизировать и запускать когда следует.



in progress

Все записи