是否可以通过phpMyAdmin记录在MySQL服务器上发出的CREATE / ALTER语句?我听说它可以用触发器完成,但我似乎无法在任何地方找到合适的代码。我想将这些语句记录到表中,最好使用发布时间的时间戳。有人能为我提供一个样本触发器,使我能够完成这个吗?
我想记录这些语句,以便我可以轻松地将更改与另一台MySQL服务器同步。
答案 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)
我认为您最好的选择是在此处查看存储过程和函数的使用,以便对数据库进行更改。这样你可以看一下手动记录数据。