from:http://blog.chinaunix.net/uid-24086995-id-168445.htmlhttp://www.mysqlsystems.com/2009/11/mysql-audit-access-log.html
在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化。我们可以在这里获取用户的登录名称和thread的ID值。然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等。实现审计。
实验过程:
1:创建登录日志库,登录日志表
1:创建登录日志库,登录日志表
- CREATE DATABASE `accesslog`;
- USE `accesslog`;
- CREATE TABLE `accesslog`
- (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `thread_id` int(11) DEFAULT NULL, #线程ID,这个值很重要
- `log_time` timestamp NOT NULL DEF AULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, #登录时间
- `localname` varchar(30) DEFAULT NULL, #登录名称带IP
- `matchname` varchar(30) DEFAULT NULL, #登录用户,user的全称
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2:在配置文件中配置init-connect参数。登录时插入日志表。如果这个参数是个错误的SQL语句,登录就会失败。
Linux 下的配置文件为 my.cnf,windows下位my.ini
Linux 下的配置文件为 my.cnf,windows下位my.ini
- init-connect='insert into accesslog.accesslog values(null,connection_id(),now(),user(),current_user());'
- log-bin
重启service mysqld 以使其配置文件生效
3:创建普通用户,不能有super权限。init-connect对具有super权限的用户不起作用。同时此用户必须要有INSERT权限,如果没有,登录后的任何操作都会导致MYSQL登录失败。
3:创建普通用户,不能有super权限。init-connect对具有super权限的用户不起作用。同时此用户必须要有INSERT权限,如果没有,登录后的任何操作都会导致MYSQL登录失败。
- grant insert,select,update on *.* to 'user1'@'localhost'; #带INSERT权限
- grant select,update on *.* to 'user2'@'localhost'; #不带INSERT权限
4:SESSION1登录,并查看日志
- D:\mysql6\bin>mysql -uuser1 -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 65
- Server version: 5.1.45-community-log MySQL Community Server (GPL)
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql> select * FROM accesslog.accesslog;
- +----+-----------+---------------------+-----------------+-----------------+
- | id | thread_id | log_time | localname | matchname |
- +----+-----------+---------------------+-----------------+-----------------+
- | 1 | 65 | 2011-03-11 19:18:25 | user1@localhost | user1@localhost |
- +----+-----------+---------------------+-----------------+-----------------+
- 1 row in set (0.00 sec)
- mysql> show processlist;# 当前运行的threadId
- +----+-------+----------------+------+---------+------+-------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+-------+----------------+------+---------+------+-------+------------------+
- | 65 | user1 | localhost:1339 | NULL | Query | 0 | NULL | show processlist |
- +----+-------+----------------+------+---------+------+-------+------------------+
- 1 row in set (0.00 sec)
- mysql>
5:再用user2登录
- D:\mysql6\bin>mysql -uuser2 -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 76
- Server version: 5.1.45-community-log
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql> select * FROM accesslog.accesslog;
- ERROR 2006 (HY000): MySQL server has gone away
- No connection. Trying to reconnect...
- Connection id: 77
- Current database: *** NONE ***
- ERROR 2013 (HY000): Lost connection to MySQL server during query
- mysql> select * FROM accesslog.accesslog;
- ERROR 2006 (HY000): MySQL server has gone away
- No connection. Trying to reconnect...
- Connection id: 78
- Current database: *** NONE ***
看下错误日志
如果没有对log-bin指定log文件,默认在 /var/lib/mysql目录下以mysqld-bin.00000X等作为名称。而 mysqld-bin.index则记录了所有的log的文件名称
使用时则使用mysqlbinlog /var/lib/mysql|grep "*****"等来追踪database的操作。
如果没有对log-bin指定log文件,默认在 /var/lib/mysql目录下以mysqld-bin.00000X等作为名称。而 mysqld-bin.index则记录了所有的log的文件名称
使用时则使用mysqlbinlog /var/lib/mysql|grep "*****"等来追踪database的操作。
- 110311 19:23:47 [Warning] Aborted connection 77 to db: 'unconnected' user: 'user2' host: 'localhost' (init_connect command failed)
- 110311 19:23:47 [Warning] INSERT command denied to user 'user2'@'localhost' for table 'accesslog'
- 110311 19:23:53 [Warning] Aborted connection 78 to db: 'unconnected' user: 'user2' host: 'localhost' (init_connect command failed)
- 110311 19:23:53 [Warning] INSERT command denied to user 'user2'@'localhost' for table 'accesslog'
6:下面以USER1登录,并做一个INSERT操作,查看日志文件。
- mysql> insert into t3 values(10,10,'2011-10-10 00:00:00');
- Query OK, 1 row affected (0.00 sec)
- mysql> show processlist;
- +----+-------+----------------+-----------+---------+------+-------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+-------+----------------+-----------+---------+------+-------+------------------+
- | 69 | user1 | localhost:1439 | accesslog | Query | 0 | NULL | show processlist |
- +----+-------+----------------+-----------+---------+------+-------+------------------+
- 1 row in set (0.00 sec)
- mysql> select * from accesslog.accesslog;
- +----+-----------+---------------------+-----------------+-----------------+
- | id | thread_id | log_time | localname | matchname |
- +----+-----------+---------------------+-----------------+-----------------+
- | 1 | 65 | 2011-03-11 19:18:25 | user1@localhost | user1@localhost |
- | 2 | 91 | 2011-03-11 19:28:33 | user1@localhost | user1@localhost |
- | 3 | 2 | 2011-03-11 19:31:49 | user1@localhost | user1@localhost |
- | 4 | 2 | 2000-10-10 10:10:10 | user1@localhost | user1@localhost |
- | 5 | 21 | 2000-10-10 11:11:11 | root@localhost | root@% |
- | 6 | 69 | 2011-03-12 21:35:43 | user1@localhost | user1@localhost |
- +----+-----------+---------------------+-----------------+-----------------+
- 6 rows in set (0.01 sec)
查看日志文件的内容
- # at 340
- #110312 21:36:01 server id 1 end_log_pos 453 Query thread_id=69 exec_time=0 error_code=0
- use text;
- SET TIMESTAMP=1299936961;
- insert into t3 values(10,10,'2011-10-10 00:00:00')
- ;
- # at 453
thread_id=69
在日志表里记录的和日志文件里面记录的相同。可以通过这个thread_id来追踪到是谁,什么时间,做了什么操作。
相关推荐
Java开发springboot-整合mysql-binlog-connector-java实现MySQL数据同步-源代码+文档 Java开发springboot-整合mysql-binlog-connector-java实现MySQL数据同步-源代码+文档 Java开发springboot-整合mysql-binlog-...
赠送jar包:mysql-binlog-connector-java-0.21.0.jar; 赠送原API文档:mysql-binlog-connector-java-0.21.0-javadoc.jar; 赠送源代码:mysql-binlog-connector-java-0.21.0-sources.jar; 赠送Maven依赖信息文件:...
MySQL是世界上最流行的关系型数据库管理系统之一,而MySQL的binlog(二进制日志)是其核心特性之一,用于记录所有对数据库进行的更改操作。`mysql-binlog-connector-java` 是一个开源库,它允许Java应用程序实时读取...
此外,它还可以结合[mysqld]的init-connect参数做mysql 8.0的数据库审计。 一. 对dml的挖掘分析(同时支持离线binlog) 二 . 对ddl的挖掘分析(同时支持离线binlog) 三. 对dml进行审计 四. 对ddl的审计
**MySQL Binlog** 是MySQL数据库的一种日志系统,记录了所有的DDL(Data Definition Language)和DML(Data Manipulation Language)操作。通过监听和解析binlog事件,我们可以获取到数据库中的实时变更信息,从而...
赠送jar包:mysql-binlog-connector-java-0.21.0.jar; 赠送原API文档:mysql-binlog-connector-java-0.21.0-javadoc.jar; 赠送源代码:mysql-binlog-connector-java-0.21.0-sources.jar; 赠送Maven依赖信息文件:...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
sqlserver日志分析jar包
开启mysql-binlog操作 binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句。语句以“事件”的形式保存,它描述数据更改。当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回...
+------------------+----------+--------------+------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +------------------+----------+--------------+------------------+ | mysql-bin....
MySQL的二进制日志(Binary Log,简称binlog)是数据库系统中非常重要的一个功能,主要用于数据恢复、数据同步以及审计。它记录了所有改变数据库状态的事务,包括INSERT、UPDATE、DELETE等操作,为数据库提供了事务...
一旦用户对数据库进行任何操作,如删除表,审计记录应该能够通过`accesslog`表和配合`binlog`日志来追踪到具体是哪个用户执行了这个操作。通过查看`binlog`,我们可以找到对应的时间点和执行操作的用户,从而实现...
binlog_checksum支持(适用于MySQL 5.6.2+用户) 不同版本MySQL发行版的测试套件 用法 从获取最新的JAR。 或者,您可以包括以下Maven依赖关系(可通过Maven Central获得): < groupId>...
而MySQL Connector/J则是MySQL与Java应用程序之间的桥梁,它是一个JDBC(Java Database Connectivity)驱动程序,使得Java开发者能够方便地在Java应用中访问和操作MySQL数据库。本主题主要关注的是`mysql-connector-...
本文将详细介绍如何使用Mysql、Haproxy、Mycat、PXC、Zookeeper实现高可用集群,涵盖了整个架构图、应用程序的访问流程、数据的读写分离、负载均衡、数据库节点的搭建、Zookeeper的应用等多个方面。 整体架构图 在...
binlog_checksum = CRC32支持(对于MySQL 5.6.2+用户) 通过TLS进行安全通信 对JMX友好 实时统计 Maven Central的可用性 没有第三方依赖 不同版本MySQL发行版的测试套件 如果您正在寻找其他语言的类似内容,请查看 ...