GreatSQL社区

搜索

如何查看 MySQL 数据库一段时间内的连接情况?

548 1 2022-8-19 14:16
如何查看 MySQL 数据库一段时间内的连接情况??



全部回复(1)
GreatSQL万答 2022-8-19 14:27:13
本帖最后由 GreatSQL万答 于 2022-8-19 14:28 编辑

查看方式
已知至少有两种方式可以实现
一 开启 general_log 就可以观察到
开启命令
  1. mysql> set global general_log=ON;
复制代码
执行一些操作
  1. [root@mgr2 ~]# mysql -uGreatSQL -pGreatSQL -h192.168.6.217 -P3306
  2. mysql> use test;
  3. mysql> show tables;
  4. +----------------+
  5. | Tables_in_test |
  6. +----------------+
  7. | book           |
  8. | student        |
  9. | t1             |
  10. +----------------+
  11. 3 rows in set (0.01 sec)

  12. mysql> select * from t1;
  13. +------+--------+
  14. | id   | name   |
  15. +------+--------+
  16. |    1 | 哈哈   |
  17. |    2 | 你好   |
  18. |    3 | 呵呵   |
  19. +------+--------+
  20. 5 rows in set (0.00 sec)

  21. mysql> delete from test.t1 where id=4;
  22. Query OK, 1 row affected (0.02 sec)
复制代码
查看general_log日志信息,已经完整记录到了。
  1. 2022-01-20T21:46:17.073491-05:00           32 Connect   GreatSQL@192.168.6.216 on  using TCP/IP
  2. 2022-01-20T21:46:17.074048-05:00           32 Query     select @@version_comment limit 1
  3. 2022-01-20T21:46:20.217080-05:00           32 Query     SELECT DATABASE()
  4. 2022-01-20T21:46:20.217657-05:00           32 Init DB   test
  5. 2022-01-20T21:46:20.218960-05:00           32 Query     show databases
  6. 2022-01-20T21:46:20.220347-05:00           32 Query     show tables
  7. 2022-01-20T21:46:20.222050-05:00           32 Field List        book
  8. 2022-01-20T21:46:20.222644-05:00           32 Field List        student
  9. 2022-01-20T21:46:20.223106-05:00           32 Field List        t1
  10. 2022-01-20T21:46:22.856100-05:00           32 Query     show tables
  11. 2022-01-20T21:46:31.156616-05:00           32 Query     select * from t1
  12. 2022-01-20T21:46:43.136448-05:00           32 Query     delete from test.t1 where id=4
复制代码
二 抓包
这里采用 MySQL Sniffer 进行抓包。
1.MySQL Sniffer 介绍
  • MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQL Server 端的请求,并格式化输出。
  • 输出内容包括访问时间、访问用户、来源 IP、访问 Database、命令耗时、返回数据行数、执行语句等。有批量抓取多个端口,后台运行,日志分割等多种使用方式,操作便捷,输出友好。
  • 开源出品:奇虎360
  • github 地址:https://github.com/Qihoo360/mysq ... master/README_CN.md
2.安装依赖包
  1. yum install gcc gcc-c++ cmake libpcap-devel glib2-devel libnet-devel -y
复制代码
3.安装命令
  1. git clone https://github.com/Qihoo360/mysql-sniffer.git
  2. cd mysql-sniffer
  3. mkdir proj
  4. cd proj
  5. cmake ../
  6. make
复制代码
编译过程中出现一些问题,参考 https://www.cnblogs.com/kerrycode/p/14948381.html 解决,感谢!
三 查看帮助
安装后工具在 bin 目录下。
  1. [root@mgr3 bin]# ./mysql-sniffer -help
  2. Usage ./mysql-sniffer [-d] -i eth0 -p 3306,3307,3308 -l /var/log/mysql-sniffer/ -e stderr
  3.          [-d] -i eth0 -r 3000-4000
  4.          -d daemon mode.
  5.          -s how often to split the log file(minute, eg. 1440). if less than 0, split log everyday
  6.          -i interface. Default to eth0
  7.          -p port, default to 3306. Multiple ports should be splited by ','. eg. 3306,3307
  8.             this option has no effect when -f is set.
  9.          -r port range, Don't use -r and -p at the same time
  10.          -l query log DIRECTORY. Make sure that the directory is accessible. Default to stdout.
  11.          -e error log FILENAME or 'stderr'. if set to /dev/null, runtime error will not be recorded
  12.          -f filename. use pcap file instead capturing the network interface
  13.          -w white list. dont capture the port. Multiple ports should be splited by ','.
  14.          -t truncation length. truncate long query if it's longer than specified length. Less than 0 means no truncation
  15.          -n keeping tcp stream count, if not set, default is 65536. if active tcp count is larger than the specified count, mysql-sniffer will remove the oldest one
