oxmysql เชื่อม Database ไม่ได้ แก้อย่างไร รวมวิธีแก้ Connection Error ใน FiveM

ปัญหา oxmysql เชื่อม Database ไม่ได้ เป็นหนึ่งในสาเหตุที่ทำให้ FiveM Server เปิดขึ้นมาแล้วหลายระบบใช้งานไม่ได้พร้อมกัน เช่น Character โหลดไม่ได้, เงินไม่มา, Inventory ไม่บันทึก, รถหาย หรือ Framework Start แล้ว Error

Error ที่พบบ่อย ได้แก่

Unable to establish a connection to the database
Access denied for user
ECONNREFUSED
Unknown database
mysql_connection_string structure was invalid

หรือ

Connection timed out

วิธีแก้ที่ถูกต้องคืออย่าเริ่มจาก Framework แต่ให้ตรวจจาก Database Layer ก่อน

MariaDB
↓
Network / Port
↓
Database User
↓
Privileges
↓
mysql_connection_string
↓
oxmysql
↓
Framework
↓
Scripts

① oxmysql เชื่อม Database ไม่ได้เกิดจากอะไร

สาเหตุหลักมักอยู่ในกลุ่มต่อไปนี้

MariaDB ไม่ได้เปิด
Host ผิด
Port ผิด
Username ผิด
Password ผิด
Database ไม่มี
User ไม่มีสิทธิ์
User@Host ไม่ตรง
Connection String ผิด
Password มีอักขระพิเศษ
Firewall บล็อก
Database ไม่รับ Remote Connection

จึงไม่ควร Reinstall oxmysql เป็นอย่างแรก

② ดู Error ของ oxmysql ก่อน

เมื่อเปิด Server ให้ดู Console ตรง

script:oxmysql

Error ตรงนี้มีประโยชน์มากเพราะมักบอกประเภทปัญหาชัดเจน

ตัวอย่าง

ECONNREFUSED 127.0.0.1:3306

หมายถึง Connection ไปยัง Host/Port ไม่สำเร็จ

แต่

Access denied for user

หมายถึงไปถึง Database Server แล้ว แต่ Authentication ไม่ผ่าน

สองปัญหานี้ต้องแก้คนละจุด

③ แยก Error ให้ถูกก่อนแก้

จำง่าย ๆ

Connection refused

ยังเข้า Database Server ไม่ได้

Access denied

เข้า Database Server ถึงแล้ว
แต่ User/Password/Host/Permission ไม่ผ่าน

Unknown database

เข้า Server ได้
แต่ Database ที่ขอไม่มี

Unknown table

เข้า Database ได้
แต่ Table ไม่มี

Unknown column

Table มี
แต่ Schema ไม่ตรง

การแยกระดับนี้ช่วยลดเวลาหาปัญหาอย่างมาก

④ ตรวจ MariaDB ก่อน

ก่อนดู FiveM ให้ยืนยันว่า MariaDB ทำงานอยู่จริง

บน Linux สามารถตรวจ Service ตามระบบที่ใช้

แนวคิดคือ

MariaDB Service
=
Running

ถ้า MariaDB ไม่ได้ Start ต่อให้ Connection String ถูกทุกตัว oxmysql ก็เชื่อมไม่ได้

⑤ Port Database ปกติคืออะไร

โดยทั่วไป MariaDB/MySQL ใช้

3306

แต่ Hosting Provider หรือ Database Server ของคุณอาจใช้ Port อื่น

ถ้า Provider ให้

Port = 3307

Connection String ก็ต้องใช้

3307

ไม่ใช่ 3306

⑥ ECONNREFUSED คืออะไร

ตัวอย่าง

connect ECONNREFUSED 127.0.0.1:3306

หมายความว่า oxmysql พยายาม Connect ไป

Host: 127.0.0.1
Port: 3306

แต่ไม่มี Service ตอบรับ หรือ Connection ถูกปฏิเสธ

จุดที่ต้องตรวจคือ

MariaDB Running?
Port ถูก?
Host ถูก?
Firewall?
Database ฟัง TCP อยู่หรือไม่?

⑦ อย่าแก้ Username ก่อนถ้า ECONNREFUSED

ถ้าเป็น

ECONNREFUSED

ปัญหายังไม่ถึงขั้นตรวจ Username/Password

เพราะ Network Connection ยังไม่สำเร็จ

ดังนั้นลำดับที่ถูกคือ

Host
↓
Port
↓
Database Service
↓
Firewall

ก่อน Authentication

⑧ 127.0.0.1 กับ localhost เหมือนกันไหม

ในหลาย Environment ใช้งานคล้ายกัน แต่ไม่ควรคิดว่าเหมือนกันทุกกรณี

127.0.0.1

