FiveM Database Connection Failed แก้อย่างไร? oxmysql ต่อ MySQL/MariaDB ไม่ได้แก้ทีละจุด

 ปัญหา FiveM Database Connection Failed หรือ oxmysql เชื่อม MySQL/MariaDB ไม่ได้ ควรแก้จากข้อความ Error ใน FXServer Console ก่อน เพราะ Error แต่ละแบบชี้ไปคนละ Layer เช่น Username/Password ผิด, Database ไม่มี, Database Service ไม่ทำงาน, Host หรือ Port ผิด, Firewall บล็อก หรือ mysql_connection_string ถูก Parse ไม่ถูกต้อง

ลำดับ Debug ที่แนะนำคือ

FXServer
↓
oxmysql Start ได้ไหม?
↓
Connection String ถูกไหม?
↓
Host Resolve ได้ไหม?
↓
Port ไปถึงไหม?
↓
MariaDB/MySQL ทำงานไหม?
↓
Authentication ผ่านไหม?
↓
Database มีไหม?
↓
Permission ถูกไหม?
↓
SELECT 1 ผ่านไหม?

อย่าเริ่มจากแก้ SQL ของ Garage หรือ Inventory ถ้า oxmysql ยังเชื่อม Database ไม่สำเร็จ

ตัวอย่าง Connection String

set mysql_connection_string "mysql://fivem_user:password@127.0.0.1:3306/fivem"

ensure oxmysql

สิ่งสำคัญคือ Connection String ต้องถูกกำหนด ก่อน Start oxmysql และ Resources ที่ใช้ Database

① FiveM Database Connection Failed คืออะไร

หมายถึง Database Layer ของ Server ไม่สามารถสร้าง Connection กับ MySQL/MariaDB ตาม Configuration ได้

ปัญหาอาจอยู่ที่

FiveM
oxmysql
Connection String
DNS
Network
Firewall
Database Service
Database Account
Database Permissions
Database Name

ดังนั้นคำว่า

Database Connection Failed

ยังไม่ใช่ Root Cause

ต้องอ่าน Error ที่อยู่หลังข้อความนั้น

② สิ่งแรกที่ต้องทำคืออ่าน FXServer Console

เวลา oxmysql Start ให้ดู Console

Error ที่อาจพบ เช่น

ECONNREFUSED
ETIMEDOUT
Access denied
Unknown database
ENOTFOUND
connection string invalid

แต่ละข้อความบอกทิศทาง Debug ได้มาก

อย่า Restart Server ซ้ำสิบครั้งโดยยังไม่ได้อ่าน Error

③ แยก Error เป็น 4 กลุ่มก่อน

ใช้วิธีนี้จะ Debug เร็วขึ้นมาก

กลุ่ม 1
Connection String
↓
Syntax / Password / Host

กลุ่ม 2
Network
↓
DNS / Port / Firewall / Timeout

กลุ่ม 3
Authentication
↓
Username / Password / Host permission

กลุ่ม 4
Database
↓
Database ไม่มี / Permission / Schema

รู้ว่าอยู่กลุ่มไหนก่อนค่อยลงรายละเอียด

④ ตรวจ mysql_connection_string ก่อน

ตัวอย่าง URI

set mysql_connection_string "mysql://fivem_user:password@127.0.0.1:3306/fivem"

แยกออกเป็น

USER
→ fivem_user

PASSWORD
→ password

HOST
→ 127.0.0.1

PORT
→ 3306

DATABASE
→ fivem

ตรวจทีละค่า

อย่ามอง Connection String ทั้งบรรทัดแล้วเดาว่าถูก

⑤ Connection String ต้องอยู่ก่อน oxmysql

ควรเป็น

set mysql_connection_string "mysql://fivem_user:password@127.0.0.1:3306/fivem"

ensure oxmysql

ensure my_core
ensure my_garage

ไม่ใช่

ensure oxmysql

set mysql_connection_string "..."

เพราะ Database Connector ต้องอ่านค่าตอนเริ่มทำงาน

⑥ ใช้ set ไม่ใช่ Credential แบบ Replicated

สำหรับ Connection String ใช้

set mysql_connection_string "..."

Database Password เป็นข้อมูล Server-side

อย่านำไปใส่ใน

client.lua
shared/config.lua
NUI
JavaScript ฝั่ง Client

เด็ดขาด

⑦ Connection String ใช้ได้กี่รูปแบบ

oxmysql รองรับทั้ง URI Format

set mysql_connection_string "mysql://user:password@localhost:3306/fivem"

และ Semicolon-separated Format

set mysql_connection_string "user=user;password=password;host=localhost;port=3306;database=fivem"

หาก Format หนึ่ง Parse Password ผิด สามารถลองอีก Format ได้

⑧ Password มีอักขระพิเศษต้องระวัง

เอกสาร oxmysql เตือนว่าบาง Character มีความหมายพิเศษใน Connection String เช่น

;
,
/
?
:
@
&
=
+
$
#

