it-swarm.asia

كيف يمكنني إخراج سجلات MySQL إلى سجل النظام؟

أريد استخدام سجل النظام لتسجيل MySQL (5.1.41) على Ubuntu (10.04 LTS). لقد وجدت معلومات تنتج سجل الأخطاء إلى سجل النظام.

[mysqld_safe]
syslog

ولكني أريد استخدام سجل النظام لتسجيل السجلات العامة وسجلات الاستعلام البطيئة. أفيدوني كيفية كتابة ملف التكوين؟

لم أجد كيفية القيام بذلك في الدليل المرجعي.

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

13
inohiro

هذا هو ببساطة أكثر بهذه الطريقة:

القرص المضغوط إلى مجلدات الخلية:

mkfifo mysql-general.log

في my.cnf قلها:

[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log

بعد ذلك ، قم بتهيئة syslog/syslog-ng لقراءة FIFO الأنابيب والقيام به كما هو ..

في حالتي ، أقوم بتوجيهها عبر الشبكة إلى خادم مركزي مع سجلات الأخطاء فقط وسجلات الاستعلام البطيئة.

في المواقف التي تريد فيها أيضًا الاحتفاظ بنسخة محلية ، ما عليك سوى ضبطها على الإخراج إلى الجدول والملف كما هو موضح أعلاه.

12
Joel Hanger

في /etc/my.cnf ، قم بتعيينه.

[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log

تحرير / etc/rsyslog.conf (RHEL/CentOS) وتمكين الوحدة imfile لقراءة / path/to/mysql/dir/mysql-general) .log ثم أرسله إلى خادم سجل نظام بعيد مع مراعاة الفاصل الزمني الذي تم تكوينه في PollingInterval.

يجب أن يبدو هذا القسم كما يلي:

module(load="imfile" PollingInterval="1")

input(type="imfile"
    File="/path/to/mysql/dir/mysql-general.log"
    stateFile="statefile-mysql-general"
    Tag="mysql-general"
    Severity="warning"
    Facility="local1")

غير خط مع WorkDirectory

$WorkDirectory /var/lib/rsyslog # where to place spool files

وقم بتكوينه لإرسال كافة السجلات عن بعد

*.* @@remote-ip:514 ## For TCP Connection

أو

 *.* @remote-ip:514 ## For UDP Connection
4
Sergio

تختلف هذه الآلية تمامًا عن سجل نظام التشغيل.

يمكن ضبط تعيين إخراج السجل على TABLE أو FILE (افتراضي) أو NONE

إذا كنت تستخدم هذا

[mysqld]
log-output=TABLE

سيؤدي هذا إلى تسجيل السجل العام و/أو السجل البطيء للانتقال إلى ملف CSV. يمكنك تحويل ملف CSV إلى MyISAM على النحو التالي:

SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;

يمكنك بعد ذلك أن تجعل هذا الملف ينمو بشكل كبير وسيتعين عليك تنظيف الجدول بين الحين والآخر. إليك كيفية تنظيف جدول general_log والاحتفاظ بالأيام الثلاثة الأخيرة:

SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
INSERT INTO mysql.general_log_new
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;

ماذا عن سجل النظام (فار/سجل/رسائل)؟ يجب عليك كتابة هذا بنفسك. أولاً ، تحتاج إما:

[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log

إذا كنت ترغب في جمع السجل العام في كلا التنسيقين أو

[mysqld]
log
general-log-file=/var/log/mysql-general.log

لمجرد تنسيق الملف.

الآن قم بعمل برنامج نصي لجمع التغييرات على /var/log/general.log. يجب أن يبدو النص كثيرًا كما يلي:

NEWCOUNT=`wc -l < /var/log/mysql-general.log`
if [ -f /tmp/general-log-lines.txt ]
then
    OLDCOUNT=`cat /tmp/general-log-lines.txt`
    if [ ${OLDCOUNT} -lt ${NEWCOUNT} ]
    then
        DIFF=`echo ${NEWCOUNT}-${OLDCOUNT}|bc`
        tail -${DIFF} < /var/log/mysql-general.log >> /var/log/messages
        echo ${NEWCOUNT} > /tmp/general-log-lines.txt
    fi
fi

قم بتشغيل هذا البرنامج النصي كل دقيقة. أوصي باقتطاع السجل العام كل منتصف الليل مثل هذا

echo -n > /var/log/mysql-general.log

جربها !!!

4
RolandoMySQLDBA