บังคับไปยัง Local IPv4/TCP ได้ชัดเจนกว่าในหลาย Setup

ส่วน

localhost

Database Client บาง Environment อาจมีพฤติกรรมเกี่ยวกับ Local Socket ต่างออกไป

สำหรับ FiveM + Database อยู่เครื่องเดียวกัน การใช้

127.0.0.1

มักทำให้ TCP Connection ชัดเจน

⑨ Database อยู่คนละเครื่องใช้ 127.0.0.1 ไม่ได้

ถ้า FXServer อยู่

Server A

แต่ MariaDB อยู่

Server B

การตั้ง

127.0.0.1

จาก Server A หมายถึง Server A เอง

ไม่ใช่ Server B

ต้องใช้

Private IP
Public IP
หรือ Hostname

ของ Database Server ตาม Network Architecture

⑩ Remote Database ต้องตรวจ Firewall

ถ้า FXServer กับ Database อยู่คนละเครื่อง

ต้องตรวจอย่างน้อย

Firewall ของ Database Server
Cloud Firewall
Security Group
Hosting Firewall
MariaDB Bind Address
Database User Host

Port Database ไม่ควรถูกเปิดให้ Internet ทั้งโลกโดยไม่มีเหตุผล

ควร Allow เฉพาะ Source IP ที่ต้องใช้เมื่อทำได้

⑪ Connection timeout ต่างจาก refused อย่างไร

ถ้าเป็น

Connection timed out

มักหมายถึง Request ถูกส่งไป แต่ไม่มี Response ในเวลาที่กำหนด

สาเหตุอาจเป็น

Firewall Drop
Routing
Host ผิด
Network Problem
Database Server ไม่ตอบ

ส่วน ECONNREFUSED มักหมายถึงปลายทางตอบกลับว่าพอร์ตนั้นไม่รับ Connection

⑫ ทดสอบ Database นอก FiveM ก่อน

นี่เป็นขั้นตอนที่สำคัญมาก

ถ้าเครื่อง FXServer สามารถใช้ MariaDB Client ให้ลองเชื่อมจากเครื่องเดียวกับ FXServer

ตัวอย่างแนวคิด

FXServer Machine
↓
MariaDB Client
↓
Database Server

หาก Client ธรรมดาก็ Connect ไม่ได้ ปัญหาไม่ได้อยู่ที่ oxmysql

ให้แก้ Database/Network ก่อน

⑬ Access denied for user คืออะไร

Error เช่น

Access denied for user 'fivem'@'localhost'

หมายถึง Connection ไปถึง MariaDB แล้ว แต่ Authentication ไม่ผ่าน

MariaDB ระบุสาเหตุหลักได้แก่

Username/Password ไม่ตรง
Account ไม่มี
Account ไม่มีสิทธิ์
User@Host ไม่ตรง

จึงต้องตรวจ Account ใน Database

⑭ MariaDB User ไม่ได้มีแค่ Username

MariaDB ใช้แนวคิด

'user'@'host'

ดังนั้น

'fivem'@'localhost'

กับ

'fivem'@'%'

หรือ

'fivem'@'192.168.1.10'

สามารถเป็นคนละ Account Context

นี่เป็นสาเหตุสำคัญของ Error ที่หลายคนคิดว่า Password ถูกแต่ยัง Access Denied

⑮ localhost กับ % ต่างกันอย่างไร

ตัวอย่าง

CREATE USER 'fivem'@'localhost'
IDENTIFIED BY 'StrongPassword';

หมายถึง Account สำหรับ Connection จาก Local Host ตาม MariaDB Rules

ส่วน

CREATE USER 'fivem'@'%'
IDENTIFIED BY 'StrongPassword';

ใช้ Wildcard Host

แต่ Production ไม่ควรใช้ % โดยอัตโนมัติเพียงเพราะแก้ง่าย

ถ้ารู้ Source Host/IP ควรจำกัดให้เหมาะสมกว่า

⑯ วิธีดู User และ Host

สามารถตรวจ Account ที่มีอยู่

SELECT User, Host
FROM mysql.user
WHERE User = 'fivem';

บน MariaDB รุ่นปัจจุบัน Privilege Internals ใช้ mysql.global_priv เป็นโครงสร้างหลัก แต่ View/Compatibility ของ mysql.user ยังพบได้ในงาน Administration

เป้าหมายคือดูว่า Account ที่คุณคิดว่ามีอยู่ตรงกับ Host ที่ Connect จริงหรือไม่

⑰ Error 1045 คืออะไร

MariaDB Error

1045
Access denied for user

เกี่ยวข้องกับ Authentication/Privileges

ถ้า Password ถูกแล้ว ให้ตรวจต่อ

