MySQL 5.1 / phpMyAdmin - 记录CREATE / ALTER语句

时间:2010-04-06 10:55:56

标签: mysql phpmyadmin

是否可以通过phpMyAdmin记录在MySQL服务器上发出的CREATE / ALTER语句?我听说它可以用触发器完成,但我似乎无法在任何地方找到合适的代码。我想将这些语句记录到表中,最好使用发布时间的时间戳。有人能为我提供一个样本触发器,使我能够完成这个吗?

我想记录这些语句,以便我可以轻松地将更改与另一台MySQL服务器同步。

4 个答案:

答案 0 :(得分:4)

phpMyAdmin有patch,只提供一些简单的代码修改,提供可配置的日志记录。

我们在我的工作中做了这个,然后我进一步调整它以按日登录文件夹,记录IP地址和其他一些东西,它很有效。

感谢@Unreason的链接,我无法回想起我发现它的位置。

答案 1 :(得分:2)

这是一个可以为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

脚本是从here采用的,搜索“简单记录”。

这并不关心结果 - 即使查询返回了一个错误,它也会被记录(有更多自定义日志记录的例子,这是生产日志记录的更好选择)。

此外,如果它适用于您,您可以采取另一种方法 - 在数据库中定义不同的用户并仅向某个用户授予DDL权限,然后您可以为该用户记录所有内容,而您不必担心详细信息(例如 - 代理可识别以下server commands,其中仅检查查询)

安装代理是很简单的,当你测试它时,你可以用

运行它
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 :(得分:1)

您的问题的答案将属于MySQL Server logs

中列出的问题之一

如果你只想获得CREATE / ALTER语句,我会选择the general query log。但是您必须手动解析文件。请注意这种方法引发的安全问题。

在您的方案中,复制似乎有点矫枉过正。

触发器不是有效选项,因为它们仅在SELECT,UPDATE和INSERT级别支持,而不是ALTER / CREATE。

修改1:

查询日志将是最佳选择,但正如您在繁忙的服务器上提到的那样,日志会导致相当大的效率损失。我所知道的另一个替代方案是MySQL Proxy

答案 3 :(得分:0)

我认为您最好的选择是在此处查看存储过程和函数的使用,以便对数据库进行更改。这样你可以看一下手动记录数据。