如何檢視MySQL資料庫一段時間內的連線情況?兩種方式來解鎖~

萬里資料庫發表於2022-02-11


後臺有DBA小夥伴問到一個問題: 如何檢視 MySQL 資料庫一段時間內的連線情況呢?


據小編了解,檢視方式已知至少有 兩種方式可以實現,讓我們一起往下解鎖吧~


方式一:開啟 general_log 就可以觀察到


  • 開啟命令

mysql> set global general_log=ON;


  • 執行一些操作


[root@mgr2 ~]# mysql -uGreatSQL -pGreatSQL -h192.168.6.217 -P3306
mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| book           |
| student        |
| t1             |
+----------------+
3 rows in set (0.01 sec)
mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 哈哈   |
|    2 | 你好   |
|    3 | 呵呵   |
+------+--------+
5 rows in set (0.00 sec)
mysql> delete from test.t1 where id=4;
Query OK, 1 row affected (0.02 sec)


  • 檢視general_log日誌資訊,已經完整記錄到了。


2022-01-20T21:46:17.073491-05:00           32 Connect   GreatSQL@192.168.6.216 on  using TCP/IP
2022-01-20T21:46:17.074048-05:00           32 Query     select @@version_comment limit 1
2022-01-20T21:46:20.217080-05:00           32 Query     SELECT DATABASE()
2022-01-20T21:46:20.217657-05:00           32 Init DB   test
2022-01-20T21:46:20.218960-05:00           32 Query     show databases
2022-01-20T21:46:20.220347-05:00           32 Query     show tables
2022-01-20T21:46:20.222050-05:00           32 Field List        book
2022-01-20T21:46:20.222644-05:00           32 Field List        student
2022-01-20T21:46:20.223106-05:00           32 Field List        t1
2022-01-20T21:46:22.856100-05:00           32 Query     show tables
2022-01-20T21:46:31.156616-05:00           32 Query     select * from t1
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

  • github地址:


2.安裝依賴包

yum install gcc gcc-c++ cmake libpcap-devel glib2-devel libnet-devel -y

3.安裝命令

git clone 
cd mysql-sniffer
mkdir proj
cd proj
cmake ../
make


編譯過程中出現一些問題,參考 https://www.cnblogs.com/kerrycode/p/14948381.html 解決,感謝!


4.檢視幫助


  • 安裝後工具在 bin 目錄下。


[root@mgr3 bin]# ./mysql-sniffer -help
Usage ./mysql-sniffer [-d] -i eth0 -p 3306,3307,3308 -l /var/log/mysql-sniffer/ -e stderr
         [-d] -i eth0 -r 3000-4000
         -d daemon mode.
         -s how often to split the log file(minute, eg. 1440). if less than 0, split log everyday
         -i interface. Default to eth0
         -p port, default to 3306. Multiple ports should be splited by ','. eg. 3306,3307
            this option has no effect when -f is set.
         -r port range, Don't use -r and -p at the same time
         -l query log DIRECTORY. Make sure that the directory is accessible. Default to stdout.
         -e error log FILENAME or 'stderr'. if set to /dev/null, runtime error will not be recorded
         -f filename. use pcap file instead capturing the network interface
         -w white list. dont capture the port. Multiple ports should be splited by ','.
         -t truncation length. truncate long query if it's longer than specified length. Less than 0 means no truncation
         -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


5.測試


a.實時抓取某埠資訊並列印到螢幕


輸出格式為:時間,訪問使用者,來源 IP,訪問 Database,命令耗時,返回資料行數,執行語句。


  • 控制檯監聽



  • 執行一些操作


mysql> use test;
Database changed
mysql> create table t1 (id int(11) not null auto_increment, name varchar(64), primary key(id));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1 values (1,'小明'),(2,'小陳');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> delete from t1 where id=1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  2 | 小陳   |
+----+--------+
1 row in set (0.00 sec)


  • 控制檯輸出


2022-01-21 14:37:09      GreatSQL        192.168.6.216   NULL             0ms             1      select @@version_comment limit 1
2022-01-21 14:37:31      GreatSQL        192.168.6.216   NULL             0ms             2      show databases
2022-01-21 14:37:37      GreatSQL        192.168.6.216   NULL             0ms             1      SELECT DATABASE()
2022-01-21 14:37:37      GreatSQL        192.168.6.216   test             0ms             0      use test
2022-01-21 14:37:37      GreatSQL        192.168.6.216   test             0ms             2      show databases
2022-01-21 14:37:37      GreatSQL        192.168.6.216   test            11ms             0      show tables
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))
2022-01-21 14:42:40      GreatSQL        192.168.6.216   test             0ms             2      insert into t1 values (1,'小明'),(2,'小陳')
2022-01-21 14:42:54      GreatSQL        192.168.6.216   test             0ms             1      delete from t1 where id=1
2022-01-21 14:43:04      GreatSQL        192.168.6.216   test             0ms             1      select * from t1


  • 目前看有正常抓取到資訊


b、可以把抓包的資料儲存到檔案


  • 檔名稱就是埠號,如果檔案沒內容,可以改成MySQL使用者許可權組試一下


./mysql-sniffer -i eth1 -p 33061 -l ./


[root@mgr3 bin]# more 33061.log
2022-01-21 15:00:11      NULL    192.168.6.216   test             0ms             0      use test
2022-01-21 15:00:11      NULL    192.168.6.216   test             0ms             1      SELECT DATABASE()


  • 其他功能就不一一測試了

 

  • 特別注意,以上是在 MySQL5.6 版本測試獲取的,在 8.0 版本中可能由於MySQL協議變更導致抓不到資料包,同時該工具存在一定的丟包情況。


Enjoy GreatSQL :)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997641/viewspace-2855281/,如需轉載,請註明出處,否則將追究法律責任。

相關文章