MySQL里面提到主机名,不同场景含义差别很大。有时候指代MySQL服务所在服务器网络名称,有时候是连接数据库填写的地址,还有一种出现在用户权限表,用来限制账号允许登录的来源机器。几个概念容易混淆,搜索MySQL主机名,返回答案经常和实际问题不匹配。分开理解不同场景,查询的时候就不容易混淆。
连接数据库时填的那个主机名
代码连接MySQL,配置项一般包含host、port、user、password,这里host就是主机名。填写localhost代表连接本机MySQL,填写IP例如192.168.1.100访问局域网服务器,填写域名db.example.com依靠DNS解析连接。三种写法客户端都识别,底层连接方式不一样。localhost在MySQL属于特殊值,不走TCP网络,依靠Unix socket文件通信。如果MySQL仅监听127.0.0.1,没有启用socket,或是socket路径和客户端默认路径不一致,localhost无法连接,替换成127.0.0.1就可以连通。这个问题经常出现,Docker容器部署MySQL尤其常见。

确认当前连接的服务器,登录MySQL执行SELECT @@hostname;,返回值是MySQL服务所在操作系统主机名。注意这个值和连接配置填写host不是同一个东西。host代表目标地址,@@hostname是服务端系统自身主机名。有时候连接localhost,@@hostname返回iZbp1a2b3c4d5e6f7g8h9Z这类字符串,是云服务器实例内部主机名,不能直接对外访问。
操作系统层面的主机名怎么查
拥有服务器SSH权限,查询本机主机名,直接执行hostname命令。返回结果可能是短名称webserver01,或是完整域名webserver01.example.com,取决于系统配置。查看详细信息执行hostnamectl,输出静态主机名、瞬态主机名、美化名称。静态主机名写入/etc/hostname文件,开机基本不会变动。瞬态主机名可能被DHCP、mDNS临时修改,重启失效。美化名称仅用于展示,支持空格特殊字符,不影响网络通信。
云服务器主机名大多是系统自动生成的长串字符,观感不佳但是不影响业务。修改命令hostnamectl set-hostname 新名字,同时编辑/etc/hosts,修改127.0.0.1行内旧主机名。不更新/etc/hosts,部分程序解析localhost变慢,等待DNS超时。很多人修改主机名之后sudo命令卡顿,就是/etc/hosts没有同步修改。
MySQL用户权限表里的主机名
这是大家查询MySQL主机名最多的场景。MySQL user表,每条账号记录包含User、Host两个字段。Host字段限制账号允许登录的来源机器。'root'@'localhost'只能本机登录;'root'@'%'允许任意机器访问;'appuser'@'192.168.1.%'仅允许192.168.1网段连接。权限表里面这个Host就是MySQL语境的主机名,可以填写具体IP、IP网段、域名、通配符。
查询所有账号和允许登录来源,执行这条SQL: