MySQL 5.1 / phpMyAdmin - регистрация операторов CREATE / ALTER - PullRequest
8 голосов
/ 06 апреля 2010

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

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

Ответы [ 4 ]

4 голосов
/ 08 апреля 2010

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

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

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

2 голосов
/ 15 апреля 2010

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

Для регистрации запросов вы можете использовать что-то простое, например

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 только определенному пользователю, тогда вы можете регистрировать все для этого пользователя, и вам не придется беспокоиться о подробности (например - прокси распознает следующие серверные команды , из которых он проверяет только Query)

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

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 полностью проигнорировал порт и подключился через сокет, что оставило меня озадаченным на несколько минут)

1 голос
/ 06 апреля 2010

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

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

В вашем сценарии репликация кажется избыточным.

Триггеры не являются допустимым параметром, поскольку они поддерживаются только в SELECT, UPDATE и INSERTуровень, а не ALTER / CREATE.

Edit 1:

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

0 голосов
/ 07 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...