【问题标题】:How to implement logging of all changes mysql database?如何实现所有更改mysql数据库的日志记录?
【发布时间】:2018-02-14 18:04:42
【问题描述】:

我需要跟踪数据库中的所有更改:更新、插入、删除。我想知道谁和发生了什么变化。

需要log 带列的表:

  1. 日期。
  2. 表名。
  3. 列。
  4. 旧值。
  5. 新值。
  6. IP。

实现这一点的最佳方法是什么?

有现成的解决方案吗?

我尝试在更新/插入/删除时使用触发器。这是一个很好的解决方案?或者我可能不知道正确登录mysql?

我的触发器:

CREATE TRIGGER `user_update_trigger`
AFTER UPDATE ON `users`
FOR EACH ROW
BEGIN

DECLARE done int default false;
DECLARE col_name CHAR(255);

DECLARE counter INTEGER(11);

DECLARE column_cursor cursor for SELECT `column_name`
                    FROM `INFORMATION_SCHEMA`.`COLUMNS` 
                    WHERE `TABLE_SCHEMA`='test' 
                    AND `TABLE_NAME`='users';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

open column_cursor;

myloop: loop

fetch column_cursor into col_name;

if done then
    leave myloop;
end if;

/*SET @old_val = OLD.{{col_name}}; <------ HOW GET VALUE? */
/*SET @new_val = NEW.{{col_name}};<------ HOW GET VALUE? */

if @old_val <> @new_val then
    /*INSERT INTO `log` ....*/
end if;


end loop;

close column_cursor;

END;

【问题讨论】:

  • 您是否正在尝试创建版本历史记录表?如果是这样,如果原始架构发生变化,那会变得非常混乱。我发现通过应用程序层以某种中性格式(例如 JSON)将原始行转储到历史记录表中通常是解决此问题的最佳方法。这样您就不必将迁移应用到历史记录表,并且如果您需要回滚,您可以主观地解释旧记录。
  • 不需要回滚...我只需要了解谁(IP)何时以及在数据库中编辑了什么。在 JSON 中转储数据的想法很好......我需要一个触发器吗?
  • MySQL 5.7 支持原生 JSON 列,因此比以前更好了。
  • 我需要触发 update 。我将以 json 格式将新旧行保存到日志表中。我理解正确吗?
  • 这个应用程序已经有 10 年的历史了。所以我不必选择......谢谢你的帮助。我会尝试 JSON + 触发器。

标签: mysql sql database triggers


【解决方案1】:

启用mysql audit log filtering。 你可以做类似的事情

    {
  "filter": {
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect" },
          { "name": "disconnect" }
        ]
      },
      { "name": "general" },
      {
        "name": "table_access",
        "event": [
          { "name": "insert" },
          { "name": "delete" },
          { "name": "update" }
        ]
      }
    ]
  }
}

    "event": [
  { "name": "select", "log": false },
  { "name": "insert", "log": true },
  { "name": "delete", "log": true },
  { "name": "update", "log": true }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2020-12-07
    相关资源
    最近更新 更多