สมมติ Password คือ

MyPass@2026

URI

mysql://user:MyPass@2026@localhost/fivem

อาจทำให้ Parser แยกส่วนผิด

ถ้า Connection String ดูเหมือนถูกแต่ Authentication แปลก ให้ตรวจ Password ก่อน

⑨ วิธีแก้ Password Parsing

มีทางเลือก เช่น

① เปลี่ยน Connection String Format
② เปลี่ยน Password
③ ใช้ Encoding ที่เหมาะกับระบบ

สำหรับ Server ที่ควบคุมเอง วิธีง่ายคือใช้ Password ที่แข็งแรงแต่ไม่สร้าง Ambiguity กับ Connection String Parser

แต่ยังต้องยาวและเดายาก

⑩ ECONNREFUSED คืออะไร

Error เช่น

connect ECONNREFUSED 127.0.0.1:3306

โดยทั่วไปหมายถึงระบบพยายามเชื่อม TCP ไปยัง Host/Port แล้ว Connection ถูกปฏิเสธ

มักต้องตรวจ

MariaDB/MySQL เปิดอยู่ไหม?
Host ถูกไหม?
Port ถูกไหม?
Service Listen ที่ Address นั้นไหม?
Firewall หรือ Container Network ถูกไหม?

นี่ไม่ใช่ SQL Query Error

⑪ ECONNREFUSED แก้อย่างไร

เริ่มจาก Database Service

Linux ตัวอย่าง Concept

MariaDB Service
↓
Running?

Windows ตรวจ

Services
↓
MariaDB / MySQL
↓
Running

ถ้า Database Service ไม่ทำงาน ให้แก้ Service ก่อน FiveM

⑫ ตรวจ Port 3306

MySQL/MariaDB ปกติพบ Port

3306

แต่ Hosting Provider หรือ Custom Configuration อาจใช้ Port อื่น

ถ้าของจริงคือ

3307

แต่ Connection String ใช้

3306

ก็จะต่อผิดปลายทาง

⑬ อย่าเดา Port

ตรวจจาก

Hosting Panel
MariaDB Configuration
MySQL Configuration
Provider Database Details

แล้วใช้ค่าจริง

Connection String

set mysql_connection_string "mysql://user:password@host:3307/fivem"

ถ้า Provider กำหนด 3307

⑭ localhost กับ 127.0.0.1 ต่างกันไหม

ทั้งสองมักชี้กลับมาที่เครื่องเดียวกัน แต่พฤติกรรมของ Client/Database Account/Socket Configuration อาจแตกต่างตาม Environment

ถ้าใช้

localhost

ไม่ได้

แต่ Database ฟัง TCP ที่

127.0.0.1:3306

ลองตรวจ Configuration และใช้ Host ที่ Provider/Database ระบุจริง

อย่าเปลี่ยนแบบสุ่มโดยไม่ดู Error

⑮ Database อยู่เครื่องเดียวกับ FXServer

Architecture

FXServer
+
MariaDB

บนเครื่องเดียวกัน

Connection String มักใช้

127.0.0.1

เช่น

set mysql_connection_string "mysql://fivem_user:password@127.0.0.1:3306/fivem"

กรณีนี้ไม่จำเป็นต้องเปิด Port 3306 สู่ Internet

⑯ Database อยู่คนละเครื่อง

Architecture

FXServer
192.168.1.10

Database
192.168.1.20

ต้องตรวจเพิ่ม

Routing
Firewall
Database bind address
Database user host permission
Private/Public IP
Security group

การที่ Database ใช้งานได้บนเครื่อง Database เองไม่ได้หมายความว่า FXServer Remote จะต่อได้

⑰ ETIMEDOUT คืออะไร

Error Timeout มักหมายถึง Connection Attempt ไปถึงปลายทางไม่ได้ภายในเวลาที่กำหนด

สาเหตุที่ควรตรวจ

Firewall drop
IP ผิด
Port ผิด
Network route
Database host ไม่ตอบ
Cloud security rule

ต่างจาก ECONNREFUSED ที่มักเป็นการปฏิเสธ Connection อย่างชัดเจน

⑱ Connection Timeout ต้อง Debug Network ก่อน

ถ้า Database อยู่ Remote

ลองไล่

FXServer
↓
DNS/IP ถูก?
↓
Network Route?
↓
Port reachable?
↓
Firewall?
↓
MariaDB listen?

อย่าแก้

SELECT *

หรือ Database Table ในขั้นนี้

เพราะยังต่อ Server ไม่ได้เลย

⑲ ENOTFOUND คืออะไร

หากใช้ Hostname เช่น

mysql.example.internal

แล้วเกิด Error แนว DNS Resolve ไม่ได้ เช่น ENOTFOUND

ให้ตรวจ

Hostname สะกดถูกไหม?
DNS ใช้งานได้ไหม?
Provider Host ถูกไหม?
ชื่อ Host ใช้ได้จาก FXServer เครื่องนี้ไหม?

