MySQL ไม่บันทึกข้อผิดพลาดไปยังไฟล์ใหม่หลังจากหมุน?


14

แก้ไขปัญหาได้แล้ว แต่ฉันกำลังเขียนเพื่ออ้างอิงในอนาคต

/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:00 น. ไฟล์บันทึกถูกหมุน แต่ 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

คำตอบ:


12

ใน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ระหว่างการเขียนบันทึก

ดังนั้นลองทำสิ่งนี้:

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

ที่มา:


1

ฉันมีปัญหาที่คล้ายกัน

ฉันไม่ได้รีสตาร์ท MySQL หลังจากเพิ่ม/root/.my.cnfดังนั้นคำสั่ง postrotate flush จึงไม่ทำงาน

เมื่อฉันรีสตาร์ท MySQL มันอ่านรูทไฟล์ my.cnf และทำงานตามที่คาดไว้


0

ในกรณีของฉันบล็อกใน/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และ chmodded 0600ไป


0

ดังนั้นในกรณีของฉันมีปัญหาสิทธิ์อนุญาตสำหรับdebian-sys-maintผู้ใช้เนื่องจากgalera-clusterมีความสมบูรณ์เหมือนกันในแต่ละโหนดแม้ว่าแต่ละโหนดจะติดตั้งทีละรายโดยผู้ใช้ debian สำหรับแต่ละคนซึ่งไฟล์ config คือ/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');

ฉันหวังว่ามันจะมีประโยชน์เช่นเดียวกับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.