2016-09-14 2 views
0

Мне нужно новое мнение по делу. Любые мысли оцениваются.Удалите много строк из большого percona mysql db

Вход: у нас есть огромная база данных percona mysql (5.5), которая занимает пару Tb (терабайт). Таблицы на двигателе innodb. Более половины (2/3) этого размера следует удалить как можно быстрее. Также у нас есть конфигурация master-slave.

Как самый быстрый способ достичь этого я рассматриваю следующее решение: Выполнить для каждой таблицы на подчиненном сервере (во избежание простоев производства):

  1. остановки репликации
  2. Выберите строки НЕ будет удален в пустую новую таблицу, которая имеет ту же структуру, что и исходную таблица
  3. Переименовать исходную таблицу «table_old», новая таблица - для правильного имени
  4. Drop исходной таблица «table_old»
  5. Начальная репликация

Проблема в том, что у нас есть много ограничений FK. Также я боюсь нарушить репликацию во время этого процесса.

Вопросы: 1) Каковы потенциальные проблемы с ограничениями FK в этом решении? 2) Как не разбить репликацию? 3) Мнения? Альтернативные решения?

Заранее спасибо.

ответ

0

Если вы можете поместить db в автономном режиме (иначе никто не обращается к db за исключением вас) какое-то время, вы можете пойти с вашим решением, но вам нужно отбросить FK раньше и воссоздать их после. Вы также должны проверить столбцы AUTO_INCREMENT, которые изменят число с копией.

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

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