Назад | Перейти на главную страницу

MySQL не записывает ошибку в новый файл после поворота?

Проблема решена, но я записываю ее на будущее.

/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