【问题标题】:MySQL 5.1 / phpMyAdmin - logging CREATE/ALTER statementsMySQL 5.1 / phpMyAdmin - 记录 CREATE/ALTER 语句
【发布时间】:2010-04-06 10:55:55
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试同步所有更改?复制可能是答案?
  • 没有。数据库包含不同的数据,我只想保持表的结构同步。
  • 一个简短的搜索出现了this。不知道它是否被维护(或者它是否是 Jarod 谈到的项目),但它看起来很简单。
  • 您能否确认您有兴趣记录 phpMyAdmin 查询?如果是(这可能是要走的路,因为这样可以避免记录正常查询),请查看 Jarod 和我的答案。
  • 是的,如果该解决方案仅适用于 phpMyAdmin 就可以了。

标签: mysql phpmyadmin


【解决方案1】:

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

我们在我的工作中这样做了,然后我进一步调整它以按天登录文件夹,记录 IP 地址和其他一些事情,效果很好。

感谢@Unreason 提供链接,我不记得在哪里找到它了。

【讨论】:

  • @Unreason - 是的,就是那个。
  • 代码看起来有点复杂,但我会看一下。
  • 如果遇到问题,请展开问题,或者打开一个新问题来修改脚本。
【解决方案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,搜索“simple logging”。

这不关心结果 - 即使查询返回错误也会被记录(有“更自定义的日志记录”示例,这是生产日志记录的更好候选者)。

此外,如果它适用于您,您可能会采用另一种方法 - 在您的数据库中定义不同的用户并仅将 DDL 权限授予某个用户,然后您可以为该用户记录所有内容,而不必担心详细信息(例如 - 代理识别以下 server commands,它只检查其中的 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 上完全忽略了端口并通过套接字连接,这让我困惑了几分钟)

【讨论】:

    【解决方案3】:

    您的问题的答案将落入MySQL Server logs中列出的其中之一

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

    在您的场景中,复制似乎有点过头了。

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

    编辑 1:

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

    【讨论】:

    • SQL 服务器非常繁忙(每秒超过 70 个查询),所以我不想记录每个查询。而且似乎无法过滤哪些查询应保存在一般查询日志中。
    • 您可以将日志文件设置为 fifo,由另一个守护进程侦听,该守护进程在日志条目进入时对其进行过滤。这将减少惩罚,因为您不会没有成本将所有内容写入磁盘。
    【解决方案4】:

    我认为最好的办法是查看此处使用存储过程和函数来更改数据库。这样您就可以查看手动记录的数据。

    【讨论】:

    • 我使用phpMyAdmin来改变数据库的结构,它直接调用了ALTER/CREATE语句。
    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2010-12-04
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-09-17
    相关资源
    最近更新 更多