User@Host
Authentication Plugin
Database Privileges

โดยเฉพาะ Linux ที่ root อาจใช้ Socket Authentication

⑱ ทำไม root Password ถูกแต่ oxmysql เข้าไม่ได้

MariaDB บน Linux รุ่นใหม่จำนวนมากใช้

unix_socket

สำหรับ root@localhost

หมายความว่า root ถูกออกแบบให้ Login ผ่าน OS Identity เช่น

sudo mariadb

ไม่ใช่ให้ Applications อย่าง FXServer Login ด้วย Password แบบเดียวกันเสมอไป

ทางที่ดีกว่าคือสร้าง Dedicated Database User สำหรับ FiveM

⑲ อย่าใช้ root เป็นวิธีแก้ถาวร

ถ้า

root

Login ผ่าน Terminal ได้ แต่ oxmysql ไม่ได้

อย่ารีบเปลี่ยน Root Security ทั้ง Server เพียงเพื่อ FiveM

ให้สร้าง

fivem_server

แทน

แล้วกำหนด Password และ Privileges ที่เหมาะสม

⑳ สร้าง FiveM Database User

ตัวอย่าง

CREATE USER 'fivem_server'@'localhost'
IDENTIFIED BY 'StrongPassword';

จากนั้น

GRANT ALL PRIVILEGES
ON fivem.*
TO 'fivem_server'@'localhost';

หลักคือให้ User เข้าถึงเฉพาะ Database ที่ FiveM ใช้

㉑ Access denied to database ต่างจาก Login Error

Error ประเภท

Access denied for user ... to database 'fivem'

อาจหมายความว่า User Login ได้ แต่ไม่มี Database-level Privileges

ตรวจ

SHOW GRANTS FOR 'fivem_server'@'localhost';

ว่ามีสิทธิ์กับ Database ที่ต้องการหรือไม่

㉒ GRANT ควรตรง Database Name

ถ้า Database ชื่อ

fivem_prod

แต่ Grant

GRANT ALL PRIVILEGES
ON fivem.*

User ก็ไม่ได้รับสิทธิ์ใน

fivem_prod

ต้องให้ชื่อ Database ตรง

㉓ Unknown database คืออะไร

ถ้า Error

Unknown database 'fivem'

แปลว่า Database Server ทำงานและ Connection ไปถึงแล้ว แต่ไม่มี Database ชื่อนั้น

ตรวจด้วย

SHOW DATABASES;

ถ้าชื่อจริงคือ

fivemserver

Connection String ก็ต้องใช้ชื่อนั้น

㉔ สร้าง Database ถ้ายังไม่มี

ตัวอย่าง

CREATE DATABASE fivem
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

จากนั้น Import SQL ของ Framework/Resource ที่ใช้

อย่าสร้าง Tables เองแบบเดา หาก Framework มี Official Schema อยู่แล้ว

㉕ mysql_connection_string ต้องอยู่ตรงไหน

ใน server.cfg

และต้องอยู่ก่อน Resource ที่ต้องใช้ Database

ตัวอย่าง

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

ensure oxmysql
ensure ox_lib
ensure qbx_core

ไม่ควรวาง Connection String หลัง ensure oxmysql

㉖ ใช้ set ไม่ใช่ setr

ใช้

set mysql_connection_string "..."

ไม่ใช่

setr mysql_connection_string "..."

เพราะ Database Credential ไม่ควรถูก Replicate ไป Client

นี่เป็นทั้งเรื่อง Configuration และ Security

㉗ Connection String แบบ URI

รูปแบบ

mysql://USERNAME:PASSWORD@HOST:PORT/DATABASE

ตัวอย่าง

set mysql_connection_string "mysql://fivem_server:MyPassword@127.0.0.1:3306/fivem"

ตรวจทุกส่วนให้ตรง

Username
Password
Host
Port
Database

㉘ Connection String แบบ Key/Value

อีกแบบคือ

set mysql_connection_string "user=fivem_server;password=MyPassword;host=127.0.0.1;port=3306;database=fivem"

ถ้า URI Format มีปัญหากับ Password สามารถลอง Format นี้ได้

Current oxmysql รองรับทั้งสองรูปแบบ

㉙ Invalid connection string แก้อย่างไร

ถ้า Error ว่า Structure ของ

mysql_connection_string

ไม่ถูกต้อง ให้ตรวจ

Quote
:
@
/
;
=
Port
Database Name

ก่อน

บางครั้ง Character เพียงตัวเดียวใน Password ทำให้ Parser แยกค่าผิด

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

Current oxmysql Documentation เตือนเกี่ยวกับอักขระอย่าง

;
,
/
?
:
@
&
=
+
$
#

เนื่องจากบางตัวมีความหมายใน Connection String Format

