如何查看曾连接MySQL数据库的历史IP地址?
嘿,这个问题我刚好帮不少同学搞定过!要提取和你的MySQL数据库交互过的IP,MySQL本身就有现成的工具和系统表可用,分几种场景给你拆解:
一、查看当前活跃的连接IP
如果只是想知道现在正在连接的客户端IP,用SHOW PROCESSLIST就能直接看:
SHOW PROCESSLIST;
返回结果里的Host字段会显示「IP地址:端口号」的格式(比如192.168.3.10:45678),冒号前面的就是客户端IP。
要是想直接提取去重后的IP,用INFORMATION_SCHEMA.PROCESSLIST表配合字符串函数更高效:
SELECT DISTINCT SUBSTRING_INDEX(Host, ':', 1) AS client_ip FROM INFORMATION_SCHEMA.PROCESSLIST WHERE User != 'system user'; -- 排除MySQL内部的系统连接
二、获取所有历史连接过的IP
如果需要的是**曾经连接过(不管现在是否活跃)**的IP,推荐用performance_schema下的host_cache表——这个表是MySQL用来缓存客户端主机信息的,会记录所有成功/失败的连接尝试:
SELECT DISTINCT IP FROM performance_schema.host_cache;
注意:
如果执行这条命令提示表不存在,大概率是你的MySQL没开启performance_schema。需要修改配置文件(my.cnf或my.ini),添加一行:
performance_schema = ON
保存后重启MySQL服务,之后host_cache就会自动记录所有连接过的IP了。
三、获取带时间戳的详细历史连接记录
要是还需要知道每个IP什么时候连接过,可以开启MySQL的通用查询日志。不过通用日志会记录所有执行的SQL语句,文件体积会增长很快,用完记得关掉哦!
开启通用日志的命令:
SET GLOBAL general_log = ON; SET GLOBAL general_log_file = '/var/log/mysql/general.log'; -- 换成你想存日志的路径
日志文件里会有类似这样的记录:
Connect
test_user@192.168.3.10ontest_db
在Linux下可以用命令快速提取去重的IP:
grep 'Connect' /var/log/mysql/general.log | awk '{print $3}' | cut -d'@' -f2 | cut -d' ' -f1 | sort -u
Windows环境可以用PowerShell或者文本编辑器的搜索功能来提取IP。
内容的提问来源于stack exchange,提问作者Luxry

