来自特定用户或 IP 的 mysql 日志记录活动

dar*_*pet 8 mysql logs

我有mysql服务器。

服务器由我的应用程序和外部审计员(使用 mysql 工作台的人)访问。审核员拥有特定的用户和密码以及专用 IP,并且仅授予选择权限。

我需要记录审计员的活动。有没有可能以某种方式做到这一点?如果没有,我可以记录来自网络的包吗?

Rol*_*DBA 9

您可以使用一般日志。实际上,您应该尝试使用通用日志的MySQL表版本。

如果你运行这个:

SHOW CREATE TABLE mysql.general_log\G
Run Code Online (Sandbox Code Playgroud)

您应该会看到如下内容:

mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.14 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

user_host列将记录 MySQL 用户和命令来自的 IP 地址/DNS 名称。

您现在可能会说,“该表是一个 CSV 文件。我必须解析它。” 这是真的,你必须这样做。但是,您知道可以将其转换为 MyISAM 表吗?我实际上已经为我雇主的一个数据库托管客户尝试过这个,我写了一篇解释它的Feb 24, 2011帖子(见下面的帖子)。

以下是基本步骤:

  1. 将 mysql.general_log 表设为 MyISAM

    运行以下命令:

    CREATE TABLE mysql.general_log_original LIKE mysql.general_log;
    ALTER TABLE mysql.general_log ENGINE=MyISAM;
    ALTER TABLE mysql.general_log ADD INDEX (event_time);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启用通用日志

    将以下内容添加到 /etc/my.cnf

    [mysqld]
    log-output=TABLE
    general-log
    
    Run Code Online (Sandbox Code Playgroud)

    如果您还需要通用日志的文本版本,请添加以下内容:

    [mysqld]
    log-output=TABLE,FILE
    general-log
    general-log-file=/var/log/mysql_general.log
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重启mysql

    只需运行 service mysql restart

我有很多关于使用通用日志和慢日志作为 MyISAM 表的帖子:

警告

MySQL 5.5.28 最近引入了审计日志插件以及如何安装它

以下是选项

这些对我来说是新的,所以我目前对审计日志插件没有任何优点或缺点。