web-dev-qa-db-ja.com

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

しかし、午前4時にcronから実行すると機能しません。ログファイルはローテーションされましたが、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
15
quanta

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)'

Logrotate中にmysqladmin/root/.my.cnfを読み取らないようです。

だから、これを試してください:

postrotate
    env HOME=/root/ /usr/bin/mysqladmin flush-logs > /var/log/mysqladmin.flush-logs 2>&1
endscript

ソース:

12
quanta

同様の問題がありました。

/root/.my.cnfを追加した後、MySQLを再起動しなかったため、postrotate flushコマンドが実行されませんでした。

MySQLを再起動すると、ルートmy.cnfファイルが読み込まれ、期待どおりに動作しました。

1
codewaggle

したがって、私の場合、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

ソリューションは非常に単純なので、1つのノードでdebian-sys-maintユーザーのパスワードを変更し、すべてのノードの「/etc/mysql/debian.cnf」ファイルにパスワードを設定します

SET PASSWORD FOR 'debian-sys-maint'@'localhost' = password('YOUR PASSWORD');

私としては、それが役に立つことを願っています。

0
shgnInc

私の場合、/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にchmoddedします。

0
Izzy

私の場合。設定されている必要があります--defaults-file="/root/.my.cnf"から/root/.my.cnf in /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