2017-02-02 4 views
0

Как лучше всего удалять данные из таблицы в производственной системе с 2-3 миллионами строк, каждая из которых имеет потенциально 100 КБ-1М данных (несколько полей среднего текста содержащий xml)? Вероятно, около 3/4 строк будут удалены, поскольку они являются устаревшими данными, которые больше не нужны.Как удалить большое количество строк/данных из производства MySQL

Я написал сценарий plsql, который разбивает удаление на управляемые куски на транзакцию, но по-прежнему существует проблема с binlog (база данных реплицируется), которая быстро заполняется и автоматически усекается автоматически каждые пару дней. IIRC ,

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

Если все xml-поля для строк, которые должны были быть удалены, должны быть установлены в значение null до их удаления, означает ли это, что размер бинлога будет уменьшен по сравнению с просто удалением строки сразу?

+0

Это должно быть на dba.stackexchange.com. – Veve

ответ

1

Я бы, наверное, поступил так, как вы описываете.

Сценарий работает в cron, чтобы очистить старые записи в кусках, и при необходимости вы можете очистить binlogs по мере необходимости в зависимости от вашего графика репликации. Согласно документам MySQL

Если вы используете репликацию, вы не должны удалять старые файлы двоичного журнала на главном компьютере, пока не убедитесь, что ведомое устройство еще не должно их использовать. Например, если ваши ведомые устройства никогда не работают более трех дней, один раз в день вы можете запускать флеш-журналы mysqladmin на главном компьютере, а затем удалять любые журналы, возраст которых превышает три дня. Вы можете удалить файлы вручную, но предпочтительно использовать PURGE BINARY LOGS, который также безопасно обновляет файл индекса двоичного журнала для вас (и который может принимать аргумент даты). См. Раздел 14.4.1.1, «СИГНАЛ ПРОВЕРКИ БИНАРНОГО БЛОКА».
As per Docs

+0

Закончив это, потребовалось две недели, чтобы удалить данные. Расписание было достаточно свободным, чтобы у бинлога было достаточно времени, чтобы очистить себя. 2 тыс. Записей каждые 15 минут в течение 2 недель составляет более 2,5 млн. - поэтому небольшие партии действительно быстро накапливаются в больших объемах данных. – user467257

+0

Удалено почти 100 гигабайт данных из таблиц mysql innodb, выполняющих эту битву (несколько экземпляров подобных баз данных). Не забудьте запустить «оптимизировать таблицу» впоследствии или не вернуть пространство из файловой системы, но вам нужно установить innodb_file_per_table или вы не сможете вернуть пространство. – user467257

Смежные вопросы