ถ้า Connection String ที่ดูถูกต้องแต่ Parse ไม่ผ่าน ให้

เปลี่ยน Format

หรือใช้ Password ที่ไม่ชน Reserved Characters ตามคำแนะนำของโครงการ

㉛ ตัวอย่าง Password ที่ทำให้ URI สับสน

สมมติ

MyPass@2026

แล้วเขียน

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

Parser ต้องแยกว่า @ ไหนเป็นส่วนของ Password และ @ ไหนเป็น Separator

นี่เป็นเหตุผลที่ Connection String มี Rules ของมัน

㉜ ตรวจ Config ซ้ำซ้อน

ค้นหาทั้ง Server ว่ามี

mysql_connection_string

หลายจุดหรือไม่

เช่น

server.cfg
database.cfg
resources.cfg

แล้วมี

exec database.cfg

เข้ามา Override ค่า

คุณอาจแก้ server.cfg ถูกแล้ว แต่ File ภายหลังเปลี่ยนกลับเป็น Connection String เก่า

㉝ ตรวจลำดับ exec

ตัวอย่าง

set mysql_connection_string "NEW"

exec old_database.cfg

แต่ old_database.cfg มี

set mysql_connection_string "OLD"

ค่า Effective Configuration อาจไม่ใช่สิ่งที่เห็นในบรรทัดแรก

Production Server ควรมี Source of Truth ของ Database Configuration เพียงแห่งเดียว

㉞ อย่าโพสต์ Connection String ตอนขอความช่วยเหลือ

หากต้องส่ง Console Screenshot ให้ซ่อน

Password
Database Host
Username
Tokens
License Key

อย่างน้อย

ถ้าเคยเปิดเผย Password จริงแล้วควร Rotate Credential

ไม่ใช่เพียงลบข้อความออกภายหลัง

㉟ oxmysql Folder ต้องชื่อถูก

ต้องเป็น

oxmysql

เพราะ Scripts อาจเรียก

@oxmysql/lib/MySQL.lua

และ

exports.oxmysql

ถ้า Rename เป็น

oxmysql_new

อาจเกิด Error คนละแบบกับ Database Connection

㊱ Start oxmysql ก่อน Framework

ตัวอย่าง Qbox

ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_target
ensure ox_inventory

ESX

ensure oxmysql
ensure es_extended

QBCore

ensure oxmysql
ensure qb-core

Database Resource ต้องพร้อมก่อน Framework ที่ Query Database

㊲ Framework Error อาจเป็นผลจาก oxmysql

ถ้าเห็น

Player data not found
Database query failed
Character loading failed

จาก Framework พร้อมกับ oxmysql Connection Error

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

Architecture คือ

oxmysql พัง
↓
Framework Query ไม่ได้
↓
Player Data พัง

ต้องแก้ฐานก่อน

㊳ วิธีพิสูจน์ว่า oxmysql เชื่อมสำเร็จ

หลังแก้ Connection แล้วทดสอบ Query ง่าย ๆ

ตัวอย่าง Resource

local result = MySQL.single.await(
    'SELECT 1 AS success'
)

if result and result.success == 1 then
    print('Database connection OK')
end

ถ้า SELECT 1 ผ่าน แปลว่า Connection + Query Pipeline พื้นฐานทำงานแล้ว

㊴ ถ้า SELECT 1 ผ่านแต่ Framework ยังพัง

นี่เป็นข่าวดี เพราะช่วยแยก Root Cause

MariaDB
✓

oxmysql
✓

Query
✓

ดังนั้นให้ตรวจต่อ

Framework SQL Import
Tables
Columns
Schema Version
Framework Config

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

㊵ Unknown table หลัง Connection สำเร็จ

ตัวอย่าง

Table 'fivem.players' doesn't exist

นี่ไม่ใช่ Connection Error

หมายความว่า

Database Connected
↓
Query ทำงาน
↓
Table ไม่มี

ให้ Import SQL ของ Framework หรือใช้ Database ที่ถูกต้อง

㊶ Unknown column หลัง Connection สำเร็จ

เช่น

Unknown column 'citizenid'

มักเป็น Schema/Framework Version Problem

ตัวอย่าง

Qbox/QBCore Script
↓
Query citizenid

แต่ Database เป็น ESX Schema

หรือ Migration ยังไม่ครบ

อย่าเพิ่ม Column แบบสุ่มเพื่อให้ Error หาย

㊷ Database ผิดตัวเป็นปัญหาที่เจอบ่อย

บาง Server มี

fivem_test
fivem_dev
fivem_prod

แต่ Connection String ชี้ไป

fivem_test

ขณะที่คุณเปิด phpMyAdmin ดู

fivem_prod