สามารถทดลองใช้ IP ที่ Provider กำหนดเพื่อแยกว่าเป็น DNS Problem หรือไม่ หาก Environment อนุญาต

⑳ Hostname ไม่ใช่ Database Name

อย่าสลับ

HOST

กับ

DATABASE

ตัวอย่าง

mysql://user:password@db.example.com:3306/fivem

ตรงนี้

db.example.com
→ Database Host

ส่วน

fivem
→ Database Name

เป็นคนละอย่าง

㉑ Access denied คืออะไร

Error เช่น

Access denied for user

หมายความว่า Connection ไปถึง Database Server แล้ว แต่ Authentication หรือ Permission ของ Account ไม่ผ่าน

นี่เป็นข้อมูลสำคัญมาก เพราะแปลว่า

Network
→ น่าจะไปถึง Database แล้ว

ตอนนี้ให้ตรวจ Account Layer

㉒ Access denied ต้องตรวจอะไร

ตรวจ

Username
Password
Database host rule
Account host
Authentication plugin
Privileges

เช่น Database Account อาจเป็น

'fivem_user'@'localhost'

แต่ FXServer Connect มาจาก Remote IP

Account นี้อาจไม่ตรง Host Rule ที่อนุญาต

㉓ MySQL/MariaDB Account มี Host ด้วย

Database User ไม่ได้มีแค่ Username อย่างเดียว

Concept คือ

'user'@'host'

เช่น

'fivem_user'@'localhost'

หรือ Account ที่อนุญาตเฉพาะ Host/IP หนึ่ง

ดังนั้น Username ถูกและ Password ถูกก็ยัง Access Denied ได้หาก Host Context ไม่ตรง

㉔ ตรวจ Database User

สามารถตรวจด้วย Database Admin Tool หรือ SQL ที่เหมาะสมกับ Version

เป้าหมายคือดูว่า

fivem_user

มี Account จาก Host ที่ FXServer ใช้อยู่หรือไม่

อย่าเปิด

'%' 

ให้ทุก Host เข้าถึงโดยไม่มีเหตุผลด้าน Network/Security

㉕ Password ผิดแก้อย่างไร

วิธีที่ดีคือทดสอบ Credential นอก FiveM ก่อน

ใช้

MariaDB client
MySQL client
DBeaver
HeidiSQL

จากเครื่องหรือ Network Context ที่ใกล้เคียงกับ FXServer

ถ้า Client Database Login ยังไม่ได้

อย่าเสียเวลาแก้ Lua Script

㉖ Dedicated Database User ดีกว่า root

ไม่แนะนำให้ Resource Production ใช้

root

ถ้าไม่จำเป็น

สร้าง

fivem_user

แล้วกำหนด Permission เฉพาะ Database

ช่วยลดผลกระทบถ้า Credential รั่วหรือ Resource มีปัญหา

㉗ Unknown database คืออะไร

Error เช่น

Unknown database 'fivem'

หมายถึง Connection ไปถึง Database Server และพยายามเลือก Database ชื่อ fivem แต่ Database นั้นไม่มีตามที่ Server มองเห็น

ตรวจด้วย

SHOW DATABASES;

และดูชื่อจริง

㉘ Database Name ตัวพิมพ์ต้องตรงไหม

ควรใช้ชื่อให้ตรงกับ Database จริงทุกตัวอักษร

เช่น Database จริง

com_fivem

แต่ Connection String เป็น

/fivem

จะชี้คนละ Database

ควรกำหนด Naming Convention สม่ำเสมอ

㉙ สร้าง Database หากยังไม่มี

ตัวอย่าง

CREATE DATABASE com_fivem
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

จากนั้น Connection String

set mysql_connection_string "mysql://fivem_user:password@127.0.0.1:3306/com_fivem"

ชื่อท้าย URI ต้องตรง

㉚ Access denied to database ต่างจาก Login denied

มีกรณี Connect Account สำเร็จ แต่ Account ไม่มี Permission กับ Database นั้น

MariaDB สามารถแจ้ง Error ลักษณะ

Access denied ... to database

ต้อง Grant Permission ที่ Resource ต้องใช้

ไม่ใช่เปลี่ยน Password อย่างเดียว

㉛ Grant Permission ตัวอย่าง

ตัวอย่าง

GRANT SELECT, INSERT, UPDATE, DELETE
ON com_fivem.*
TO 'fivem_user'@'localhost';

Resource ที่ต้อง Migration Schema อาจต้อง Permission เพิ่ม เช่น

CREATE
ALTER
INDEX

ตาม Use Case

ใช้หลัก Least Privilege

㉜ FLUSH PRIVILEGES ต้องใช้ทุกครั้งไหม

คำสั่ง

FLUSH PRIVILEGES;

มักพบใน Setup Guides

พฤติกรรมขึ้นกับวิธีจัดการ Accounts/Privileges และ Database Version

