MySQL 5.1/phpMyAdmin - ведение журнала СОЗДАНИЯ/изменения инструкций


Возможно ли регистрировать инструкции CREATE/ALTER, выданные на сервере MySQL через phpMyAdmin? Я слышал, что это можно сделать с помощью триггера, но, похоже, я нигде не могу найти подходящий код. Я хотел бы записать эти заявления в таблицу, предпочтительно с отметкой времени, когда они были выпущены. Может ли кто-нибудь предоставить мне образец триггера, который позволил бы мне выполнить это?

Я хотел бы зарегистрировать эти инструкции, чтобы я мог легко синхронизировать изменения с другим Сервер MySQL.

Author: pako, 2010-04-06

4 answers

Существует исправление для phpMyAdmin, которое обеспечивает настраиваемое ведение журнала только с некоторыми простыми модификациями кода.

Мы сделали это на моей работе, а затем я доработал его, чтобы заходить в папки днем, регистрировать IP-адреса и еще пару вещей, и это отлично работает.

Спасибо @Unreason за ссылку, я не мог вспомнить, где я ее нашел.

 4
Author: Jarod Elliott, 2010-04-15 09:54:37

Вот скрипт, который будет делать то, что вы хотите для mysql-прокси (проверьте ссылку на официальные документы, как установить прокси).

Чтобы фактически регистрировать запросы, вы можете использовать что-то столь же простое, как

function string.starts(String,Start)
    return string.sub(String,1,string.len(Start))==Start
end

function read_query( packet )
    if string.byte(packet) == proxy.COM_QUERY then
        local query = string.lower(string.sub(packet, 2))
        if string.starts(query, "alter") or string.starts(query, "create") then
            -- give your logfile a name, absolute path worked for me
            local log_file = '/var/log/mysql-proxy-ddl.log'
            local fh = io.open(log_file, "a+")
            fh:write( string.format("%s %6d -- %s \n",
                os.date('%Y-%m-%d %H:%M:%S'),
                proxy.connection.server["thread_id"],
                query))
            fh:flush()
        end
    end
end

Сценарий был заимствован из здесь , найдите "простое ведение журнала".

Это не заботится о результатах - даже если запрос вернет ошибку, она будет зарегистрирована (есть пример "более настраиваемого ведения журнала", который является лучшим кандидатом для производства ведение журнала).

Кроме того, вы можете использовать другой подход, если он применим для вас - определите разных пользователей в своей базе данных и предоставьте права DDL только определенному пользователю, тогда вы можете регистрировать все для этого пользователя, и вам не нужно беспокоиться о деталях (например, прокси распознает следующие команды сервера , из которых он проверяет только запрос)

Установка прокси-сервера выполняется прямо сейчас, когда вы его тестируете, вы можете запустить его с помощью

mysql-proxy --proxy-lua-script=/path/to/script.lua

Он работает на порту 4040 по умолчанию, поэтому протестируйте его с помощью

mysql -u user -p -h 127.0.0.1 -P 4040

(убедитесь, что вы не обходите прокси-сервер; например, в моем дистрибутиве mysql -u user -p -h localhost -P 4040 полностью проигнорировал порт и подключился через сокет, что на несколько минут озадачило меня)

 2
Author: Unreason, 2010-04-15 16:09:18

Ответ на ваш вопрос попадет в один из перечисленных в журналах сервера MySQL

Если вы просто хотите получить инструкции CREATE/ALTER, я бы выбрал общий журнал запросов. Но вам придется разобрать файл вручную. Имейте в виду проблемы безопасности, которые возникают при таком подходе.

В вашем сценарии репликация кажется излишней.

Триггеры не являются допустимой опцией, так как они поддерживаются только на уровне ВЫБОРА, ОБНОВЛЕНИЯ и ВСТАВКИ, а не ИЗМЕНЯТЬ/СОЗДАВАТЬ.

Редактировать 1:

Журнал запросов был бы лучшим выбором, но, как вы упомянули на загруженных серверах, журналы приведут к значительному снижению эффективности. Единственная дополнительная альтернатива, о которой я знаю, - это Прокси-сервер MySQL.

 1
Author: unode, 2010-04-07 14:27:51

Я думаю, что лучше всего было бы рассмотреть использование хранимых процедур и функций здесь для внесения изменений в вашу базу данных. Таким образом, вы могли бы просмотреть данные ручной регистрации.

 0
Author: ChrisBD, 2010-04-07 09:00:52