要查数据库服务器的IP地址,最快、最准的办法是:登录到数据库所在的那台服务器系统里,执行一条系统命令或查询语句,比在应用端猜来猜去靠谱得多。
这个问题的难点往往不在“查不到”,而在于“你坐在哪、数据库又在哪”,我在实际运维中见过不少人,拿着一张连接字符串,分不清里面哪个是IP、哪个是端口,更不知道如果数据库跑在云上或容器里,IP到底该去哪个控制台找,别急,这篇就把所有路径捋一遍。
sql server查询服务器ip:数据库内部就有答案
如果你的数据库是SQL Server,很多时候根本不用去系统层面折腾,直接在查询窗口里跑一句语句就出来了:
SELECT SERVERPROPERTY(‘MachineName’) AS 机器名,
SERVERPROPERTY(‘InstanceName’) AS 实例名;
这条语句返回的是机器名和实例名,拿到机器名后,再用 ping 机器名 就能解析出IP,不过有个更直接的写法,在SQL Server 2012及以上版本,可以查询动态管理视图:
SELECT local_net_address, local_tcp_port
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
local_net_address 这一列,就是当前数据库实例正在监听的IP地址,如果你本机连的就是这个实例,那返回的IP就是数据库服务器的真实IP,而且不会有误判,因为它是从连接层直接读出来的。
别忘了看SQL Server配置管理器
如果你只想确认数据库到底监听在哪个IP上,不用连进去查询,直接在服务器上打开 SQL Server配置管理器,找到“SQL Server网络配置”,点开“实例名的协议”,双击“TCP/IP”,切到“IP地址”选项卡,里面会列出所有绑定的IP,状态是“已启用”的那个,就是正在对外提供服务的地址。
行业共识认为,SQL Server默认监听1433端口,如果实例名是命名实例,端口可能是动态分配的,这时查配置管理器比查连接字符串更准确。
linux系统怎么查数据库服务器ip:用命令一秒钟定位
如果你面对的是Linux服务器,不管上面跑的是MySQL还是PostgreSQL,先别急着进数据库,在Shell里敲下面这条,立刻就能看到所有网卡的IP:
ip addr show
输出结果里找 inet 开头的行,inet 192.168.1.10/24,斜杠前面的就是IP地址,如果你只是想知道服务器对外通信用的那个IP,可以更直接:
hostname -I
这个命令只输出IP,不带其他信息,适合脚本里用,如果你需要的是服务器访问外网时的公网IP,那要看服务器有没有公网网卡,或者有没有做NAT转发,内网部署的数据库,一般看内网IP就够了。
确认数据库进程真的在监听这个IP
系统IP查到了,但数据库不一定绑定在这个IP上,用下面两条命令,把监听端口和IP对上号:
ss -lntp | grep 3306
这条命令会显示MySQL的监听地址,如果显示 0.0.0:3306,说明监听在所有网卡上,系统IP就是数据库IP;如果显示 0.0.1:3306,说明只监听本机回环地址,外网连不上,这时候你查任何IP都没用,得先去改MySQL的 bind-address 配置。
没有登录权限时的DNS查询法
有时候你拿不到服务器系统权限,但手头有主机名或域名,可以用 nslookup 或 dig 解析一下:
nslookup db-server.example.com
返回的 Address 就是DNS记录里指向的IP,这个方法适用于内网DNS环境,但如果数据库服务器IP后来改过而DNS没更新,查出来就是错的,所以它只能当辅助手段,不能当最终答案。
云数据库ip地址在哪看:别去服务器上找了
近几年云数据库用得越来越多,很多人还习惯性地想登录ECS去查IP,方向就错了,云数据库的IP不在操作系统里,因为那台“服务器”是云厂商托管给你的,你根本登录不进去,正确的路径是去云控制台里看。
- 简米云RDS:登录简米云控制台,进入RDS实例列表,点开目标实例的“基本信息”页面,里面直接写着“内网地址”和“外网地址”,如果你需要从本地连接,要先去“数据库连接”里开通外网地址,然后拿到的那个IP才是你的连接目标。
- 酷番云:在酷番云控制台的“云数据库MySQL”里,点进实例详情,“实例信息”里就有内网IP和端口,外网地址需要单独申请,申请后同样会显示一个公网IP。
- 华为云、AWS、Azure:逻辑都一样,凡是控制台里标着“连接地址”或“Endpoint”的,那就是你要的IP或域名。
这里要说清楚,云数据库给的“连接地址”通常有两类:内网地址和外网地址,你人在哪,就选哪类,你如果在公司内网,用了外网地址连接,不仅慢,还可能绕一大圈;你在家远程办公,用了内网地址,那肯定连不上。
云数据库连接地址不等于IP
云厂商返回的“连接地址”经常是个域名,rm-bp1xxxxx.mysql.rds.aliyuncs.com,并不是纯数字IP,你拿这个域名去 ping 或 nslookup,解析出来的IP是云厂商负载均衡或网关的地址,不是你想象中那台“数据库服务器”的IP。云数据库的连接域名,就是你要记下来的地址
,别纠结非要看到一个纯数字IP,域名解析到的IP可能会变化,但域名永远不变。
如果你非要看数字IP,在本地电脑上执行:
nslookup rm-bp1xxxxx.mysql.rds.aliyuncs.com
返回的IP就是当前DNS解析结果,但这个IP可能会随云厂商后端调整而变化,日常配置连接时,直接用域名最稳妥。
区分三种场景,否则你查到的IP可能没用
我见过不少人在排查问题时卡在“IP不对”上,其实不是不对,是搞混了场景,查数据库服务器IP之前,先明确你处于下面哪种情况,才能确保查到的地址能用来连接。
| 场景 | 你应该查的IP | 获取方式 |
|---|---|---|
| 应用和数据库在同一台服务器 | 0.0.1 或 localhost | 不需要额外查 |
| 应用和数据库在同一内网 | 数据库服务器的内网IP | 登录服务器执行 ip addr |
| 应用通过公网连接数据库 | 数据库的公网IP或域名 | 云控制台查看,或防火墙开放对应端口后用工具测 |
如果你只在本地电脑上跑了一个数据库客户端,却想连远程的数据库服务器,那你需要的不是查看你自己电脑的IP,而是远端数据库服务器的IP,这个IP可能需要找公司DBA要,或者从工单系统里的“数据库申请记录”里找,运维同学一般会把“主机名、IP、端口、账号、密码”这五件套录在资产系统里,没有资产系统就只能翻交接文档了。
容器和虚拟化环境的特殊处理
如果数据库跑在Docker容器里,在容器内部执行 hostname -I 拿到的IP是容器IP,通常是172.17.x.x这种网段,宿主机上的应用能用,但跨越宿主机或物理机访问就未必通了,这时应该用下面这条命令,在宿主机上查看端口映射关系:
docker port 容器名
比如输出 3306/tcp -> 0.0.0.0:3306,说明容器的3306端口映射到了宿主机的所有网卡上,你连接宿主机IP加映射的端口即可,如果映射的是 0.0.1:3306,那只有宿主机自己本机能连,局域网内其他机器连不上,需要修改映射参数或用 -p 重新指定。
在常见的 docker run 命令里,-p 127.0.0.1:3306:3306 和 -p 3306:3306 的效果完全不同,前者只允许本机回环地址访问,后者覆盖所有网卡,排查容器数据库连接问题时,第一件事就是看映射地址,不知道这一点,怎么查容器IP都白搭。
Q&A:数据库服务器ip地址查询常见问题
问:用Navicat连接数据库时,界面上填的那个IP是数据库服务器IP吗?
是的,Navicat连接配置里填写的“主机/IP”那一栏,就是你要连接的数据库服务器IP或域名,如果你忘了这个IP是多少,可以在Navicat的“连接属性”里看到历史连接记录,或者在连接成功后的“会话”管理器中看到当前连接的主机信息,Navicat里执行 SELECT @@hostname;(MySQL)能返回服务器主机名,再用 nslookup 解析即可得到IP。
问:数据库服务器的IP和实例名有什么关系吗?
没有直接关系,IP是服务器在网络中的地址,实例名是数据库引擎的安装名称,两者各自独立,SQL Server的默认实例在连接时不需要写实例名,端口是1433;命名实例则需要写“IP实例名”或者使用动态端口,MySQL和PostgreSQL没有实例名概念,只有端口区分,比如同一台服务器上跑多个MySQL实例,就是通过不同端口来区分的,IP可以是同一个。“实例名”和“IP”属于不同维度,理解成“房屋地址”和“门牌号”的区别更形象。
问:为什么我用应用里的数据库IP去ping,ping不通,但应用却能正常读写?
因为数据库服务默认只监听TCP端口,通常禁止ICMP回应,你ping它用的是ICMP协议,数据库服务器防火墙把ICMP丢弃了,所以ping不通,但不影响TCP连接,MySQL的3306端口、SQL Server的1433端口都不依赖ping检测连通性,改用 telnet IP 端口 或 nc -vz IP 端口 来测试,如果端口能连通,说明IP和网络链路都是正常的。
问:如果我有数据库文件备份,能从文件里读出原来服务器的IP吗?
不能直接读,数据库备份文件(如 .bak、.sql、.ibd)里通常不保存服务器IP信息,IP属于运行环境配置,不在数据文件里,你说不定能在备份任务的历史记录或日志文件中找到备份时所在服务器的IP,但数据文件本身没有这个信息,如果数据文件是从某台服务器上直接拷贝的,你要找的其实是那台物理机器的IP,去登录它执行系统命令就行。
查数据库服务器IP这件事,本质上就是一件事:定位监听端口所在的网络接口,不管界面多花哨,答案都在那台真正跑着数据库服务的机器身上要么登录进去看系统配置,要么看数据库本身的监听状态,要么去云控制台找托管实例的连接信息,搞清楚这个普适逻辑,任何时候遇到类似的问题,你都不会被各种看似高深的术语绕晕。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/702825.html