ประเด็นสำคัญกว่าคือให้ Account มี Permission ถูกต้องจริง

ตรวจด้วยการ Login และทดลอง Query

㉝ Database Login ผ่านแต่ Table ไม่มี

นี่ไม่ใช่ Connection Failed แล้ว

ถ้า SELECT 1 ผ่าน แต่ Resource Error

Table 'characters' doesn't exist

แปลว่า

Connection Layer
→ ผ่าน

แต่

Schema Layer
→ มีปัญหา

ต้อง Import SQL/Migration ที่ Resource ต้องการ

㉞ Unknown column ก็ไม่ใช่ Connection Error

ตัวอย่าง

Unknown column 'garage'

หมายถึง Query พบ Table แล้ว แต่ Column ไม่มี

ตรวจ

Resource Version
SQL Migration Version
Database Schema
Column Name

อย่าแก้ Connection String

㉟ วิธีแยก Connection กับ Schema ง่ายที่สุด

ใช้

SELECT 1

ถ้าผ่าน

Database Connection
→ ใช้งานได้ระดับพื้นฐาน

จากนั้นลอง

SELECT DATABASE()

เพื่อยืนยัน Database ที่เลือก

แล้วค่อย Query Table จริง

㊱ สร้าง Resource Test แยก

สร้าง

db_test/
├── fxmanifest.lua
└── server.lua

Manifest

fx_version 'cerulean'
game 'gta5'

dependency 'oxmysql'

server_script '@oxmysql/lib/MySQL.lua'
server_script 'server.lua'

ทำให้ Debug Database โดยไม่ต้องผ่าน Framework ใหญ่

㊲ ทดสอบ SELECT 1

server.lua

CreateThread(function()

    local result =
        MySQL.scalar.await(
            'SELECT 1'
        )

    print(
        '[DB TEST] SELECT 1:',
        result
    )
end)

ถ้าได้

[DB TEST] SELECT 1: 1

ถือว่า Query พื้นฐานผ่าน

㊳ ตรวจ Database Name

เพิ่ม

local database =
    MySQL.scalar.await(
        'SELECT DATABASE()'
    )

print(
    '[DB TEST] Database:',
    database
)

ถ้าคิดว่า Connect com_fivem

แต่ Console บอกชื่ออื่น

แสดงว่า Connection String/Configuration ที่ FXServer ใช้ไม่ใช่ตัวที่คุณคิด

㊴ มี Connection String ซ้ำใน server.cfg หรือไม่

ค้นหา

mysql_connection_string

ทั้ง Project Configuration

บางครั้งมี

set mysql_connection_string "database_A"

ด้านบน

แล้วอีกไฟล์ Config ที่ exec ถูกเรียกภายหลังตั้ง

set mysql_connection_string "database_B"

ค่าที่ Runtime ใช้อาจไม่ใช่บรรทัดที่คุณกำลังดู

㊵ ตรวจไฟล์ cfg ที่ถูก exec ด้วย

server.cfg สามารถเรียก Config อื่น

เช่น

exec database.cfg

ดังนั้นควรค้นทั้ง Config Tree

ไม่ใช่เปิด server.cfg ไฟล์เดียวแล้วสรุปทันที

㊶ Resource oxmysql ชื่อถูกไหม

ควรเป็น

oxmysql

ถ้า Rename เป็น

oxmysql-main

Resource อื่นที่ใช้

dependency 'oxmysql'

หรือ

@oxmysql/lib/MySQL.lua

อาจหาไม่เจอ

อย่า Rename Dependency Resource โดยไม่มีเหตุผล

㊷ oxmysql Folder ซ้อนหรือไม่

ผิด

resources/
└── oxmysql/
    └── oxmysql/
        ├── fxmanifest.lua
        └── ...

ถูก

resources/
└── oxmysql/
    ├── fxmanifest.lua
    └── ...

ถ้า FXServer ไม่พบ oxmysql ให้แก้ Resource Discovery ก่อน Database Connection

㊸ ใช้ refresh เมื่อเพิ่งเพิ่ม oxmysql

ถ้า Server เปิดอยู่แล้ว

refresh
ensure oxmysql

จากนั้นอ่าน Console

ถ้า oxmysql Start ไม่ได้เพราะ Artifact/Resource Requirement ให้แก้ตรงนั้นก่อน Database Credentials

㊹ FXServer Artifact เก่ามีผลไหม

มีได้

oxmysql Version ปัจจุบันมี Resource Requirements ของตัวเอง

ดังนั้นควรใช้ Supported/Current FXServer Artifact ตาม Resource Stack ที่ติดตั้ง

ถ้า Console แจ้ง Server Constraint ไม่ผ่าน อย่าลบ Constraint จาก fxmanifest.lua ของ oxmysql เพื่อบังคับให้ Start

ให้ Update Server Environment ให้ Compatible

㊺ oxmysql Start แต่ Consumer Start ก่อน

ไม่ควรจัด

ensure my_core
ensure my_garage
ensure oxmysql