จึงเห็น Tables ครบใน UI แต่ FXServer บอก Table ไม่มี

ตรวจ Database Name ใน Connection String ทุกครั้ง

㊸ Hosting Database ใช้ Host อะไร

ถ้าใช้ Game Hosting/Database Hosting อย่าคาดว่า Host คือ

localhost

เสมอ

Provider อาจให้

mysql.example-host.com

พร้อม

Port
Username
Database
Password

ต้องใช้ค่าที่ Provider ให้ตรงทั้งหมด

㊹ อย่าใช้ Public IP ถ้ามี Private Network

ถ้า FXServer และ Database อยู่ใน Infrastructure เดียวกันและ Hosting รองรับ Private Network

การใช้

Private IP

มักเหมาะกว่าเปิด Database ไป Public Internet

ข้อดีคือ

ลด Exposure
ลด Network Path
ควบคุม Firewall ง่ายขึ้น

ขึ้นกับ Hosting Architecture

㊺ Remote MariaDB ต้อง Bind ให้ถูก

Database Server อาจตั้งให้รับเฉพาะ Local Connection

ถ้า FXServer อยู่เครื่องอื่น ต่อให้ Firewall เปิดก็ยังอาจเข้าไม่ได้

ต้องตรวจ MariaDB Network Configuration เช่น

bind-address

ให้ตรงกับ Deployment

แต่ไม่ควรเปลี่ยนเป็นรับทุก Interface โดยไม่มี Firewall Protection

㊻ เปิด 3306 ให้ทุกคนไม่ใช่วิธีแก้ที่ดี

การตั้ง Firewall เป็น

0.0.0.0/0
→ 3306 allow

เพียงเพื่อให้ FiveM Connect ได้ เป็นการเพิ่ม Attack Surface โดยไม่จำเป็น

ควร Allow เฉพาะ

FXServer IP

หรือ Private Network ที่เกี่ยวข้องเมื่อทำได้

㊼ Port Forwarding จำเป็นไหม

ถ้า Database อยู่หลัง NAT และ FXServer อยู่นอก Network อาจต้องมี Network Routing/Port Forwarding ตาม Architecture

แต่ทางเลือกที่ดีกว่าในหลาย Production Setup คือ

Private Network
VPN
Cloud Internal Network

แทนการเปิด MariaDB Port สู่ Internet

㊽ Database User ต้องอนุญาต Remote Host

แม้ Firewall ผ่าน หาก User มีแค่

'fivem'@'localhost'

แต่ FXServer Connect จาก

10.0.0.20

Authentication อาจไม่ตรง Account

จึงต้องมี User/Host Rule ที่รองรับ Source Connection จริง

นี่เป็นคนละเรื่องกับ Firewall

㊾ วิธีแยก Firewall กับ User Error

ถ้าเป็น

timeout
ECONNREFUSED

ให้ดู Network/Service ก่อน

ถ้าเป็น

Access denied for user

แสดงว่าการสื่อสารกับ MariaDB ไปถึงขั้น Authentication แล้ว

จึงควรดู User/Password/Host/Privileges

อ่าน Error Type ให้ถูกจะประหยัดเวลามาก

㊿ Too many connections คืออะไร

ถ้า MariaDB ถึง Connection Limit อาจปฏิเสธ Connections ใหม่

ต้องตรวจ

จำนวน Connections
Database Workload
Connection Pool
Server Resources

ไม่ควรแก้ด้วยการเพิ่ม Limit สูงมากทันทีโดยไม่หาว่าทำไม Connections สูง

Resource ที่ Query/Connection ผิดพฤติกรรมอาจเป็นต้นเหตุ

51. Connection reset คืออะไร

Error เช่น

ECONNRESET

หมายถึง Connection ถูกตัดระหว่างการสื่อสาร

สาเหตุอาจมาจาก

Database Restart
Network Instability
Proxy
Firewall
Resource Exhaustion
Hosting Problem

ถ้าเกิดเป็นครั้งเดียวระหว่าง Restart Database อาจไม่ผิดปกติ

แต่ถ้าเกิดต่อเนื่องต้องตรวจ Infrastructure

52. Database Server Restart ทำให้ FiveM Error ได้

แน่นอน

ถ้า MariaDB Restart ขณะที่ FXServer ทำงาน

Resources ที่กำลัง Query อาจเห็น Connection Errors ชั่วคราว

Production ควรวางแผน Maintenance ของ

FXServer
Database

ร่วมกัน

ไม่ควร Restart Database แบบสุ่มระหว่าง Peak Players

53. DNS Hostname มีปัญหาได้

ถ้า Connection String ใช้

db.example.com

แต่ DNS Resolution มีปัญหา oxmysql ก็เชื่อมไม่ได้

