Безопасно ли удалять файлы mysql-bin?

93

У меня есть MM Replication в mysql, и я хочу сжать немного свободного места в коробке, удалив ненужные файлы, я наткнулся на эти mysql-binфайлы внутри. /var/db/mysql/Существуют сотни таких файлов, как mysql-bin.000123, mysql-bin.000223и т. Д. Я проверил репликацию mysql, выполнив, show master statusи show slave statusони использование некоторых файлов mysql-bin в определенных позициях, но я предполагаю, что все остальные файлы bin являются остатками, которые больше не будут использоваться. В этом случае безопасно ли удалять все эти файлы mysql-bin, кроме тех, на которые в данный момент указывает репликация?

Если удалить безопасно, могу ли я что-нибудь сделать для автоматического удаления этих файлов, если они не используются?


источник

Ответы:

137

Пожалуйста, не просто удаляйте их в ОС.

Вы должны позволить MySQL сделать это за вас. Вот как это делает mysqld:

Файл mysql-bin.[index]содержит список всех двоичных журналов, которые mysqld сгенерировал и автоматически повернул. Механизмы для очистки бункеров в сочетании с mysql-bin.[index]:

PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';

Они будут очищать все двоичные журналы до указанного вами временного журнала или метки времени.

Например, если вы запустите

PURGE BINARY LOGS TO 'mysql-bin.000223';

это удалит все двоичные журналы раньше mysql-bin.000223.

Если вы бежите

PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;

это удалит все двоичные журналы до полуночи 3 дня назад.

Если вы хотите, чтобы binlog вращался автоматически и оставалось 3 дня, просто установите это:

mysql> SET GLOBAL expire_logs_days = 3;

затем добавьте это к /etc/my.cnf

[mysqld]
expire_logs_days=3

и MySQL удалит их журналы для вас

ПОКАЗАТЬ СТАТУС РАБЫ \ G

Это очень важно. Когда вы запустите SHOW SLAVE STATUS\G, вы увидите два двоичных журнала от мастера:

  • Master_Log_File
  • Relay_Master_Log_File

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

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';

Таким образом, репликация не прерывается.

RolandoMySQLDBA
источник
1
Обратите внимание на опечатку - подчеркивание, а не тире: [mysqld] expire_logs_days=3(и вы должны включить [mysqld]раздел
changokun
@changokun Это не опечатка. my.cnf будет принимать тире. Запуск SET GLOBAL expire_logs_days = 3;из клиента MySQL не примет их. Пример в MySQL Docs: dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
RolandoMySQLDBA
Это работает для меня. Вопрос, в чем разница между ... mysql> SET GLOBAL expire_logs_days = 3;и expire-logs-days=3в /etc/my.cnf.. Они одинаковы? Это избыточно или нет? Или важно запустить SET GLOBAL...потом добавить expire-logs-days=..? Благодарю.
Нино Паоло
Быстро удалите все журналы, очевидно: PURGE BINARY LOGS BEFORE DATE(NOW());почему нет нормальных значений по умолчанию для этого? Я нигде, никогда не изменял размер файла журнала до какого-то гигантского размера. У меня было 10,0 ГБ файлов журнала, после выполнения этой команды мой размер папки mysql.bin сократился до 1,6 ГБ.
Майкл Троу
20

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

Таким образом, если вы делаете полное резервное копирование каждый день, и у вас есть 7-дневные двоичные журналы, вполне вероятно, что вы можете удалить двоичные журналы за последние 4-6 дней. Вы можете контролировать, сколько дней хранятся двоичные журналы с expire_logs_daysнастройкой.

Вы можете удалить двоичные журналы, которые вам не нужны, сначала посмотрев, какой самый старый журнал вы хотите сохранить:

ls -lh /path/to/binary/logs/mysql-bin.0*

а затем в mysql:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';
Дерек Дауни
источник
5

Попробуй это:

RESET MASTER;

как сказано в документе :

RESET MASTER позволяет вам удалить любые двоичные файлы журнала и связанный с ними двоичный индексный файл журнала, возвращая мастер в его состояние до начала двоичного ведения журнала.

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

Моррис
источник