首页 > 数据库 >MySQL记录用户操作日志

MySQL记录用户操作日志

时间:2022-12-05 11:02:04浏览次数:42  
标签:dba MySQL 用户 init connect mysql test 日志 id


MySQL记录用户操作日志

有时,我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了)。

二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此需要结合init-connect来实现追踪。

init-connect,在每次连接的初始化阶段,记录下这个连接的用户,和connection_id信息。

1.创建监控连接信息的数据库及表

创建数据库:

create database dba;

 创建表:

create table accesslog(`thread_id` int primary key auto_increment, `time` timestamp, `localname` varchar(40), `machine_name` varchar(40));  

    thread_id : 记录mysql 线程ID

    time:记录操作时间

    localname:记录操作远程IP

    machine_name:记录用户

2. 设置变量init_connect

查看init_connect

    mysql> show variables like 'init%';  
    +---------------+-------+
    | Variable_name | Value |                                                                                                               |
    +---------------+-------+
    | init_connect  |       |
    | init_file     |       |
    | init_slave    |       |
    +---------------+-------+
    3 rows in set (0.00 sec)

配置变量

set global init_connect='insert into dba.accesslog(thread_id,time,localname,machine_name) values(connection_id(),now(),user(),current_user());';

再次查看init_connect

    +---------------+-----------------------------------------------------------------------------------------------------------------------+
    | Variable_name | Value                                                                                                                 |
    +---------------+-----------------------------------------------------------------------------------------------------------------------+
    | init_connect  | insert into dba.accesslog(thread_id,time,localname,machine_name) values(connection_id(),now(),user(),current_user()); |
    | init_file     |                                                                                                                       |
    | init_slave    |                                                                                                                       |
    +---------------+-----------------------------------------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)

3.为用户赋记录日志权限

mysql> grant select,insert,update on dba.accesslog to dba@'%';

4.创建原始数据

    mysql> create database log_test;
    mysql> create table test_table(uid INT,text VARCHAR(10));

5.赋予dba账户操作log_test库的操作权限

mysql> grant select,update,insert,delete on log_test.* to dba@'%' identified by 'dbapasswd' ;

如果想立即看到结果使用

flush  privileges ;

6.用dba账户登陆MySQL客户端进行操作

[root@centos6 ~]# mysql -u dba -p -h 192.168.10.145

    mysql> use log_test;
    mysql> show tables ;
    +--------------------+
    | Tables_in_log_test |
    +--------------------+
    | test_table         |
    | tutorials_tbl      |
    +--------------------+
    2 rows in set (0.00 sec)
    mysql> insert into test_table (uid,text) VALUES (1,11);
     
    mysql> insert into test_table (uid,text) VALUES (2,11111);

7.查看操作日志

查看日志记录所在的二进制文件

    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |     3309 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)

 查看所操作的语句的线程号为10

    [root@centos6 mysql]# mysqlbinlog mysql-bin.000001
    ......
    # at 3078
    #181029 23:12:29 server id 1  end_log_pos 3192  Query   thread_id=10    exec_time=0     error_code=0
    use `log_test`/*!*/;
    SET TIMESTAMP=1540825949/*!*/;
    insert into test_table (uid,text) VALUES (1,11)
    /*!*/;
    # at 3192
    #181029 23:12:40 server id 1  end_log_pos 3309  Query   thread_id=10    exec_time=0     error_code=0
    SET TIMESTAMP=1540825960/*!*/;
    insert into test_table (uid,text) VALUES (2,11111)
    /*!*/;
    ......

查看当时时间点(181029 23:12:29)线程号为10 所登录的账户和ip地址

    mysql> select * from dba.accesslog where thread_id=10;
    +-----------+---------------------+--------------------+--------------+
    | thread_id | time                | localname          | machine_name |
    +-----------+---------------------+--------------------+--------------+
    |        10 | 2018-10-29 23:08:36 | [email protected] | dba@%        |
    +-----------+---------------------+--------------------+--------------+
    1 row in set (0.00 sec)

此时即可锁定此用户ip为192.168.10.130。

注意: 对于所有的普通级别的用户,必须全部都要对日志表具有读写权限, 否则将导致,没有权限的用户无法使用数据库。
init_connect 不会记录有超级管理员权限的用户连接信息 (原因:当init_connect设置有误时,超级管理员可进行修改)
因此,对于一般的用户,不能赋予all privileges权限。
--如果想查看所有的增删改查记录,在general log(需要先开启)里查询即可。里面记录了连接的用户和IP信息。


标签:dba,MySQL,用户,init,connect,mysql,test,日志,id
From: https://www.cnblogs.com/Lqdream/p/16951738.html

相关文章

  • Navicat中MySQL命令列界面操作及基础常用命令
    https://blog.csdn.net/weixin_71712767/article/details/126863842如何使用navicat进入MySQL命令行界面?如何通过命令对数据库/表进行操作? 如何在Navicat中MySQL链接打......
  • 连接mysql报错 errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of ma
    https://copyfuture.com/blogs-details/202206101947537199错误原因:mysql设定了单个客户端最大连接失败次数,超过后便无法再连接成功.可命令行查看:最大失败数为100.......
  • 巧用SQL的全局临时表防止用户重复登录
    在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入。可能会有人说在用户......
  • (转)mysqldump意外原因
    mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份失败的情况。以下是我们经常遇到......
  • 在sqlserver2008中收缩日志文件
    —先备份数据库(含日志文件)usemyhisgobackupdatabasemyhistodisk=’d:\myhis_rzbak’go—设为简单恢复模式use[master]goalterdatabasemyhissetr......
  • mysql 5.6中关于innodb_stats_on_metadata
    在mysql5.6中,innodb_stats_on_metadata默认是关闭了这个会对INFORMATION_SCHEMA中的一些表进行查询操作,以方便索引统计信息,如果读要求高的建议关闭,见......
  • log4j2日志输出配置和使用-要点攻略
    本文较为详细地讲述log4j2的日志输出使用原理、如何配置,并结合具体的代码,给出程序调用的方法。为了讲清原理,本文从log4j的日志级别开讲,然后讲述主配置文件log4j2.xml的配置......
  • MySQL库表管理
    一、常用的数据类型:类型含义tinyint(n)1个字节,范围(-128~127)smallint(n)2个字节,范围(-32768~32767)mediumint(n)3个字节,范围(-8388608~8388607)int(n)......
  • MySQL最简安装 - 开发人员用
    搭建开发用的单机、单实例mysql数据库,基于mysql5.7.39。一、规划1目录规划mysql配置文件-/etc/my.cnfmysql软件目录-/opt/zbt/mysql5.7.39mysql数据目录-/opt/......
  • mysql报错This function has none of DETERMINISTIC. NO SOL or READS SOL DATA...
    是因为存储过程/存储函数在创建时与开启慢查询日志冲突了解决冲突:临时解决:开启log_bin_trust_function_creatorsshowvariableslike'%log_bin_trust_function_cr......