Tôi nhận được email thông báo
/etc/cron.daily/logrotate: mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)' error: error running shared postrotate script for '/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log /var/log/mysql/error.log ' run-parts: /etc/cron.daily/logrotate exited with return code
Hiện tượng lỗi là màn hình Bitvise SSH Client thỉnh thoảng bị in đày các thông báo lỗi tương tự như trên và sau đó có thể treo luôn hoặc không.
Nội dung file /etc/logrotate.d/mysql-server như sau
# - I put everything in one block and added sharedscripts, so that mysql gets # flush-logs'd only once. # Else the binary logs would automatically increase by n times every day. # - The error log is obsolete, messages go to syslog now. /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log/var/log/mysql/error.log { daily rotate 7 missingok create 640 mysql adm compress sharedscripts postrotate test -x /usr/bin/mysqladmin || exit 0 if [ -f `my_print_defaults --mysqld | grep -m 1 -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 }
Trong đó đáng chú ý là file /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock basedir = /usr
Trong đó cả hai user mà mysqladmin dùng đều là root và không có mật khẩu (nguyên nhân lỗi)
Thêm vào mật khẩu của root và thử chạy lệnh
mysqladmin --defaults-file=/etc/mysql/debian.cnf --local flush-error-log
Không có thông báo lỗi! Tuy nhiên mật khẩu của root đặt hớ hênh thế này thì không ổn.
Chúng ta thay đổi như sau:
cp /etc/mysql/debian.cnf /etc/mysql/debian.bak sed -i " s/root *$/debian-sys-maint/g" /etc/mysql/debian.cnf sed -i "s/password =.*$/password = newpass/g" /etc/mysql/debian.cnf
Trong đó debian-sys-maint/newpass chúng ta sẽ tạo ra trên mysql (debian-sys-maint là user dùng trong debian.cnf ở các phiên bản trước đó. Nghi root xuất hiện ở đây là lỗi!)
root@pi:~# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 180 Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'newpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; MariaDB [(none)]>
Chạy lại câu lệnh để test
mysqladmin --defaults-file=/etc/mysql/debian.cnf --local flush-error-log
Không có thông báo lỗi. Xong rồi!