ถ้า Core/Garage ต้องใช้ Database

ควรเป็น

ensure oxmysql

ensure my_core
ensure my_garage

และ Resource ที่บังคับต้องใช้ oxmysql สามารถประกาศ

dependency 'oxmysql'

㊻ อย่าใช้ Wait แก้ Connection Failed

ไม่ควร

CreateThread(function()

    Wait(10000)

    MySQL.query.await(
        'SELECT 1'
    )
end)

ถ้า

Password ผิด
Host ผิด
Port ปิด
Database ไม่มี

รออีกหนึ่งชั่วโมงก็ยังไม่หาย

Wait() ไม่ใช่ Database Connection Configuration

㊼ Database Service เริ่มช้ากว่า FXServer ทำอย่างไร

บนเครื่องที่ Service Startup Order มีปัญหา ควรจัดระบบ Service/Container Orchestration ให้ Database Ready ก่อน FXServer

ตัวอย่าง Concept

MariaDB Healthy
↓
FXServer
↓
oxmysql
↓
Resources

ดีกว่ายัด Delay แบบสุ่มในทุก Resource

㊽ Docker ต้องระวัง localhost

ถ้า FXServer และ Database อยู่คนละ Container

localhost

ใน FXServer Container หมายถึง Container นั้นเอง

ไม่ใช่ Database Container

ต้องใช้

Container service name
Private network IP

ตาม Docker Network Configuration

นี่เป็นสาเหตุ Connection Refused ที่พบได้บ่อยใน Container Environment

㊾ Pterodactyl ต้องใช้ Host จาก Panel

Hosting/Panel อาจให้ Database Details เช่น

Host
Port
Database
Username
Password

ให้ใช้ค่าจาก Panel

อย่าเดาว่า Database อยู่

127.0.0.1:3306

เพราะ Pterodactyl Environment อาจแยก Database Server คนละ Host

㊿ Shared Hosting Database ต้องเปิด Remote Access

ถ้า Provider แยก FXServer กับ Database Server ต้องมี Permission ให้อุปกรณ์ FXServer Connect

บาง Provider จัดการ Allowlist ให้อัตโนมัติ

บางรายต้องกำหนด Source IP

ตรวจ Hosting Documentation/Panel ของผู้ให้บริการ

51 Firewall ต้องเปิดอย่างไร

ถ้า Database Remote ต้องอนุญาต Traffic ที่จำเป็นจาก FXServer ไป Database Port

แนวทางที่ปลอดภัยคือ

อนุญาตเฉพาะ FXServer IP
↓
Database Port

ไม่ใช่

เปิด 3306 ให้ทั้ง Internet

โดยไม่มีเหตุผล

52 bind-address คืออะไร

MariaDB/MySQL อาจถูกตั้งให้ Listen เฉพาะ

127.0.0.1

ถ้าต้องการ Remote Connection Database ต้อง Listen บน Interface ที่เหมาะสมตาม Network Architecture

แต่การเปลี่ยน Bind Address มีผลด้าน Security

ควรทำคู่กับ Firewall และ User Host Restrictions

53 Ping ได้แต่ Database ต่อไม่ได้

ping ทดสอบเพียง Network Reachability บางระดับ

ไม่ได้ยืนยันว่า

TCP 3306 เปิด
MariaDB กำลัง Listen
Database User ใช้งานได้

ดังนั้น

Ping ผ่าน

แต่

ECONNREFUSED 3306

ยังเป็นไปได้

54 Remote Port ต้องทดสอบจากฝั่ง FXServer

สิ่งสำคัญคือทดสอบจากเครื่อง/Container ที่ FXServer รันอยู่

เพราะ

Notebook ของคุณต่อ Database ได้

ไม่ได้หมายความว่า

FXServer Host ต่อได้

Firewall, VPN หรือ Allowlist อาจต่างกัน

55 SSL/TLS มีผลไหม

Database Provider บางรายบังคับ TLS/SSL

ถ้า Provider กำหนด SSL Configuration ต้องตั้ง Connection Options ตาม Requirement ของ Provider และ Driver

อย่า Disable SSL เพียงเพื่อให้ Error หายโดยไม่เข้าใจ Security Policy

กรณี Database Local/Private Network Requirements อาจแตกต่างกัน

56 Authentication Plugin Error คืออะไร

บาง MySQL/MariaDB Environment อาจมี Authentication Method/Plugin ที่ Driver หรือ Account Configuration ไม่เข้ากัน

ถ้า Error ชี้ไปที่ Authentication Plugin

ให้ตรวจ

Database Version
Account authentication method
oxmysql/mysql2 compatibility
Provider configuration

ไม่ควรสุ่ม Downgrade Database หรือ Driver ก่อนอ่าน Error เต็ม

57 MySQL 8 กับ MariaDB ต่างกันอย่างไรใน FiveM

oxmysql รองรับ MySQL 8 และ MariaDB

