使用Mysql中的触发器跟踪日志表中DB的所有DML / DDL更改

时间:2016-07-18 11:13:17

标签: mysql triggers audit

我想使用一个日志表跟踪特定数据库上发生的所有数据库更改。

我已经检查了很多解决方案,但它们都为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

提前致谢。

1 个答案:

答案 0 :(得分:1)

在执行ddl命令时调用的触发器(因此您可以记录它们)在mysql中不存在。但您可能希望使用logfiles,尤其是The General Query Log

  

通用查询日志是mysqld正在做什么的一般记录。当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。当您怀疑客户端中存在错误并想要确切知道客户端发送给mysqld的内容时,通用查询日志非常有用。

默认情况下禁用日志,启用它可能会降低性能。它不包括间接更改(例如在过程中执行的ddls)。

如果你可以安装一个插件,一个稍微更易配置(更高性能)的替代方案是使用审计插件,参见MySQL Enterprise Audit或任何免费实现,例如: this one,或者您可以编写your own,但它基本上会记录与常规日志相同的内容。

另一个重要的信息来源可能是information schemaperformance schema。从那里你可以基本上收集你需要的所有信息(尤其是log of recently executed queries)并从中生成你的日志表,但是需要一些工作来收集你想要的所有数据 - 并且它不会被动作触发,因此,您必须自己定期检查更改(例如,将INFORMATION_SCHEMA.TABLES中的数据与保存的副本进行比较,以跟踪添加,删除和重命名的表)。 另一方面,定期mysql_dump后跟diff到最新版本可能会容易得多。