
算下来我在 DNF 台服这套东西上折腾了有一阵子服务端解压、跑库、连客户端这些环节数据库永远是卡住最多人的那道门槛。很多人解压完端启动 login 起来、game 起不来最后追到日志里全是数据库连接报错。这篇文章就把我在搭建 DNF 台服过程中从 MySQL 安装、建库导表、服务端配置到常见故障排查的完整流程整理出来主打一个能直接照着操作的实操路线。我默认看这篇内容的朋友已经有了一个能解压的台服服务端压缩包也知道自己是要搭一个本机或局域网内能跑起来的环境。如果你还在选端阶段建议先确认压缩包里是否带 sql 脚本和完整的 game / db 目录没有 sql 脚本的端基本不用考虑硬搞会折腾到怀疑人生。1. 先搞清楚数据库在 DNF 台服里的分工与底层逻辑1.1 服务端全家桶Login / Game / DB 三个角色的边界DNF 台服的服务端不是一个大程序而是由多个进程协同工作的不同版本叫法略有差异但核心就三块登录服务器、游戏服务器、数据库服务器。登录服务器负责账号密码校验、频道列表下发游戏服务器负责副本、战斗、掉落这些实时逻辑数据库服务器则是 MySQL负责所有持久化数据的读写。有些端还会带 relay、chat、auction 等额外进程但无论怎么拆分最终都要落到数据库上。角色职责常见进程名Login Server登录验证、频道管理df_login_rGame Server游戏玩法、战斗计算df_game_rDB Server数据存储、账号角色数据df_dbmw_r辅助进程拍卖行、频道relaydf_relay_r、df_channel_r 等数据库服务器的进程名会直接体现在运行脚本里比如热词里那行错误./run: ./df_dbmw_r: /lib/ld-linux.so.2: bad elf interpreter指的就是运行 db 服务进程时系统缺少 32 位动态链接库。这个问题后面细说。1.2 数据库里的常见库与关键表我见过的台服端MySQL 里一般会有这几套库taiwan_cain游戏核心数据角色、物品、任务、掉落几乎都在这里taiwan_login账号系统登录账号、封禁列表在这里taiwan_login_存储登录日志相关表taiwan_billing计费与点券相关每个库下面还有一堆表比如 accounts、charac_info、user_items 这类。如果你用 Navicat 打开后看到一堆看不懂的表不用慌大部分表不需要手动改记住几个关键的地方就行账号密码表、角色表、邮件表。改坏了直接重导 SQL 是家常便饭。1.3 为什么大家都用 MySQL 5.x而不是新版很多新人会问既然要装数据库为什么不装 MySQL 8.0这个问题我踩过坑。台服端的 SQL 脚本和运行程序基本是按 MySQL 5.x 时代写的老库表大量使用 MyISAM 引擎和旧字符集在 MySQL 8 里会遇到认证插件不兼容、默认字符集变化、SQL 语法严格模式拦截等一堆问题。我实测下来最稳的是 MySQL 5.5 和 5.6 版本。如果你的端压缩包里带了说明文档优先按文档版本走没写版本的话盲选 5.6 一般不会错。装新版图省事结果导入 SQL 报错一堆反而更费时间。2. 环境准备装库、配库、连接工具的完整清单2.1 服务器/虚拟机的基础环境我自己用的是一台 CentOS 7 x64 虚拟机内存给了 4G硬盘 40G。DNF 台服端对内存有一定要求至少 2G 起步有条件建议 4G 以上否则启动 game 进程很容易被系统 OOM 杀掉。系统装好之后先做三件事关闭 SELinux、关闭防火墙或放行端口、给端目录赋予可执行权限。SELinux 是新手最容易忽略的坑它会导致进程启动权限异常建议直接设为 disabledsed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config setenforce 02.2 安装 MySQL 与经典报错“bad elf interpreter”的解法CentOS 7 默认自带的数据库是 MariaDB有些端跑 MariaDB 也能工作但为了保证兼容性我更推荐装原生 MySQL 5.6。安装方式直接用 rpm 包或者配置官方 yum 源这里不展开网络配置问题重点说那个高频报错。热词里那行./run: ./df_dbmw_r: /lib/ld-linux.so.2: bad elf interpreter: no such是 64 位系统运行 32 位程序的经典报错。DNF 台服的服务端程序很多是 32 位编译的CentOS 7 默认不带 32 位库装上即可yum install -y glibc.i686 libstdc.i686 zlib.i686装完后回到服务端目录再跑 ./run就不会报 interpreter 错误了。如果还报缺其他 .so 文件用同样的思路补缺什么 lib 就装对应的 i686 版本。MySQL 装好后启动并设置 root 密码service mysqld start mysqladmin -u root password 你的密码2.3 必须改的几个 MySQL 核心配置MySQL 装好不是终点配置不对的话后面服务端连不上或者导入 SQL 直接失败。我每次装完都会改这几个参数集中在 /etc/my.cnf 里[mysqld] bind-address 0.0.0.0 max_allowed_packet 128M max_connections 2000 lower_case_table_names 0 skip-networking 0bind-address 改成 0.0.0.0允许非本机连接台服服务端进程和 MySQL 可能不在同一台机max_allowed_packet 调大否则导入大 SQL 文件会报 packet 超限lower_case_table_names 保持 0Linux 下表名区分大小写这事后面有专门一节讲skip-networking 必须为 0确保 TCP 连接开启改完重启 mysqld然后给 root 加远程访问权限GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的密码; FLUSH PRIVILEGES;2.4 客户端工具选择Navicat、命令行与辅助工具我日常操作数据库主要用 Navicat for MySQL图形化看表结构、编辑数据都方便。不过导入大 SQL 文件时我不太喜欢用 Navicat它在大文件下容易卡死命令行反而是最稳的。另外网上经常提到的 dbx 数据库工具这类小工具适合查看本地某些文件型数据库比如服务端版本里的 .db 数据文件它读的不是 MySQL别混为一谈。真正管 MySQL 还是得靠 Navicat 或者命令行。至于数据库同步工具等你环境稳定后可以考虑用 MySQL 主从复制或定期 mysqldump 做异地备份不是搭建阶段的事。3. 数据库初始化导入、校验、改库一套带走3.1 导入前先把库和权限收拾干净拿到一个带 SQL 脚本的端脚本命名一般很直白比如 taiwan_cain.sql、taiwan_login.sql。第一次导入前我建议用 root 登录 MySQL把旧库先清掉避免表已存在导致后面报错。强烈不建议直接在一个已经存在同名库的 MySQL 里执行导入因为台服 SQL 脚本里通常没有充分的 drop table 语句重复执行会撞唯一键、外键。我一般这么做DROP DATABASE IF EXISTS taiwan_cain; DROP DATABASE IF EXISTS taiwan_login; DROP DATABASE IF EXISTS taiwan_login_; DROP DATABASE IF EXISTS taiwan_billing; CREATE DATABASE taiwan_cain DEFAULT CHARACTER SET gbk; CREATE DATABASE taiwan_login DEFAULT CHARACTER SET gbk; CREATE DATABASE taiwan_login_ DEFAULT CHARACTER SET gbk; CREATE DATABASE taiwan_billing DEFAULT CHARACTER SET gbk; GRANT ALL PRIVILEGES ON taiwan%.* TO root%; FLUSH PRIVILEGES;注意字符集很多老端的 SQL 是按 GBK 写的强行用 utf8 建库中文地名、物品名会乱码。3.2 导入 SQL 的正确姿势与大文件导入失败处理库建好后开始导入。小文件可以用 Navicat 直接右键运行 SQL 文件大文件我用命令行mysql -uroot -p taiwan_cain /root/sql/taiwan_cain.sql mysql -uroot -p taiwan_login /root/sql/taiwan_login.sql导入过程中最容易遇到的报错有两类。一类是max_allowed_packet超限改 my.cnf 后重启即可。另一类是字符集相关表现为中文乱码或导入到一半报错“Incorrect string value”这种情况多半是建库字符集和 SQL 文件编码不匹配需要把建库语句里的字符集换成 gbk 再试。导入完成后用这个命令快速看下每个库的表数量和压缩包里的文档对比一下基本能确认是否完整SELECT table_schema, COUNT(*) FROM information_schema.tables WHERE table_schema IN (taiwan_cain,taiwan_login,taiwan_login_,taiwan_billing) GROUP BY table_schema;3.3 初始化完成后必须做的三项检查导入成功不等于万事大吉我每次还会做三件事第一确认 root 能从其他机器连接。用另一台电脑或虚拟机执行mysql -h 数据库IP -P 3306 -uroot -p能连上再继续。连不上就先查 bind-address、防火墙、grant 是否到位。第二抽查关键表的数据。比如看登录库的 accounts 表是不是存在且为空表这个表是后续 GM 账号注册和玩家注册的落点SELECT * FROM taiwan_login.accounts LIMIT 5;空表是正常的注册后才有数据。第三验证表名大小写是否敏感。DNF 台服的 SQL 脚本里查询语句的表名大小写和实际建表不一定完全一致如果启动 game 之后日志报“Table ... doesnt exist”大概率是 lower_case_table_names 这个参数的问题。Linux 下 MySQL 默认区分大小写保持 0 是最稳妥的之前我试过设成 1结果部分端直接找不到表。4. 服务端对接把数据库地址、账号、密码写进配置文件4.1 找到 game/db 配置文件的通用套路数据库自己通是一回事服务端能连上才是最终目的。台服端一般解压在 /home/neople 下里面会有 game、login、db 等目录配置文件通常在 cfg 目录或者目录根部的 .ini / .cfg 文件里。我遇到的端常见配置项大概长这样db_host127.0.0.1 db_port3306 db_userroot db_password你的密码 db_nametaiwan_cain server_ip192.168.1.100有的端写法不太一样可能是DB_DSN、mysql_host但核心要素都一样数据库 IP、端口、账号、密码、库名。改之前先备份原文件这个习惯救过我很多次。如果你发现配置文件里没有数据库相关项那多半是被写死在启动脚本里了比如 game 目录下的 run 脚本或 shell 脚本打开看一眼就能找到。4.2 启动顺序与日志验证配置改好后启动顺序很重要我一般这样service mysqld start cd /home/neople/db ./run cd /home/neople/login ./run cd /home/neople/game ./run严格说db 服务进程要等 MySQL 启动完成后再启game 又要等 login 起来后再启前后间隔几秒比较稳妥。很多端第一次启动 game 会报数据库连接失败不一定是配置错而是 MySQL 还没完全就绪。每个目录下通常都有日志文件启动后马上看日志tail -f /home/neople/game/log/*.log正常的日志会出现监听的端口号比如 “server start success” 或 “listen ... 10011”。如果一直卡在连接数据库日志里大概率有 “Access denied”“connect failed” 这类关键词。4.3 端口、防火墙与远程访问的排查逻辑如果数据库在独立机器上3306 端口必须放行。CentOS 7 的防火墙是 firewalldfirewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reloadCentOS 6 才是 iptables别搞混。端口放行后用 telnet 验证telnet 数据库IP 3306能通就说明网络层没问题。如果游戏服务器进程还是提示连接失败再检查数据库用户权限。MySQL 默认 root 只允许 localhost 登录前面那句GRANT ALL PRIVILEGES ON *.* TO root%就是干这个的。5. 避坑实录从数据库角度出发的高频故障5.1 数据库提示连接超时或 Access denied 的处理新手阶段最常碰到的两个报错一个是Cant connect to MySQL server一个是Access denied for user。前者先 ping 数据库 IP然后 telnet 3306能通再看 bind-address后者则几乎都是用户权限问题重新执行 grant 并 flush privileges 就好。我整理了一个速查表现象排查方向Cant connect 超时bind-address、防火墙、MySQL 是否启动Access deniedroot% 授权、密码是否正确Host not allowed权限表 missing 对应 host连接后秒断max_connections 满、MySQL 服务崩溃导入大 SQL 失败max_allowed_packet 不够5.2 数据表损坏 / 唯一键冲突 / 死锁的应急非正常断电或者强制 kill 进程容易导致 MyISAM 表损坏表现是查询某张表时报错或者 game 进程启动时读取角色数据失败。修复 MyISAM 表很简单REPAIR TABLE taiwan_cain.charac_info;或者用命令行工具 myisamchk。实测下来REPAIR TABLE 大多数情况能救回来救不回来的就只能从备份恢复。导入 SQL 时如果之前没清库会报唯一键冲突最省事的办法就是回到第 3 节的清库流程重新导别想着在冲突表上一点一点改。死锁问题在 DNF 台服里不常见但如果你改过表结构把 MyISAM 换成了 InnoDB就可能在拍卖行等高频写入场景遇到锁等待遇到就直接改回 MyISAM或者重启 MySQL 临时顶一阵。另外提醒一句热词里提到的“数据库 idb 文件”是 InnoDB 的表空间文件。如果你非要手动拷贝 .idb 文件来迁移数据表结构文件 .frm 必须一起处理否则极容易损坏。我不建议手动碰 .idb老老实实用 mysqldump 导出再导入。5.3 分屏、双开黑屏这些“伪数据库问题”排查过程中有个认知很重要不是所有故障都出在数据库。热词里“dnf分屏导致画面没了”“dnf双开分辨率”这类问题本质上属于客户端显示层问题往往是双开补丁、显卡驱动、窗口化分辨率设置导致的跟 MySQL 一点关系都没有。我见过有人服务端跑着好好的双开后画面撕裂就跑去看数据库连接数折腾半天纯浪费时间。遇到这种情况先看服务端日志有没有持续报错、数据库有没有查询异常如果数据读写都正常问题基本就在客户端显示环境去调分辨率或多开工具的兼容性。5.4 备份、同步与回复现场的小习惯数据库稳定之后备份习惯必须养成。我每次改 GM 账号、调整物品数据之前都会先导出一份完整的 SQLmysqldump -uroot -p --default-character-setgbk --databases taiwan_cain taiwan_login taiwan_billing /backup/db_$(date %F).sql恢复时用mysql -uroot -p /backup/db_某日期.sql如果你想做热备或同步到另一台机器可以研究 MySQL 主从复制通过 binlog 让备用库实时同步主库的数据。对台服这种小规模场景其实一个 crontab 定时任务每天导一次就够用了没必要上太重的方案。我自己在实际操作中的体会是台服数据库搭建这件事难度不在 SQL 语法而在对整个链路的耐心排查。很多人卡住是因为把时间浪费在“重启一下试试”而不是“看完日志找根因”。先把 MySQL 跑稳、权限放对、配置写对后面百分之八十的问题都能避免。最后再分享一个小技巧把启动顺序、检查端口、看日志这几个命令写成一个 shell 脚本每次开机一键执行能帮你少踩很多重复的坑。