在封神无敌单机版搭建过程中,MySQL连接失败是高频问题。常见原因包括:① MySQL服务未启动(`systemctl status mysql` 检查);② 配置文件中数据库地址误写为 `localhost`(PHP/Java客户端需改用 `127.0.0.1` 避免Unix socket解析异常);③ 用户权限不足(如root默认绑定`localhost`,需执行 `CREATE USER 'game'@'127.0.0.1' IDENTIFIED BY 'pwd'; GRANT ALL ON shenmo.* TO 'game'@'127.0.0.1'; FLUSH PRIVILEGES;`);④ 防火墙或SELinux拦截(`ufw status` / `sestatus`);⑤ my.cnf 中 `bind-address = 127.0.0.1` 被注释或设为 `0.0.0.0` 导致端口监听异常。建议统一使用 `mysql -h 127.0.0.1 -P 3306 -u game -p` 测试连通性,并检查游戏服务日志中的具体报错(如“Access denied”“Connection refused”“Unknown MySQL server host”),再针对性修复。
1条回答 默认 最新
玛勒隔壁的老王 2026-02-28 04:26关注一、现象层:连接失败的典型报错与日志特征
在封神无敌单机版启动时,游戏服务(如Java后端或PHP网关)常抛出以下三类高频错误:
java.sql.SQLNonTransientConnectionException: Could not create connection to database server.→ 多指向网络层或服务未就绪Access denied for user 'game'@'localhost' (using password: YES)→ 权限绑定主机名不匹配Unknown MySQL server host 'localhost' (-2)或Connection refused (Connection refused)→ DNS解析失败或端口未监听
务必优先采集
/var/log/shenmo/server.log及journalctl -u mysql -n 100 --no-pager的交叉日志,定位首错位置。二、系统层:MySQL服务状态与基础运行检查
执行标准化诊断命令链:
systemctl is-active mysql && systemctl is-enabled mysql
systemctl status mysql --no-pager -l
ss -tlnp | grep :3306
ps aux | grep mysqld若显示
inactive (dead),需排查:
•/var/run/mysqld/mysqld.sock是否被残留进程占用
•/var/lib/mysql/ibdata1权限是否为mysql:mysql
• systemd 启动超时(TimeoutSec=300需在/etc/systemd/system/mysqld.service.d/override.conf中显式设置)三、网络与协议层:localhost vs 127.0.0.1 的本质差异
这是5年以上开发者仍易踩坑的关键点。其底层逻辑如下表所示:
连接方式 协议栈路径 适用场景 封神无敌适配建议 mysql -h localhostUnix domain socket ( /var/run/mysqld/mysqld.sock)本地CLI调试 ❌ 禁用——PHP/Java客户端默认走TCP,触发“Host 'localhost' is not allowed” mysql -h 127.0.0.1TCP loopback (3306端口) 所有应用服务连接 ✅ 强制统一——配置文件中 DB_HOST=127.0.0.1四、权限与认证层:细粒度账户策略设计
MySQL 8.0+ 默认启用
caching_sha2_password插件,而旧版JDBC驱动(如mysql-connector-java 5.1.x)不兼容。解决方案需同步处理:- 创建专用账号并显式指定主机范围:
CREATE USER 'game'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'ShenMo2024!'; - 授权并刷新:
GRANT SELECT,INSERT,UPDATE,DELETE ON shenmo.* TO 'game'@'127.0.0.1'; FLUSH PRIVILEGES; - 验证权限映射:
SELECT user,host,plugin FROM mysql.user WHERE user='game';
五、安全策略层:防火墙与SELinux穿透验证
使用以下命令进行双维度检测:
# Ubuntu/Debian
ufw status verbose | grep 3306
# CentOS/RHEL
sestatus -v
sudo semanage port -l | grep mysql
sudo setsebool -P mysqld_connect_any on若发现SELinux阻止,需执行:
sudo ausearch -m avc -ts recent | grep mysqld获取拒绝详情,并用audit2allow生成策略模块。六、配置层:my.cnf 关键参数校验清单
编辑
/etc/mysql/my.cnf或/etc/my.cnf,确保以下参数显式声明且无注释:[mysqld]段落中:bind-address = 127.0.0.1(禁用0.0.0.0防止暴露公网)skip-networking = OFF(确保TCP监听开启)port = 3306(避免被其他服务抢占)max_connections = 512(封神无敌单机版推荐值)
七、验证闭环:构建可复现的连通性测试矩阵
执行以下四步原子化验证,任一失败即终止部署流程:
mysql -h 127.0.0.1 -P 3306 -u game -p→ 测试TCP连接与认证telnet 127.0.0.1 3306→ 验证端口可达性(绕过MySQL协议)mysql -h 127.0.0.1 -e "SELECT VERSION(), USER();"→ 验证SQL执行能力- 启动游戏服务后,抓包验证:
tcpdump -i lo port 3306 -A -c 10→ 确认应用真实发起的是TCP请求
八、进阶诊断:使用Mermaid流程图定位根因
下图为MySQL连接故障决策树,支持快速分流排查路径:
graph TD A[游戏启动失败] --> B{日志报错关键词} B -->|Access denied| C[检查用户@host匹配] B -->|Connection refused| D[检查mysqld进程 & bind-address] B -->|Unknown host| E[检查DNS解析 /etc/hosts] C --> F[执行CREATE USER...@'127.0.0.1'] D --> G[确认ss -tlnp | grep 3306有输出] E --> H[将localhost替换为127.0.0.1] F --> I[FLUSH PRIVILEGES] G --> J[重启mysqld] H --> K[修改所有配置文件DB_HOST]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报