สามารถแยกทดสอบด้วยการตรวจว่าเครื่อง FXServer Resolve Hostname นั้นได้หรือไม่

ถ้า IP Connect ได้แต่ Hostname ไม่ได้ ปัญหาอาจอยู่ DNS ไม่ใช่ MariaDB

54. Database อยู่ Online แต่ Ping ไม่ได้เสมอไป

อย่าใช้

ping

เพียงอย่างเดียวเป็นหลักฐานว่า Database ใช้ไม่ได้

Server บางแห่ง Block ICMP แต่ TCP Port 3306 ยังทำงาน

สิ่งที่ต้องทดสอบจริงคือ

TCP Connection
+
MariaDB Authentication

จากเครื่อง FXServer

55. ทดสอบ MariaDB Client จาก FXServer Machine

นี่เป็น Test ที่มีประโยชน์มาก

แนวคิด

mariadb client
Host = Database Host
Port = Database Port
User = FiveM User
Database = FiveM Database

ใช้ Credential ชุดเดียวกับ oxmysql

ถ้า Login ผ่าน

Network ✓
User ✓
Password ✓
Privileges ขั้นต้น ✓

แล้วค่อยกลับมาตรวจ Connection String ของ FiveM

56. ถ้า MariaDB Client ผ่านแต่ oxmysql ไม่ผ่าน

ให้สงสัย

Connection String
Special Characters
Config Override
oxmysql Version
Resource Package

เพราะ Infrastructure พื้นฐานพิสูจน์แล้วว่า Connect ได้

ขั้นนี้ช่วยแยกปัญหาได้ชัดมาก

57. ถ้าทั้ง Client และ oxmysql ไม่ผ่าน

ปัญหาอยู่ด้าน

Database
Network
Authentication
Privileges

มากกว่า FiveM

อย่า Reinstall Framework หรือ Inventory

58. mysql_connection_string structure was invalid

Current oxmysql Source มี Parser สำหรับ URI และ Key/Value Format

ถ้า Structure ไม่ถูกต้องจะ Throw Error ว่า

mysql_connection_string structure was invalid

ให้ตรวจ Connection String ทั้งเส้น

โดยเฉพาะ

Special Characters
Missing Host
Missing Slash
Port
Quotation Marks

59. Default Connection String มีหรือไม่

Current Source มี Fallback ประมาณ

mysql://root@localhost

หากไม่มี mysql_connection_string

แต่ Production ไม่ควรพึ่ง Default นี้

ควรกำหนด Connection String ของตัวเองให้ชัดเจนเสมอ

60. DB_CONNECTION Environment Variable

Current Source ยังสามารถอ่าน

DB_CONNECTION

จาก Environment ได้หาก Convar ไม่มี

ดังนั้น Infrastructure ขั้นสูงอาจจัด Credential ผ่าน Environment Configuration

แต่ถ้าใช้ server.cfg ปกติ ให้ตั้ง mysql_connection_string อย่างชัดเจนจะ Debug ง่ายกว่า

เปิด mysql_debug ช่วยได้ไหม

ช่วยเมื่อ Connection สำเร็จแล้วและต้องการดู Queries

ตัวอย่าง

set mysql_debug true

แต่ถ้า Database ยัง

ECONNREFUSED

Debug Queries ไม่ได้แก้ Network

ใช้ Tool ให้ตรงกับ Layer ที่มีปัญหา

mysql_debug ไม่ควรเปิดตลอด Production

เมื่อ Server มี Scripts จำนวนมาก Logging อาจเยอะมาก

ใช้เมื่อต้อง

หา Query Error
ดู Resource ที่ส่ง Query
วิเคราะห์ SQL

แล้วปิดหรือลด Scope หลังแก้เสร็จ

Slow Query ไม่ใช่ Connection Error

ข้อความ

query took xxx ms

หมายความว่า Database เชื่อมได้และ Query ทำงาน แต่ใช้เวลานาน

ต่างจาก

Unable to establish connection

อย่าแก้สองปัญหานี้แบบเดียวกัน

ถ้า Query ช้าให้ตรวจอะไร

ตรวจ

SQL Query
Indexes
จำนวน Rows
SELECT *
Database CPU/RAM/Disk
Server Hitch

ไม่ใช่ Username/Password

Connection ผ่านไปแล้ว

อย่าลบ oxmysql แล้วลงใหม่ทุกครั้ง

ถ้า Error คือ

Access denied
Unknown database
ECONNREFUSED

การ Reinstall Resource เดิมมักไม่ช่วย

เพราะ Root Cause อยู่

Database
Network
Credential

ไม่ใช่ Files ของ oxmysql

อย่าล้าง FiveM Cache เพื่อแก้ Access denied

Cache ไม่มีความเกี่ยวข้องกับ

