Проблема решена, но я записываю ее на будущее.
/root/.my.cnf
[mysqladmin]
user = root
password = pa$$w0rd
/etc/logrotate.d/mysql
/var/log/mysql-slow.log /var/log/mysqld.log {
daily
rotate 7
dateext
compress
missingok
#notifempty
sharedscripts
create 644 mysql mysql
postrotate
/usr/bin/mysqladmin flush-logs
endscript
}
logrotate
работает нормально при запуске из командной строки:
# logrotate -v -f /etc/logrotate.d/mysql
но не работает при запуске из cron в 4 часа ночи. Файл журналов был повернут, но MySQL не записывает ошибку во вновь созданный файл:
-rw-r--r-- 1 mysql mysql 0 Aug 7 10:13 /var/log/mysqld.log
-rw-r--r-- 1 mysql mysql 20 Aug 4 04:04 /var/log/mysqld.log-20120804.gz
-rw-r--r-- 1 mysql mysql 20 Aug 5 04:04 /var/log/mysqld.log-20120805.gz
-rw-r--r-- 1 mysql mysql 20 Aug 6 16:28 /var/log/mysqld.log-20120806.gz
в postrotate
, Я перенаправляю stderr и stdout в файл журнала, чтобы посмотреть, что происходит:
postrotate
/usr/bin/mysqladmin flush-logs > /var/log/mysqladmin.flush-logs 2>&1
endscript
Что я получаю:
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
Это звучит как mysqladmin
не читает /root/.my.cnf
во время logrotate.
Итак, попробуйте это:
postrotate
env HOME=/root/ /usr/bin/mysqladmin flush-logs > /var/log/mysqladmin.flush-logs 2>&1
endscript
Источник:
У меня была похожая проблема.
Я не перезапускал MySQL после добавления /root/.my.cnf
, поэтому команда postrotate flush не была запущена.
Как только я перезапустил MySQL, он прочитал корневой файл my.cnf и работал должным образом.
В моем случае блок в /etc/logrotate.d/mysql
выглядело немного иначе:
postrotate
test -x /usr/bin/mysqladmin || exit 0
if [ -f `my_print_defaults --mysqld | grep -oP "pid-file=\K[^$]+"` ]; then
# If this fails, check debian.conf!
mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs
fi
endscript
Обратите внимание на комментарий: «Если это не удается, проверьте debian.conf!» и команда с параметром --defaults-file=/etc/mysql/debian.cnf
. В этом файле был такой же [client]
раздел, определяющий пользователя root
с пустым паролем. Очевидно, тот же самый пароль, который использовался в /root/.my.cnf
также должны были быть помещены в этот файл. С точки зрения безопасности, /etc/mysql/debian.cnf
похоже на /root/.my.cnf
: принадлежит root:root
, и изменен на 0600
.
Итак, в моем случае есть проблема с разрешением на debian-sys-maint
пользователь из-за galera-cluster
имеет одинаковую целостность на каждом узле, хотя каждый узел устанавливается индивидуально пользователем debian для каждого из них, что является файлом конфигурации /etc/mysql/debian.cnf
Так что в logrotate
файл:
postrotate
test -x /usr/bin/mysqladmin || exit 0
if [ -f `my_print_defaults --mysqld | grep -oP "pid-file=\K[^$]+"` ]; then
# If this fails, check debian.conf!
mysqladmin --defaults-file=/etc/mysql/debian.cnf --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
Решение настолько простое, просто измените пароль debian-sys-maint
пользователя на одном узле и установите пароль в файле /etc/mysql/debian.cnf на всех узлах
SET PASSWORD FOR 'debian-sys-maint'@'localhost' = password('YOUR PASSWORD');
Надеюсь, он будет полезен, как мой.
В моем случае. Мне нужно было установить --defaults-file="/root/.my.cnf"
к /root/.my.cnf
в /usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" ping
и /usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" flush-logs
/etc/logrotate.d/mysql
/var/log/mysql/mysql_general_log.log
/var/log/mysql/error.log {
create 600 mysql mysql
notifempty
daily
rotate 5
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" flush-logs
fi
endscript
}
Мой /root/.my.cnf
иметь
-rw------- 1 root root 43 Mar 21 20:51 .my.cnf
[mysqladmin]
password= 111
user= root