แต่ Documentation แนะนำ MariaDB สำหรับ Compatibility กับ Resources FiveM จำนวนมาก เพราะ Scripts เก่าบางตัวมี SQL Assumptions จากยุค MySQL 5.7

อย่างไรก็ตาม Connection Failed ต้องแยกจาก Query Compatibility

ถ้า Authentication ผ่านแต่ Query Syntax Error นั่นเป็นอีก Layer หนึ่ง

58 เปิด mysql_debug เมื่อไร

ถ้า Connection ผ่านแล้วและต้องตรวจ Queries สามารถใช้

set mysql_debug true

แต่ถ้า oxmysql ยังต่อ Database ไม่ได้ตั้งแต่ต้น Debug Queries จะไม่ใช่จุดหลัก

ให้แก้ Connection Layer ก่อน

59 Checklist Database Connection Failed

ตรวจทีละข้อ

① oxmysql Resource มีจริง?
② Folder ไม่ซ้อน?
③ FXServer เห็น oxmysql?
④ Artifact Compatible?
⑤ mysql_connection_string มีหรือไม่?
⑥ ใช้ set หรือไม่?
⑦ อยู่ก่อน ensure oxmysql หรือไม่?
⑧ มี Connection String ซ้ำหรือไม่?
⑨ URI Syntax ถูกหรือไม่?
⑩ Password มี Special Character ที่รบกวน Parser หรือไม่?
⑪ ลอง Semicolon Format หรือยัง?
⑫ Username ถูกหรือไม่?
⑬ Password ถูกหรือไม่?
⑭ Host ถูกหรือไม่?
⑮ Port ถูกหรือไม่?
⑯ Database Name ถูกหรือไม่?
⑰ MariaDB/MySQL Service Running หรือไม่?
⑱ ECONNREFUSED หรือไม่?
⑲ ETIMEDOUT หรือไม่?
⑳ DNS Resolve ได้หรือไม่?
㉑ Firewall อนุญาตหรือไม่?
㉒ Database Listen Interface ถูกหรือไม่?
㉓ User Host Permission ถูกหรือไม่?
㉔ User มี Permission Database หรือไม่?
㉕ Database มีอยู่จริงหรือไม่?
㉖ SELECT 1 ผ่านหรือไม่?
㉗ SELECT DATABASE() ถูก Database หรือไม่?
㉘ Consumer Start หลัง oxmysql หรือไม่?
㉙ Resource มี dependency 'oxmysql' หรือไม่?
㉚ Table/Column Error ถูกแยกจาก Connection Error หรือไม่?

⑥⓪ ตาราง Error FiveM Database Connection Failed

Error/อาการจุดที่ควรตรวจ
ECONNREFUSEDDatabase Service, Host, Port, Listen Address
ETIMEDOUTNetwork, Firewall, Route, Security Group
ENOTFOUNDDNS/Hostname
Access denied for userUsername, Password, Account Host, Authentication
Access denied to databaseDatabase Privileges
Unknown databaseDatabase Name/Database ยังไม่มี
Connection string invalidSyntax, Special Characters, Format
Table doesn't existSchema/SQL Import ไม่ใช่ Connection
Unknown columnSchema Version/Column ไม่ใช่ Connection
No such exportResource/Dependency/API ไม่ใช่ DB Authentication

การจำตารางนี้ช่วยลดเวลาหาสาเหตุได้มาก

ตัวอย่างการ Debug ECONNREFUSED

สมมติ Console

connect ECONNREFUSED 127.0.0.1:3306

อย่าแก้ Password ก่อน

ไล่

127.0.0.1 ถูกเครื่องไหม?
↓
MariaDB Running?
↓
Listen Port 3306?
↓
Connection String Port ถูก?
↓
Docker/VM หรือไม่?

ถ้า Database อยู่ Remote Server แต่ Connection ใช้ 127.0.0.1

นั่นอาจเป็นสาเหตุทันที

ตัวอย่างการ Debug Access denied

Console

Access denied for user 'fivem_user'@'host'

ไล่

Username
↓
Password
↓
Host ของ Account
↓
Privileges

ลอง Login Database ด้วย Credential เดียวกัน

ถ้า Login ยังไม่ได้ แก้ Database Account ก่อน

ตัวอย่างการ Debug Unknown database

Console

Unknown database 'fivem'

ตรวจ

SHOW DATABASES;

ถ้ามีจริงชื่อ

com_fivem

Connection String ต้องเป็น

set mysql_connection_string "mysql://user:password@127.0.0.1:3306/com_fivem"

ไม่ใช่ /fivem

ตัวอย่าง Complete Test Resource

โครงสร้าง

com_db_test/
├── fxmanifest.lua
└── server.lua

fxmanifest.lua

fx_version 'cerulean'
game 'gta5'

author 'comsiam'
description 'FiveM database connection diagnostic'
version '1.0.0'

dependency 'oxmysql'

server_script '@oxmysql/lib/MySQL.lua'
server_script 'server.lua'

