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 | จุดที่ควรตรวจ | แนวทางแก้ |
|---|---|---|
ECONNREFUSED | Service/Host/Port | เปิด MariaDB และตรวจ Address/Port |
| Timeout | Firewall/Network | ตรวจ Routing และ Firewall |
Access denied | User/Password/Host | ตรวจ MariaDB Account |
| Error 1044 | Database Privileges | GRANT สิทธิ์ Database |
| Error 1045 | Authentication | ตรวจ User/Password/Host |
Unknown database | Database Name | สร้างหรือแก้ชื่อ Database |
Unknown table | Schema | Import SQL ที่ถูกต้อง |
Unknown column | Schema Version | ตรวจ Framework/Migration |
| Invalid connection string | Syntax | แก้ URI/Key-value format |
| Query ช้า | SQL/Index | Optimize Query/Schema |
ECONNRESET | Network/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
Post a Comment