WWF世界自然基金会 2026-02-28 04:25 采纳率: 98.8%
浏览 0
已采纳

封神无敌单机搭建时MySQL连接失败如何排查?

在封神无敌单机版搭建过程中,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.logjournalctl -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)不兼容。解决方案需同步处理:

    1. 创建专用账号并显式指定主机范围:
      CREATE USER 'game'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'ShenMo2024!';
    2. 授权并刷新:
      GRANT SELECT,INSERT,UPDATE,DELETE ON shenmo.* TO 'game'@'127.0.0.1'; FLUSH PRIVILEGES;
    3. 验证权限映射:
      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(封神无敌单机版推荐值)

    七、验证闭环:构建可复现的连通性测试矩阵

    执行以下四步原子化验证,任一失败即终止部署流程:

    1. mysql -h 127.0.0.1 -P 3306 -u game -p → 测试TCP连接与认证
    2. telnet 127.0.0.1 3306 → 验证端口可达性(绕过MySQL协议)
    3. mysql -h 127.0.0.1 -e "SELECT VERSION(), USER();" → 验证SQL执行能力
    4. 启动游戏服务后,抓包验证: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]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月1日
  • 创建了问题 2月28日