Как вывести журналы MySQL в системный журнал?

13

Я хочу использовать системный журнал для регистрации MySQL (5.1.41) в Ubuntu (10.04 LTS). Я нашел информацию, которая выводит журнал ошибок в системный журнал.

[mysqld_safe]
syslog

Но я хочу использовать системный журнал для регистрации общих журналов и медленных журналов запросов. Посоветуйте, пожалуйста, как написать конфигурационный файл?

Я не мог найти, как это сделать в справочном руководстве.

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

inohiro
источник
Я уверен, что многие задавали этот вопрос. Таким образом, вы получаете +1 за публичное раскрытие этого квеста.
RolandoMySQLDBA
ВНИМАНИЕ : 5.7.5 может изменить написание log_syslog.
Рик Джеймс

Ответы:

12

Это НАМНОГО проще сделать так:

перейдите в папку MySQL:

mkfifo mysql-general.log

в my.cnf скажи это:

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

Затем сконфигурируйте ваш syslog / syslog-ng для чтения канала FIFO и делайте с ним, как будет.

В моем случае я передаю его по сети на централизованный сервер с журналами ошибок и журналами медленных запросов.

В ситуациях, когда вы также хотите сохранить локальную копию, просто установите ее для вывода в таблицу и файл, как описано выше.

Джоэл Хангер
источник
Этот метод звучит интригующе. Нужно просто подготовить свою сеть для потоков трафика, потому что все и его бабушка попадают в общий журнал. Это определенно подойдет для корпоративных установок, которые строго проверяют каждую команду и каждый идентификатор пользователя, который входит в систему. Это +1 !!!
RolandoMySQLDBA
3
У fifo также есть печальная тенденция заморозить любые программы прослушивания, если они тоже не пишутся. Таким образом, если MySQL прекращает запись в этот fifo, то системный журнал также может остановиться.
Стефан Ласевский,
4

Этот механизм полностью отличается от системного журнала ОС.

Настройка вывода журнала может быть либо 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 и сохранить последние 3 дня:

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;

А как насчет системного журнала (var / log / messages)? Вы должны написать это самостоятельно. Во-первых, вам нужно это:

[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

Попробуйте!

RolandoMySQLDBA
источник
4

В /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
Sergio
источник
2
Возможно, вы захотите избежать редактирования самого файла /etc/rsyslog.conf и использовать файл, созданный в /etc/rsyslog.d, для управления вашими настройками. Вставные файлы сохраняют проверки конфигураций дистрибутивов в отношении обновлений и легко упаковываются и синхронизируются с другими хостами. Сравните /etc/php.d, /etc/sysctl.d и /etc/security/limits.d.
user2066657