
หากคุณกำลังมองหาฐานข้อมูลที่ เสถียร รองรับ JSON, ฟังก์ชันขั้นสูง และทำ Transaction ได้แน่นกว่า MySQL คำตอบที่นักพัฒนาส่วนใหญ่นึกถึงก็คือ PostgreSQL ฐานข้อมูล Open Source ที่ใช้กันในระบบใหญ่ ๆ ทั้ง Discord, Instagram และ Apple iCloud
บทความนี้จะพาคุณติดตั้ง PostgreSQL บน VPS Ubuntu 22.04 ตั้งแต่ต้นจนใช้งานได้จริง สร้าง Database, สร้าง User, ตั้งรหัสผ่าน และอนุญาตให้แอปพลิเคชันภายนอกเชื่อมต่อได้อย่างปลอดภัย
สิ่งที่ต้องมีก่อน: VPS Ubuntu 20.04/22.04 ที่มี Root หรือ Sudo access, เข้าถึงได้ผ่าน SSH และ Firewall เปิด Port 22 (SSH) แล้ว
PostgreSQL คืออะไร ทำไมต้องใช้
PostgreSQL (อ่านว่า "โพสต์เกรส-คิว-เอล") เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบ Object-Relational (ORDBMS) ที่พัฒนามาตั้งแต่ปี 1986 จนถึงปัจจุบัน มีจุดเด่นเรื่อง ACID compliance ที่เคร่งครัด, รองรับ JSONB เก็บเอกสารแบบ NoSQL ในตารางเดียวกับข้อมูล Relational และมี Type system ที่ละเอียดกว่า MySQL อย่างชัดเจน
PostgreSQL vs MySQL ต่างกันอย่างไร
| หัวข้อ | PostgreSQL | MySQL |
|---|---|---|
| License | PostgreSQL License (BSD-like) | GPL + Commercial (Oracle) |
| ACID Compliance | เต็มรูปแบบทุก Engine | เฉพาะ InnoDB |
| JSON Support | JSONB (index ได้) | JSON (จำกัด) |
| Replication | Streaming, Logical | Master-Slave, Group |
| เหมาะกับ | Analytics, Data warehouse, GIS, แอปที่ต้อง Transaction แน่น | เว็บทั่วไป, WordPress, Read-heavy |
ขั้นที่ 1 — อัปเดตระบบและติดตั้ง PostgreSQL
เริ่มต้นด้วยการอัปเดต Package list และติดตั้ง PostgreSQL พร้อม contrib ที่รวมส่วนเสริมไว้ครบ:
sudo apt update && sudo apt upgrade -y sudo apt install postgresql postgresql-contrib -y
ตรวจสอบเวอร์ชันและสถานะ:
sudo systemctl status postgresql psql --version
ถ้าเห็น Active: active (exited) และเวอร์ชัน psql (PostgreSQL) 14.x หรือใหม่กว่า แสดงว่าติดตั้งสำเร็จ ตั้งให้ Autostart หลัง Reboot:
sudo systemctl enable postgresql
ขั้นที่ 2 — เข้าถึง psql ด้วย User postgres
หลังติดตั้ง PostgreSQL จะสร้าง Linux user ชื่อ postgres ขึ้นมาโดยอัตโนมัติ ใช้ user นี้เข้าสู่ Console:
sudo -i -u postgres psql
เมื่อเห็น Prompt postgres=# แสดงว่าเข้ามาที่ Console ของ PostgreSQL เรียบร้อยแล้ว ลองดู Database ที่มี:
\l
ออกจาก psql ด้วย \q และกลับเป็น user ปกติด้วย exit
ขั้นที่ 3 — สร้าง Database และ User ใหม่
สำหรับโปรดักชัน ไม่ควรใช้ user postgres ตรง ๆ ให้สร้าง user เฉพาะของแอปแทน เปิด psql อีกครั้ง:
sudo -u postgres psql
สร้าง user, database, และให้สิทธิ์:
-- สร้าง user พร้อมรหัสผ่าน CREATE USER myapp WITH PASSWORD 'StrongPassword123!'; -- สร้าง database โดยให้ owner เป็น user ข้างต้น CREATE DATABASE myapp_db OWNER myapp; -- ให้สิทธิ์เต็มกับ user นี้บน database GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp; \q
ทดสอบ Login ด้วย user ที่สร้างขึ้น:
psql -U myapp -d myapp_db -h 127.0.0.1 -W
ใส่รหัสผ่านที่ตั้งไว้ ถ้าเข้าได้ก็พร้อมใช้งานในแอปได้แล้ว
ขั้นที่ 4 — ตั้งค่าให้รับการเชื่อมต่อจากภายนอก
โดย default PostgreSQL จะรับเฉพาะ Connection จาก localhost เท่านั้น ถ้าต้องการให้แอปบนอีกเซิร์ฟเวอร์เชื่อมต่อได้ ต้องแก้ 2 ไฟล์
4.1 แก้ postgresql.conf
sudo nano /etc/postgresql/14/main/postgresql.conf
หา listen_addresses แล้วเปลี่ยนเป็น:
listen_addresses = '*'
4.2 แก้ pg_hba.conf อนุญาต IP ที่จะเข้ามาเชื่อม
sudo nano /etc/postgresql/14/main/pg_hba.conf
เพิ่มบรรทัดท้ายไฟล์ (เปลี่ยน 192.168.1.100/32 เป็น IP ของแอปจริง):
# TYPE DATABASE USER ADDRESS METHOD
host myapp_db myapp 192.168.1.100/32 scram-sha-256⚠️ ห้ามใช้ 0.0.0.0/0 เพราะจะเปิดให้ทุก IP บนอินเทอร์เน็ตเชื่อมต่อได้ — ระบุ IP ที่จำเป็นเท่านั้น และใช้ scram-sha-256 เป็นวิธีการ Authenticate แทน md5 ที่อ่อนกว่า
Restart PostgreSQL ให้ค่าใหม่มีผล:
sudo systemctl restart postgresql
4.3 เปิด Firewall
PostgreSQL ใช้ Port 5432 ถ้าใช้ UFW ให้อนุญาตเฉพาะ IP ที่ต้องการ:
sudo ufw allow from 192.168.1.100 to any port 5432
ขั้นที่ 5 — สำรองข้อมูลด้วย pg_dump
PostgreSQL มาพร้อมเครื่องมือสำรองข้อมูลในตัวชื่อ pg_dump ใช้สร้างไฟล์ SQL ของฐานข้อมูล:
sudo -u postgres pg_dump myapp_db > /backup/myapp_db_$(date +%F).sql
คืนค่าจากไฟล์ Backup:
sudo -u postgres psql myapp_db < /backup/myapp_db_2026-05-13.sql
เคล็ดลับ: ตั้ง cron job ให้รัน pg_dump ทุกวันตอนตี 3 แล้วส่งไฟล์ขึ้น S3 หรือ Cloud Storage จะปลอดภัยกว่าเก็บไว้บนเครื่องเดียวกัน
ขั้นที่ 6 — คำสั่ง psql พื้นฐานที่ต้องรู้
\l— แสดง database ทั้งหมด\c dbname— สลับไปใช้ database อื่น\dt— แสดงตารางใน database ปัจจุบัน\d tablename— แสดงโครงสร้างตาราง\du— แสดง user/role ทั้งหมด\q— ออกจาก psql
ติดตั้ง PostgreSQL บน Ubuntu VPS — ขั้นตอนแบบเจาะลึก
หากคุณเช่า VPS ใหม่จาก AsiaGB (Ubuntu 22.04, เริ่มต้น 500 บาท/เดือน) สิ่งแรกที่ควรทำหลัง SSH เข้าเครื่องคือเช็กว่ามี PostgreSQL เวอร์ชันใดอยู่ใน Repository ของ Ubuntu บางครั้งเวอร์ชันใน Repository มาตรฐานอาจเก่ากว่าเวอร์ชันล่าสุดหลายรุ่น ถ้าต้องการเวอร์ชันใหม่สุดให้เพิ่ม PostgreSQL Official APT Repository เข้าไปก่อน:
# เพิ่ม PostgreSQL official repository (ถ้าต้องการเวอร์ชันล่าสุด) sudo apt install -y postgresql-common sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh # จากนั้นติดตั้งตามปกติ sudo apt update sudo apt install -y postgresql postgresql-contrib
เมื่อติดตั้งเสร็จ Service จะถูกตั้งให้รันอัตโนมัติทันที ตรวจสอบว่า PostgreSQL เปิด Port 5432 ฟังอยู่จริงด้วยคำสั่ง:
sudo ss -tlnp | grep 5432
ถ้าเห็นบรรทัดที่ระบุ 127.0.0.1:5432 แสดงว่า PostgreSQL พร้อมรับการเชื่อมต่อจาก localhost แล้ว ขั้นตอนนี้สำคัญเพราะถ้า Port ไม่ขึ้นมา มักเกิดจาก Service ไม่ได้สตาร์ต หรือมี Process อื่นจองพอร์ตไว้ ลองดู Log ที่ /var/log/postgresql/ เพื่อหาสาเหตุ
หมายเหตุเรื่องเวอร์ชัน: Path ของไฟล์ตั้งค่า (เช่น /etc/postgresql/14/main/) จะเปลี่ยนเลขตามเวอร์ชันที่ติดตั้ง ถ้าใช้ PostgreSQL 16 ก็เปลี่ยนเป็น /etc/postgresql/16/main/ ตรวจสอบเลขเวอร์ชันด้วย ls /etc/postgresql/ ก่อนแก้ไฟล์เสมอ
สร้าง Database, User และจัดการสิทธิ์อย่างละเอียด
ในหัวข้อก่อนหน้าเราสร้าง User และ Database แบบรวบรัดผ่านคำสั่ง SQL ภายใน psql แล้ว แต่ PostgreSQL ยังมีเครื่องมือ Command-line ที่เรียกได้จาก Shell โดยตรงโดยไม่ต้องเข้า psql ก่อน ได้แก่ createuser และ createdb ซึ่งสะดวกเวลาเขียน Script อัตโนมัติ:
# สร้าง user แบบ interactive (จะถามสิทธิ์ทีละข้อ) sudo -u postgres createuser --interactive --pwprompt # สร้าง database พร้อมระบุ owner sudo -u postgres createdb -O myapp myapp_db
เรื่องสิทธิ์ (Privileges) ใน PostgreSQL มีรายละเอียดมากกว่าที่หลายคนคิด การ GRANT ALL PRIVILEGES ON DATABASE ให้สิทธิ์ระดับ "เชื่อมต่อและสร้าง Schema" เท่านั้น แต่ไม่ได้ครอบคลุมสิทธิ์บน ตารางที่ถูกสร้างขึ้นภายหลัง โดยอัตโนมัติ ตั้งแต่ PostgreSQL 15 เป็นต้นมา สิทธิ์บน Schema public ถูกจำกัดเข้มขึ้น คุณจึงต้องให้สิทธิ์บน Schema ด้วยอย่างชัดเจน:
sudo -u postgres psql -d myapp_db -- ให้ user เป็นเจ้าของ schema public GRANT ALL ON SCHEMA public TO myapp; -- ให้สิทธิ์บนตารางที่จะสร้างในอนาคตโดยอัตโนมัติ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myapp; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO myapp; \q
ตรวจสอบรายชื่อ Role และสิทธิ์ที่มีได้ด้วย \du ภายใน psql และถ้าต้องการดูสิทธิ์ของตารางแต่ละตัวให้ใช้ \dp tablename วิธีนี้ช่วยให้คุณ Debug ปัญหา "Permission denied for table" ที่พบบ่อยเวลาแอปเชื่อมต่อด้วย User ที่ไม่ใช่ Owner ได้รวดเร็วขึ้น
| คำสั่ง | ระดับสิทธิ์ | ครอบคลุม |
|---|---|---|
GRANT ALL ON DATABASE | Database | Connect, สร้าง Schema |
GRANT ALL ON SCHEMA public | Schema | สร้างตาราง/Object ใน schema |
GRANT ALL ON ALL TABLES | Table | ตารางที่มีอยู่ ณ ตอนนั้น |
ALTER DEFAULT PRIVILEGES | Future objects | ตารางที่จะสร้างในอนาคต |
ตั้งค่าความปลอดภัยและ Remote Access ให้รัดกุม
การเปิดให้ PostgreSQL รับการเชื่อมต่อจากภายนอกเป็นจุดที่เสี่ยงต่อความปลอดภัยมากที่สุด หากตั้งค่าไม่รอบคอบ Bot ที่สแกนหา Port 5432 ทั่วอินเทอร์เน็ตจะพยายาม Brute-force รหัสผ่านของคุณทันที กฎเหล็กคือ เปิดเฉพาะเท่าที่จำเป็น และซ้อนการป้องกันหลายชั้น (Defense in depth)
ใน postgresql.conf ถ้าแอปกับ Database อยู่คนละเครื่องในเครือข่ายภายใน (Private Network) ให้ระบุเฉพาะ IP ภายในแทนการใช้ '*' ที่ฟังทุก Interface:
# ฟังเฉพาะ private IP ของ VPS แทน '*' (ปลอดภัยกว่า)
listen_addresses = 'localhost,10.0.0.5'ใน pg_hba.conf ลำดับของบรรทัดมีความสำคัญ — PostgreSQL จะอ่านจากบนลงล่างและใช้บรรทัดแรกที่ตรงกับ Connection ทันที จึงควรวางกฎที่เฉพาะเจาะจง (IP เดียว) ไว้ก่อนกฎที่กว้างกว่า และใช้ scram-sha-256 เป็นวิธี Authenticate เสมอ:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host myapp_db myapp 10.0.0.10/32 scram-sha-256
host all all 127.0.0.1/32 scram-sha-256เพื่อความปลอดภัยขั้นสูง ควรเปิดใช้งาน SSL บน Connection ระหว่างแอปกับ Database เพื่อเข้ารหัสข้อมูลที่วิ่งผ่านเครือข่าย ตั้งค่าใน postgresql.conf:
ssl = on ssl_cert_file = '/etc/ssl/certs/server.crt' ssl_key_file = '/etc/ssl/private/server.key'
จากนั้นบังคับให้ Connection จากภายนอกต้องใช้ SSL โดยเปลี่ยน host เป็น hostssl ใน pg_hba.conf ฝั่งแอปก็เพิ่ม ?sslmode=require ต่อท้าย Connection String
⚠️ Checklist ความปลอดภัย: ตั้งรหัสผ่านที่ยาว ≥ 16 ตัวอักษร, ปิด Firewall ทุก Port ยกเว้นที่ใช้จริง, อย่าใช้ User postgres เชื่อมต่อจากแอป, และพิจารณาเปลี่ยน Port 5432 เป็นเลขอื่นเพื่อหลบการสแกนอัตโนมัติ (Security through obscurity เป็นเพียงชั้นเสริม ไม่ใช่ชั้นหลัก)
Backup, Restore และ Tuning เบื้องต้น
นอกจาก pg_dump ที่ใช้ Backup ทีละ Database แล้ว PostgreSQL ยังมี pg_dumpall สำหรับ Backup ทั้ง Cluster (รวม Role และ Global setting) และ pg_restore สำหรับคืนค่าจากไฟล์ Backup รูปแบบ Custom ที่บีบอัดและคืนค่าได้เร็วกว่าไฟล์ SQL ธรรมดา แนะนำให้ Backup ในรูปแบบ Custom format:
# Backup แบบ custom format (บีบอัด + restore เลือกตารางได้) sudo -u postgres pg_dump -Fc myapp_db > /backup/myapp_db_$(date +%F).dump # Restore จากไฟล์ custom format sudo -u postgres pg_restore -d myapp_db --clean /backup/myapp_db_2026-06-07.dump # Backup ทั้ง cluster (รวม role + permission) sudo -u postgres pg_dumpall > /backup/full_cluster_$(date +%F).sql
ด้าน Tuning เบื้องต้น ค่า Default ของ PostgreSQL ถูกตั้งมาให้รันได้บนเครื่องที่มี RAM น้อยมาก เพื่อให้เข้ากันได้กับฮาร์ดแวร์ทุกระดับ ดังนั้นบน VPS ที่มี RAM พอสมควรคุณควรปรับค่าหลัก ๆ เหล่านี้ใน postgresql.conf ให้เหมาะกับขนาดเครื่อง:
| พารามิเตอร์ | คำแนะนำ | ทำหน้าที่ |
|---|---|---|
shared_buffers | ~25% ของ RAM | หน่วยความจำที่ PostgreSQL ใช้ Cache ข้อมูล |
effective_cache_size | ~50–75% ของ RAM | บอก Planner ว่ามี Cache ของ OS เท่าไร |
work_mem | 16–64MB | หน่วยความจำต่อการ Sort/Hash หนึ่งครั้ง |
maintenance_work_mem | 256MB–1GB | ใช้ตอน VACUUM, CREATE INDEX |
max_connections | 100 (ใช้ Pooler ถ้าต้องมาก) | จำนวน Connection พร้อมกันสูงสุด |
ถ้าแอปของคุณเปิด Connection จำนวนมาก ควรใช้ Connection Pooler อย่าง PgBouncer คั่นกลางแทนที่จะเพิ่ม max_connections สูง ๆ เพราะทุก Connection ของ PostgreSQL กินหน่วยความจำพอสมควร อย่าลืมรัน sudo systemctl restart postgresql ทุกครั้งหลังแก้ค่าใน postgresql.conf และใช้คำสั่ง VACUUM ANALYZE เป็นระยะเพื่อให้ Planner มีสถิติล่าสุดและคืนพื้นที่ที่ถูกลบไปแล้ว
เคล็ดลับ: เว็บ pgtune ช่วยคำนวณค่าตั้งต้นที่เหมาะกับ RAM และจำนวน Core ของ VPS คุณได้อัตโนมัติ ลองนำผลลัพธ์ไปปรับใน postgresql.conf แล้ววัดผลด้วย Query จริงก่อนใช้บนโปรดักชัน
เปลี่ยนรหัสผ่าน User postgres เพื่อความปลอดภัย
หลังติดตั้งครั้งแรก user postgres ไม่มีรหัสผ่านระดับ database ให้ตั้งใหม่:
sudo -u postgres psql ALTER USER postgres WITH PASSWORD 'AnotherStrongPassword!'; \q
สรุป Checklist หลังติดตั้ง PostgreSQL
- ติดตั้ง
postgresqlและpostgresql-contribพร้อมเปิด Autostart - เปลี่ยนรหัสผ่าน user
postgresทันที - สร้าง user และ database แยกตามแอป — ห้ามใช้
postgresในโปรดักชัน - แก้
postgresql.confและpg_hba.confเฉพาะเมื่อต้องการ Remote Access - เปิด Firewall เฉพาะ IP ที่จำเป็น ห้ามเปิด
0.0.0.0/0 - ตั้ง
pg_dumpbackup รายวันแล้วส่งออกนอกเซิร์ฟเวอร์
คำถามที่พบบ่อย (FAQ)
PostgreSQL กับ MySQL ควรเลือกตัวไหนสำหรับเว็บทั่วไป?
ถ้าเว็บของคุณเป็น WordPress หรือ CMS สำเร็จรูปที่รองรับ MySQL เป็นหลัก การใช้ MySQL/MariaDB จะติดตั้งง่ายและเข้ากันได้ดีกว่า แต่ถ้าคุณกำลังพัฒนาแอปเองที่ต้องการ Transaction ที่เข้มงวด, เก็บข้อมูลแบบ JSONB, หรือทำงาน Analytics ที่ซับซ้อน PostgreSQL จะตอบโจทย์มากกว่าและขยายตัวได้ดีในระยะยาว ทั้งสองตัวรันได้สบายบน VPS ของ AsiaGB ที่เริ่มต้น 500 บาท/เดือน
ติดตั้ง PostgreSQL ต้องใช้ VPS สเปกเท่าไร?
PostgreSQL รันได้บน VPS ขั้นต่ำที่มี RAM 1GB สำหรับโปรเจกต์เล็กหรือทดสอบ แต่ถ้าจะใช้งานจริงที่มี Traffic หรือข้อมูลหลายหมื่นแถวขึ้นไป แนะนำ RAM อย่างน้อย 2GB เพื่อให้ปรับ shared_buffers และ work_mem ได้เหมาะสม VPS Linux SSD ของ AsiaGB ให้ Full Root Access จึงปรับแต่งค่าเหล่านี้ได้อิสระ
ลืมรหัสผ่าน User postgres ต้องทำอย่างไร?
เนื่องจาก Linux user postgres เข้า psql ได้ผ่าน peer authentication โดยไม่ต้องใช้รหัสผ่าน คุณจึงรีเซ็ตได้เสมอด้วย sudo -u postgres psql แล้วรัน ALTER USER postgres WITH PASSWORD 'รหัสใหม่'; โดยไม่ต้องรู้รหัสเดิม ขอแค่มีสิทธิ์ sudo บนเครื่อง VPS
จะให้ pg_dump รัน Backup อัตโนมัติทุกวันได้อย่างไร?
ใช้ cron job ของระบบ โดยรัน sudo crontab -u postgres -e แล้วเพิ่มบรรทัด เช่น 0 3 * * * pg_dump -Fc myapp_db > /backup/myapp_db_$(date +\%F).dump เพื่อ Backup ทุกวันตอนตี 3 แนะนำให้ส่งไฟล์ขึ้น Cloud Storage และตั้งให้ลบ Backup เก่าเกิน 14 วันออกอัตโนมัติเพื่อประหยัดพื้นที่
ต้องการ VPS สำหรับ Database ที่เสถียรและเร็ว?
AsiaGB VPS Linux SSD เริ่มต้น 500 บาท/เดือน Full Root Access เลือกทำเลไทย / สิงคโปร์ พร้อมเปิด Port อิสระ
ดูแพ็กเกจ VPS