复制代码
四 测试
1.实时抓取某端口信息并打印到屏幕
输出格式为:时间,访问用户,来源 IP,访问 Database,命令耗时,返回数据行数,执行语句。
  • 控制台监听
11.png
  • 执行一些操作
  1. mysql> use test;
  2. Database changed
  3. mysql> create table t1 (id int(11) not null auto_increment, name varchar(64), primary key(id));
  4. Query OK, 0 rows affected (0.06 sec)

  5. mysql> insert into t1 values (1,'小明'),(2,'小陈');
  6. Query OK, 2 rows affected (0.00 sec)
  7. Records: 2  Duplicates: 0  Warnings: 0

  8. mysql> delete from t1 where id=1;
  9. Query OK, 1 row affected (0.00 sec)

  10. mysql> select * from t1;
  11. +----+--------+
  12. | id | name   |
  13. +----+--------+
  14. |  2 | 小陈   |
  15. +----+--------+
  16. 1 row in set (0.00 sec)
复制代码
  • 控制台输出
  1. 2022-01-21 14:37:09      GreatSQL        192.168.6.216   NULL             0ms             1      select @@version_comment limit 1
  2. 2022-01-21 14:37:31      GreatSQL        192.168.6.216   NULL             0ms             2      show databases
  3. 2022-01-21 14:37:37      GreatSQL        192.168.6.216   NULL             0ms             1      SELECT DATABASE()
  4. 2022-01-21 14:37:37      GreatSQL        192.168.6.216   test             0ms             0      use test
  5. 2022-01-21 14:37:37      GreatSQL        192.168.6.216   test             0ms             2      show databases
  6. 2022-01-21 14:37:37      GreatSQL        192.168.6.216   test            11ms             0      show tables
  7. 2022-01-21 14:41:58      GreatSQL        192.168.6.216   test            60ms             0      create table t1 (id int(11) not null auto_increment, name varchar(64), primary key(id))
  8. 2022-01-21 14:42:40      GreatSQL        192.168.6.216   test             0ms             2      insert into t1 values (1,'小明'),(2,'小陈')
  9. 2022-01-21 14:42:54      GreatSQL        192.168.6.216   test             0ms             1      delete from t1 where id=1
  10. 2022-01-21 14:43:04      GreatSQL        192.168.6.216   test             0ms             1      select * from t1
复制代码
目前看有正常抓取到信息
2、可以把抓包的数据存储到文件
文件名称就是端口号,如果文件没内容,可以改成MySQL用户权限组试一下
  1. ./mysql-sniffer -i eth1 -p 33061 -l ./
复制代码
  1. [root@mgr3 bin]# more 33061.log
  2. 2022-01-21 15:00:11      NULL    192.168.6.216   test             0ms             0      use test
  3. 2022-01-21 15:00:11      NULL    192.168.6.216   test             0ms             1      SELECT DATABASE()
复制代码
其他功能就不一一测试了
特别注意,以上是在 MySQL5.6 版本测试获取的,在 8.0 版本中可能由于MySQL协议变更导致抓不到数据包,同时该工具存在一定的丢包情况。
免责声明
因个人水平有限,内容难免存在错漏之处,如有问题麻烦下方留言区回复告知,感谢!

Enjoy GreatSQL

GreatSQL万答

22

主题

0

博客

73

贡献

版主

Rank: 7Rank: 7Rank: 7

积分
117

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-4-19 23:43 , Processed in 0.018872 second(s), 13 queries , Redis On.
快速回复 返回顶部 返回列表