找出真凶:谁在连接我的数据库?

qunyingliu

2014.10.31

背景:

数据库迁移需要梳理数据库认证信息,业务的数据库配置信息比较松散,已知的已经修改但是总有一些落单的。

怎么找出真凶?

1.登录数据库服务器查看连接数据库的网络链接:

  ssh   10.1.1.85

  netstat -ntp|grep “数据库IP:数据库端口”

查看数据库服务器上已经建立的连接,如下图所示:

tcp   0  0  10.1.1.85:3306    10.2.1.33:3610   ESTABLISHED 13025/mysqld

 针对不能查看机器网络连接的,可通过mysql---->show processlist来确定来源IP与端口号:

mysql> show processlist;
+-----------+------------+----------------------+------+-------------+----------+----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| Id        | User       | Host                 | db   | Command     | Time     | State                                                          | Info                                                                                                 |
+-----------+------------+----------------------+------+-------------+----------+----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 204883537 | hehe    | 10.2.1.33:3610  | NULL | select * from a.table | 13428752 |sleep| NULL

 

2.登录与数据库建立连接的业务服务器,如10.2.1.33

通过网络连接状态查看:

tcp   0    0 10.2.1.33:3610    10.1.1.85:3306     ESTABLISHED 709/Datasend

 一般情况下,通过网络连接状况就可以看到对应的进程ID与进程名,如PID为709,进程名为Datasend(随意起的一个名字)。

但是有的时候也会碰到以下这种情况:

tcp   0    0 10.2.1.33:3610    10.1.1.85:3306     ESTABLISHED      -----

 进程ID与进程名的地方被一个横线或者一组横线替代,那么该怎么办呢?


3.通过lsof -i:端口号,如 lsof -i:3610  可以查看业务机器上该端口号对应的进程ID和进程名。

myhost # lsof -i:3610COMMAND   PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAMEDatasend 709 root    3u  IPv4 1600769833      0t0  TCP 10.2.1.33:3610->mydbhost:mysql (ESTABLISHED)

 PID和COMMAND都找到了,如果还不清楚是哪个进程,通过ll /proc/${PID}/exe 

就可以找到对应的程序了。

这下子,对应的机器IP,端口号,进程,程序地址,都找到了,可以找事主聊聊天喝喝茶了。