MariaDB Username
Password
Privileges

ถ้า Console บอก Access Denied ให้แก้ Authentication

การ Clear Cache มีแต่ทำให้เสียเวลาในกรณีนี้

อย่าปิด Firewall ทั้งเครื่องเพื่อทดสอบแบบถาวร

การ Disable Firewall ทั้ง Server อาจช่วยพิสูจน์บางอย่างชั่วคราวใน Environment ที่ควบคุมได้ แต่ไม่ควรเป็น Production Fix

ทางที่ถูกคือสร้าง

Specific Allow Rule

ให้เฉพาะ Traffic ที่ต้องการ

อย่าใช้ % โดยไม่จำเป็น

MariaDB Account เช่น

'fivem'@'%'

อนุญาต Host Scope กว้าง

ถ้า FXServer มี IP คงที่ ควรพิจารณาจำกัด User Host ให้ตรงกับ Architecture

Defense in Depth ควรมีทั้ง

Firewall
+
Database User Host
+
Password
+
Limited Privileges

Server.cfg ตัวอย่างเครื่องเดียวกัน

set mysql_connection_string "mysql://fivem_server:StrongPassword@127.0.0.1:3306/fivem"

ensure oxmysql
ensure ox_lib
ensure qbx_core

เหมาะเมื่อ

FXServer
และ
MariaDB

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

Server.cfg ตัวอย่าง Database แยกเครื่อง

set mysql_connection_string "mysql://fivem_server:StrongPassword@10.0.0.20:3306/fivem"

ensure oxmysql

ในกรณีนี้ต้องให้

10.0.0.20

รับ Connection จาก FXServer จริง

พร้อม Firewall/Privileges ที่เหมาะสม

วิธี Debug แบบเร็วที่สุด

ใช้ Checklist นี้

① อ่าน oxmysql Error แรก

② ตรวจ MariaDB Running

③ ตรวจ Host

④ ตรวจ Port

⑤ ทดสอบ TCP/DB Client จากเครื่อง FXServer

⑥ ตรวจ Database Name

⑦ ตรวจ Username

⑧ ตรวจ Password

⑨ ตรวจ User@Host

⑩ ตรวจ GRANT

⑪ ตรวจ mysql_connection_string

⑫ ตรวจ Special Characters

⑬ ตรวจ Config ซ้ำ/exec

⑭ Start oxmysql

⑮ ทดสอบ SELECT 1

⑯ ถ้าผ่าน ค่อย Start Framework

⑰ ตรวจ Framework Schema

ตาราง Error oxmysql และวิธีแก้

Errorจุดที่ควรตรวจแนวทางแก้
ECONNREFUSEDService/Host/Portเปิด MariaDB และตรวจ Address/Port
TimeoutFirewall/Networkตรวจ Routing และ Firewall
Access deniedUser/Password/Hostตรวจ MariaDB Account
Error 1044Database PrivilegesGRANT สิทธิ์ Database
Error 1045Authenticationตรวจ User/Password/Host
Unknown databaseDatabase Nameสร้างหรือแก้ชื่อ Database
Unknown tableSchemaImport SQL ที่ถูกต้อง
Unknown columnSchema Versionตรวจ Framework/Migration
Invalid connection stringSyntaxแก้ URI/Key-value format
Query ช้าSQL/IndexOptimize Query/Schema
ECONNRESETNetwork/DB restartตรวจ Infrastructure

Checklist สำหรับ Server เครื่องเดียว

ถ้า MariaDB และ FXServer อยู่เครื่องเดียวกัน ให้ตรวจ

MariaDB Service = Running
Host = 127.0.0.1
Port = ถูก
Database = มี
User = มี
Password = ถูก
User@localhost = ถูก
Privileges = มี
Connection String = ถูก
oxmysql = Start

กรณีนี้ไม่ควรไปเปิด Port 3306 ออก Internet เพียงเพื่อให้ Local FXServer เชื่อม Database

Checklist สำหรับ Remote Database

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

Database Bind Address
Firewall
Private/Public IP
Database User Host
Network Routing
Cloud Security Group
Hosting Rules

และทดสอบ Connection จาก เครื่อง FXServer จริง

ไม่ใช่ทดสอบจาก Laptop แล้วสรุปว่า Server เชื่อมได้

ถ้าใช้ Hosting Provider

ใช้ค่าที่ Provider ระบุ

DB Host
DB Port
DB Username
DB Password
DB Name

อย่าเดาว่า

Host = localhost
Port = 3306

เพราะ Managed Hosting มักใช้ Hostname/Port ของตัวเอง

ถ้า Error เกิดหลังเปลี่ยน Password

ตรวจทุกจุดที่เก็บ Credential

เช่น

