Expire_logs_days игнорируется в my.cnf
У меня есть пара баз данных MySQL, которые настроены для репликации Master Slave. Раб прекрасно работает.
Мастер, с другой стороны, хранит двоичные журналы, несмотря на мои лучшие (автоматизированные) усилия.
Я пытаюсь настроить переменную 'expire_logs_days' в файле my.cnf MySQL, но по какой-то причине она, кажется, игнорируется. Мой файл my.cnf выглядит примерно так:
[mysqld]
...
log-bin=/var/log/mysql/mysql-bin.log
server-id=1
expire_logs_days=3
log_bin_trust_function_creators=TRUE
sync_binlog=1
[mysqld_safe]
...
Но когда я запускаю SHOW VARIABLES WHERE Variable_Name='expire_logs_days'
в MySQL, он возвращает мне значение 0
Я пробовал:
- Перезапуск MySQL
- Используя эту строку:
expire_logs_days='3'
- Проверено для других файлов my.cnf:
-
mysqld --help --verbose | grep cnf
- Найдено строку:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf order of preference
- Мой
my.cnf
файл находится в /etc/my.cnf
- В других местах нет файлов, называемых my.cnf.
-
SET GLOBAL expire_logs_days=3
Работает в MySQL, но на самом деле не решает мою проблему как таковую
И это обо всем, что я мог подумать. Я запустил ручную команду PURGE, которая работает очень хорошо, но я бы предпочел (хотя, если ее нет, я все равно сделаю это), чтобы не запускать команду PURGE с помощью cron.
У кого-нибудь есть идеи? Я только что нажал.
Спасибо.
Ответы
Ответ 1
Факты из вашего вопроса
- Двоичные журналы не могут вращаться
- Вы сказали, что можете запустить PURGE BINARY LOGS
Вот моя рабочая теория
Поскольку вы можете стереть двоичные журналы с помощью PURGE BINARY LOGS;
, у меня есть два места, чтобы вы могли посмотреть, что вы не упомянули
МЕСТО # 1: mysql-bin.index
Этот файл содержит расположение всех двоичных журналов. Когда установлено значение expire_logs_days, mysqld откроет этот текстовый файл, проверьте штампы datetime в каждом файле, пока он не встретит двоичные журналы с временной меткой меньше NOW() - INTERVAL expire_logs_days DAY)
.
Ожидается, что бинарные журналы в mysql-bin.index будут численно последовательными. Если двоичные журналы не являются численно последовательными, вращение журнала отключено.
МЕСТО # 2: /var/log/mysql
папка
В соответствии с вашим my.cnf
, эта папка содержит все двоичные журналы.
Вот 2 вопроса:
- Существуют ли бинарные журналы в
/var/log/mysql
, которые не являются численно последовательными?
- Существуют ли бинарные журналы в
/var/log/mysql
, которые НЕ IN mysql-bin.index
?
Почему возникли эти ситуации?
Иногда люди удаляют двоичные журналы в ОС. Это может отбросить mysqld, поскольку mysqld использует mysql-bin.index
для внутреннего отслеживания существования двоичных журналов. Простое удаление двоичных журналов с rm -f
логическим нарушением механизма вращения журнала, поскольку mysqld знает его.
РЕКОМЕНДАЦИЯ
Если любой из этих двух или обоих вариантов, вы можете очистить его следующим образом:
mysql -ANe"RESET MASTER"
service mysql stop
cd /var/log/mysql
rm -f mysql-bin.*
cd
service mysql start
После этого у вас должна быть маркировка новой бинарной записи журнала.
Дайте ему попробовать!!!
Ответ 2
Я не уверен, что происходит с вашим my.cnf, но w/re для большей проблемы. Похоже, у вас есть несколько вариантов:
- запустите mysqldump и укажите, что вы хотите, чтобы файлы были сброшены/очищены
- запустите 'purge' (как вы были)
- установите
max_binlog_size
. Согласно документам:
Возможные удаления происходят при запуске и при бинарном журнале.
и
Кроме того, двоичный журнал очищается, когда его размер достигает значения системной переменной max_binlog_size.
Похоже, что # 3 будет делать expire_logs_days
, когда он выполняет очистку/очистку.
Ответ 3
Изменяется ли какой-либо другой параметр в этом файле конфигурации? Нам нужно быть уверенным, что мы нажимаем правильный файл конфигурации. Изменение значения идентификатора сервера, вероятно, является хорошим кандидатом.
Если никакого эффекта, найдите нужный файл, запустив:
ps aux | grep mysqld
И посмотрите на значения --defaults-file или -defaults-extra-file
И если вы все еще в тупике, убедитесь, что в нем нет файла -init-file, устанавливающего значение 0.
Ответ 4
Mysql (сообщество) Версия 8.0.17-1.sles12 - OpenSUSE перекидной 2019.10.02
mysql> SET GLOBAL expire_logs_days = 4;
ERROR 3683 (HY000): The option expire_logs_days and binlog_expire_logs_seconds
cannot be used together. Please use binlog_expire_logs_seconds to set the expire
time (expire_logs_days is deprecated)
..