
网页连不上数据库我按 7 层只读排查的命令笔记这道题卡在哪RHCSA 和红帽挑战赛里有一类题看起来像送分网站连不上数据库请写只读命令排查。「只读」是真正的门槛。加防火墙规则、开 SELinux 开关、改 MariaDB 配置、改数据库用户、重启 MariaDB都不许。平时一把梭的systemctl restart在这里直接违规。下面按我实际走过的顺序记命令。重点在每层容易写错的结论不在把命令抄全。排查顺序服务 → 监听 → 防火墙 → 本地 Socket → 本地 TCP → 配置 → SELinux服务在不在决定后面还要不要看。Socket 和 TCP 分开测是因为一个是内部通道一个是正门鉴权规则经常不是一套。Socket127.0.0.1:3306应用mysql.sockMariaDBTCP 正门其他机器防火墙unix_socket 或密码服务systemctl is-active httpd mariadb firewalld systemctl is-enabled httpd mariadb firewalld易错RHEL10 上数据库服务名是mariadb不是mysql。is-active只回答「现在在不在跑」开机自启看is-enabled。防火墙服务名是firewalld网页服务是httpd。监听ss-lntp|grep-E:80|:3306ss-xlnp|grepmysql易错-t是 TCP-u是 UDPUnix 套接字是-x。查mysql.sock用-t或-u都会空手而归。ss -xlnp里认准三样路径如/var/lib/mysql/mysql.sock、LISTEN、进程是mariadbd。用grep sock会捞出一堆系统套接字按mysql过滤更干净。防火墙firewall-cmd--statefirewall-cmd --list-all我机器上是services: cockpit dhcpv6-client http ssh ports:空易错这题最爱扣网页服务名是http不是httpd。没放行mysql/3306只说明外面进来的 3306 会被挡。题目若问「本机能不能连」不能把这条直接写成「本机 TCP 不通」。本机 Socket第 7 问grep-Enskip-networking|bind-address|^port|socket/etc/my.cnf /etc/my.cnf.d/*.cnf mariadb --no-defaults--socket/var/lib/mysql/mysql.sock-uroot-eselect 1路径以配置或ss实际输出为准。易错不写--no-defaults。客户端会去读服务端参数报unknown variable character-set-server你以为库挂了其实是客户端配置捣乱。只ls了 sock 文件就写「能连」。文件在不等于能登录。要以select 1有没有结果为准。本机 TCP第 8 问mariadb --no-defaults-h127.0.0.1-P3306-uroot-eselect 1我这边典型结果ERROR 1698 (28000): Access denied for user rootlocalhost易错这句要定性成「鉴权拒绝」不是网络不通。端口在听包能到门口是账号不让进。root 常见unix_socket走 Socket 可以走 TCP 不一定过。Socket 能连TCP 未必能连。对比这两问才是这道题的核心。配置第 9 问辅证mariadb --no-defaults-eshow variables like skip_networking; show variables like bind_address; show variables like port配置文件和运行时对照着看来源看什么grep配置纸面怎么写含注释行show variables现在真正生效什么易错#bind-address0.0.0.0带井号是注释不生效。只看文件会误以为「绑定了 0.0.0.0」。show variables里bind_address为空才说明当前没限制监听地址。^port只抓行首的port会漏掉#port和缩进行。要连注释痕迹一起找就把^去掉。SELinux第 10 问getenforce getsebool httpd_can_network_connect_db易错必须两句话都写。组合写法Enforcing off会拦 Apache 连库Permissive off策略不允许当前不强制拦Enforcing on允许只答 bool 不答模式或者把Permissive说成「会被拦」都会丢分。题目还禁止你去setsebool打开只能指出问题。7–10 怎么落笔题号结论7Socket 能连select 1成功8本机 TCP 不能完成登录ERROR 1698鉴权拒绝9未禁用网络skip_networkingOFF3306 在听10booloffPermissive 当前不拦真正容易扣分的点按踩坑成本从高到低把 ERROR 1698 写成「网络故障」或「防火墙挡了」用防火墙「无 3306」回答「本机 TCP 不通」Socket 和 TCP 共用一套结论能连 Socket 就以为 TCP 也行SELinux 只写 getsebool不写 getenforce把注释掉的#bind-address当成生效配置查 Unix 套接字用-t/-u没用-x连库测试不加--no-defaults被unknown variable误导服务名写错mysql、防火墙的httpd为了「修好」去改规则 / 开 Boolean / 重启直接碰禁止项口诀服务先 activeenabled 监听 t 看 80/3306x 看 sock 防火墙 list-allhttp 有mysql 无 Socketno-defaults --socket select 1 TCPno-defaults -h127.0.0.1 -P3306 select 1 配置skip_networking / bind-address / port / socket SELinuxgetsebool getenforce 两句话 禁止项一个都不碰命令是零件结论是判决。零件要齐判决要准。练 RHCSA 的话按这个顺序在机器上跑一遍把输出和上面的「易错」逐条对一下比再抄十遍命令有用。