server.lua

CreateThread(function()

    print(
        '[DB TEST] Starting database test'
    )

    local result =
        MySQL.scalar.await(
            'SELECT 1'
        )

    if result ~= 1 then

        print(
            '[DB TEST] SELECT 1 failed'
        )

        return
    end

    local database =
        MySQL.scalar.await(
            'SELECT DATABASE()'
        )

    print(
        '[DB TEST] Connection OK'
    )

    print(
        '[DB TEST] Database:',
        database
    )
end)

server.cfg

set mysql_connection_string "mysql://fivem_user:CHANGE_PASSWORD@127.0.0.1:3306/com_fivem"

ensure oxmysql
ensure com_db_test

ถ้าได้

[DB TEST] Connection OK
[DB TEST] Database: com_fivem

แสดงว่า Connection Layer ทำงาน

จากนั้นค่อย Debug Tables และ Queries ของ Resource จริง

Connection ผ่านแล้วอย่าโทษ oxmysql ทุก Error

หลัง

SELECT 1

และ

SELECT DATABASE()

ผ่าน

หาก Garage Error

Unknown column 'stored'

ให้ไปแก้

Garage SQL
Schema
Migration

ไม่ใช่ Connection String

Developer ต้องรู้ว่าปัญหาอยู่ Layer ไหน

Database Connection Failed หลังเปลี่ยน Password

ถ้าเพิ่งเปลี่ยน Database Password

ต้องแก้ Connection String ให้ตรง

และ Restart oxmysql/Server ตาม Deployment Procedure ที่เหมาะสม เพื่อให้ Connector อ่าน Configuration ใหม่

แต่อย่าเปิดเผย Password ใหม่ใน Discord หรือ Screenshot Console

Credential รั่วต้องทำอย่างไร

หาก Connection String จริงหลุดสู่ Public

อย่าทำแค่ลบโพสต์

ควร

① เปลี่ยน Database Password
② ตรวจ Database Account
③ ตรวจ Logs หากจำเป็น
④ ตรวจ Permission
⑤ แก้ server.cfg
⑥ Restart Database Connector อย่างควบคุม

เพราะ Credential เดิมต้องถือว่าไม่ปลอดภัยแล้ว

อย่าเปิด Database Port สู่โลกเพราะแก้ Timeout

วิธีแก้ที่อันตรายคือ

Timeout
↓
เปิด 3306 ให้ 0.0.0.0/0

แม้อาจทำให้ Connection ผ่าน แต่สร้าง Attack Surface โดยไม่จำเป็น

ควรอนุญาตเฉพาะ Network/IP ที่ต้องใช้

Database User ก็ไม่ควรมีสิทธิ์เกินจำเป็น

Resource Gameplay อาจต้อง

SELECT
INSERT
UPDATE
DELETE

แต่ไม่จำเป็นต้องมี

SUPER
CREATE USER
GRANT OPTION

โดยไม่มีเหตุผล

ใช้ Least Privilege ช่วยจำกัดผลกระทบหาก Resource หรือ Credential ถูกโจมตี

คำถามที่พบบ่อยเกี่ยวกับ FiveM Database Connection Failed

FiveM Database Connection Failed แก้อย่างไร

เริ่มอ่าน Error จาก oxmysql แล้วแยกว่าเป็น Connection String, Network, Authentication หรือ Database/Permission Problem

ECONNREFUSED คืออะไร

โดยทั่วไปหมายถึง Host/Port ปฏิเสธ Connection ให้ตรวจ Database Service, Host, Port และ Listen Configuration

ETIMEDOUT คืออะไร

Connection ไม่ได้รับคำตอบภายในเวลาที่กำหนด มักตรวจ Network, Firewall และ Route

ENOTFOUND คืออะไร

Hostname/DNS ไม่สามารถ Resolve ได้

Access denied คืออะไร

Database Server ถูกติดต่อได้ แต่ Authentication/Account Host หรือ Permission ไม่ผ่าน

Unknown database คืออะไร

Database ที่ Connection String ระบุไม่มีหรือชื่อไม่ตรง

Unknown column เป็น Connection Failed ไหม

ไม่ เป็น Schema/SQL Problem หลัง Connection ทำงานแล้ว

Table doesn't exist เป็น Connection Failed ไหม

ไม่จำเป็น Connection อาจสมบูรณ์แต่ยังไม่ได้ Import Schema

Connection String อยู่ตรงไหน

ใน Server Configuration เช่น server.cfg

ต้องวางก่อน oxmysql ไหม

ใช่ ควรกำหนดก่อน Start oxmysql

ใช้ set หรือ setr

ใช้ set สำหรับ mysql_connection_string

oxmysql ใช้ Port อะไร

ใช้ Port ของ MySQL/MariaDB ที่ Configuration กำหนด ซึ่งมักพบ 3306

Database อยู่เครื่องเดียวกันใช้ Host อะไร

มักใช้ 127.0.0.1 หรือ Host ตาม Database Configuration