server.cfg
database.cfg
Environment Variable
txAdmin Recipe Config
Hosting Panel

ถ้า Database เปลี่ยน Password แต่ FiveM ยังใช้ Password เก่า ย่อม Access Denied

ถ้า Error เกิดหลังย้าย Server

ตรวจ

Database Host เปลี่ยนไหม
FXServer IP เปลี่ยนไหม
Firewall Allow List เปลี่ยนไหม
MariaDB User Host ตรงไหม
Database ถูก Restore ไหม

โดยเฉพาะ User ที่จำกัด Source IP

ย้าย FXServer แล้ว IP เปลี่ยนอาจทำให้ Authentication ไม่ผ่านทันที

ถ้า Error เกิดหลังย้าย Database

ตรวจ

Hostname
Port
Database Name
User
Password
Privileges
Bind Address
Firewall

ทั้งหมดใหม่

อย่าคิดว่า Copy Database Files แล้ว Connection Configuration เดิมจะใช้ได้เสมอ

ถ้า oxmysql ต่อได้แต่ Player เข้าไม่ได้

ตอนนี้ต้องขยับ Debug Layer ขึ้นไป

Database ✓
oxmysql ✓
↓
Framework

ตรวจ

Framework SQL
Tables
Columns
Migrations
Character Data

ไม่ต้องกลับไปแก้ Password ถ้า SELECT 1 ผ่านแล้ว

Production ควรใช้ Database User แยก

โครงสร้างที่ดี

root/admin
→ ใช้บริหาร Database

fivem_server
→ FXServer

และ fivem_server มีสิทธิ์เฉพาะ Database ของ Server

ช่วยลดผลกระทบหาก Credential Application รั่ว

Production ควร Backup ก่อนแก้ Permissions

ก่อนแก้

Users
Privileges
Schema
Database

ครั้งใหญ่ ควรมี Backup

โดยเฉพาะถ้ากำลัง Migration Framework หรือ Inventory พร้อมกัน

อย่าทำ Database Changes หลายอย่างโดยไม่มีจุดย้อนกลับ

อย่าใช้ Error Message ที่มี Password เต็ม ๆ

เมื่อส่ง Log ให้ Developer ตรวจ ให้ Redact

password
tokens
API keys
license keys

Current oxmysql เองมีการปิดบัง Password ใน Error Output บาง Context แต่คุณก็ควรตรวจ Screenshot ทุกครั้งก่อนโพสต์สาธารณะ

สรุป oxmysql เชื่อม Database ไม่ได้ แก้อย่างไร

เวลาพบว่า oxmysql เชื่อม Database ไม่ได้ ให้เริ่มจากแบ่งปัญหาออกเป็น Layer

MariaDB Service
↓
Network
↓
Host / Port
↓
User / Password
↓
User@Host / Privileges
↓
Database Name
↓
Connection String
↓
oxmysql
↓
Framework Schema

ถ้าเจอ

ECONNREFUSED

ให้ตรวจ MariaDB Service, Host, Port และ Firewall ก่อน

ถ้าเจอ

Access denied for user

แสดงว่า Connection ไปถึง MariaDB แล้ว ให้ตรวจ Username, Password, user@host และ Privileges

ถ้าเจอ

Unknown database

ให้ตรวจชื่อ Database

ถ้าเจอ

Unknown table

หรือ

Unknown column

Connection ทำงานแล้ว ปัญหาได้ขยับไปอยู่ Schema/Framework Layer ไม่ใช่ oxmysql Connection

Connection String ที่ถูกต้องต้องถูกกำหนดก่อน Start Resources และใช้

set mysql_connection_string "..."

ไม่ใช่ setr

นอกจากนี้ต้องระวังอักขระพิเศษใน Password เพราะ Current oxmysql Documentation ระบุว่าบาง Character มีความหมายหรือไม่รองรับใน Connection String บาง Format สามารถเปลี่ยนจาก URI ไปใช้ Key/Value Format เพื่อแยกปัญหาได้

แนวทางของ comsiam คือก่อนแตะ ESX, Qbox, QBCore หรือ Inventory ให้พิสูจน์ MariaDB → oxmysql ด้วย SELECT 1 ก่อน หาก Query ง่ายที่สุดยังไม่ผ่าน การแก้ Framework ด้านบนไม่มีประโยชน์

สำหรับ Production comsiam แนะนำให้ใช้ Dedicated Database User, จำกัด Host/Firewall ให้แคบที่สุดที่เหมาะสม และเก็บ Connection String ไว้เป็นความลับ เพราะ Database เป็นส่วนที่เก็บ Character, Money, Vehicles, Inventory และ Economy เกือบทั้งหมดของ FiveM Server

Comments

Popular posts from this blog

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

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

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