我想使用一个日志表跟踪特定数据库上发生的所有数据库更改。
我已经检查了很多解决方案,但它们都为DB中的每个表提供了一个审计表。我们如何借助触发器在一张表中跟踪它们?
表列可能有:
id - primary key
db_name -- DB Name
version, -- Ignore it(i have a column in my table)
event_type, -- DDL/DML command name
object_name, -- Table/Procedure/Trigger/Function name which is changed
object_type, -- TYpe like table,procedure,trigger
sql_command, -- query executed by user
username, -- who executed it
updated_on -- timestamp
提前致谢。
答案 0 :(得分:1)
在执行ddl命令时调用的触发器(因此您可以记录它们)在mysql中不存在。但您可能希望使用logfiles,尤其是The General Query Log:
通用查询日志是mysqld正在做什么的一般记录。当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。当您怀疑客户端中存在错误并想要确切知道客户端发送给mysqld的内容时,通用查询日志非常有用。
默认情况下禁用日志,启用它可能会降低性能。它不包括间接更改(例如在过程中执行的ddls)。
如果你可以安装一个插件,一个稍微更易配置(更高性能)的替代方案是使用审计插件,参见MySQL Enterprise Audit或任何免费实现,例如: this one,或者您可以编写your own,但它基本上会记录与常规日志相同的内容。
另一个重要的信息来源可能是information schema和performance schema。从那里你可以基本上收集你需要的所有信息(尤其是log of recently executed queries)并从中生成你的日志表,但是需要一些工作来收集你想要的所有数据 - 并且它不会被动作触发,因此,您必须自己定期检查更改(例如,将INFORMATION_SCHEMA.TABLES
中的数据与保存的副本进行比较,以跟踪添加,删除和重命名的表)。
另一方面,定期mysql_dump
后跟diff
到最新版本可能会容易得多。