Database อยู่ Remote ใช้ localhost ได้ไหม

ไม่ หาก Database อยู่คนละ Host localhost จะชี้กลับมาที่เครื่อง/Container ที่ FXServer กำลังรัน

Pterodactyl ใช้ 127.0.0.1 เสมอไหม

ไม่ ต้องใช้ Host/Port ที่ Panel หรือ Provider ให้มา

Password มี @ แล้วต่อไม่ได้ทำอย่างไร

ตรวจ Special Characters และลองเปลี่ยน Connection String Format หรือ Password ที่เหมาะสม

URI กับ Semicolon Format อะไรดีกว่า

ทั้งสองรองรับ เลือกแบบที่ถูกต้องกับ Configuration และ Credentials ของคุณ

ใช้ root ได้ไหม

ไม่แนะนำสำหรับ Production ควรใช้ Dedicated User

Database User ต้องมี Permission อะไร

อย่างน้อยตาม Queries ที่ Resource ต้องใช้ เช่น SELECT/INSERT/UPDATE/DELETE และเพิ่ม Schema Permissions เมื่อมี Migration Requirement

เปิด Port 3306 สู่ Internet ได้ไหม

ควรหลีกเลี่ยง หากจำเป็นต้อง Remote ให้จำกัด Source IP/Network ด้วย Firewall

Database Service Running แต่ยัง ECONNREFUSED ทำไม

อาจ Listen คนละ Address/Port, Container Network ผิด หรือ Connection กำลังไป Host ที่ผิด

Docker ใช้ localhost ได้ไหม

ถ้า Database อยู่คนละ Container โดยทั่วไปต้องใช้ Container/Service Network Address ไม่ใช่ localhost ของ FXServer Container

SELECT 1 ใช้ทดสอบอะไร

ใช้ยืนยัน Database Query Connection ขั้นพื้นฐานโดยไม่พึ่ง Schema

SELECT DATABASE() ใช้ทำอะไร

ยืนยันว่า Connection กำลังเลือก Database ไหน

oxmysql ต้อง Start ก่อน Resource อื่นไหม

ต้อง Start ก่อน Resources ที่พึ่ง Database

ใส่ Wait(10000) แก้ Connection Failed ได้ไหม

ไม่ หาก Host, Password หรือ Database Configuration ผิด

mysql_debug ช่วย Connection Failed ไหม

ช่วย Debug Query หลัง Connection ได้มากกว่า ส่วน Connection Error ควรอ่าน Error จาก oxmysql โดยตรง

MariaDB หรือ MySQL

ทั้งคู่รองรับ แต่ Documentation oxmysql แนะนำ MariaDB เพื่อ Compatibility กับ FiveM Resources จำนวนมาก

สรุป FiveM Database Connection Failed แก้อย่างไร

วิธี Debug ที่เร็วที่สุดคือ อย่าเดา และแยกปัญหาตาม Error

ECONNREFUSED
→ Service / Host / Port
ETIMEDOUT
→ Network / Firewall
ENOTFOUND
→ DNS / Hostname
Access denied
→ User / Password / Host permission
Unknown database
→ Database Name
Unknown table / column
→ Schema ไม่ใช่ Connection

จากนั้นทดสอบด้วย Query ที่ง่ายที่สุด

local result =
    MySQL.scalar.await(
        'SELECT 1'
    )

ถ้าได้

1

แล้วตรวจต่อด้วย

local database =
    MySQL.scalar.await(
        'SELECT DATABASE()'
    )

เมื่อทั้งสองผ่าน จึงถือว่า Connection Layer พร้อมระดับหนึ่ง และค่อยไปตรวจ

Tables
Columns
Indexes
SQL
Framework migrations

ต่อ

Configuration ที่ดีควรมีลำดับ

set mysql_connection_string "mysql://user:password@host:3306/database"

ensure oxmysql

ensure my_core
ensure my_inventory
ensure my_garage

ไม่ควรเปิด Database Port กว้างเกินจำเป็น หรือใช้ root เพียงเพื่อทำให้ Error หาย

สำหรับ Developer ที่เรียน FiveM กับ comsiam หลักที่ควรจำคือ Error Database ต้องแก้จาก Layer ล่างขึ้นบน: Service → Network → Authentication → Database → Schema → Query → Application

และหลักจาก comsiam อีกข้อคือ ถ้า SELECT 1 ยังไม่ผ่าน อย่าเสียเวลาแก้ Garage, Inventory หรือ Framework เพราะระบบยังไปไม่ถึงระดับ Application Query เลย

หัวข้อถัดไปคือ FiveM SQL Error และ Slow Query แก้อย่างไร ซึ่งจะต่อจาก Connection โดยตรงและเจาะ Unknown column, Table doesn't exist, SQL Syntax Error, Duplicate Entry, Data Too Long, Lock/Transaction, N+1 Query, Index และวิธีลด Query ที่ทำให้ Server ช้า

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด