ทำไมโปรแกรมเมอร์ต้องคุมฐานข้อมูลเอง
เวลาเราเขียนโปรแกรม ฐานข้อมูล (ที่เก็บข้อมูลของแอป) คือหัวใจสำคัญ PostgreSQL (ระบบจัดการฐานข้อมูลยอดนิยม) ไม่ได้มีไว้แค่เก็บข้อมูล แต่เราต้องจัดการว่าใครเข้าถึงอะไรได้บ้าง เปรียบเหมือนการสร้างบ้าน คุณต้องมีกุญแจให้คนในครอบครัวเข้าบ้านได้ แต่ช่างซ่อมไฟไม่ควรเข้าถึงห้องนอนเรา
ถ้าเราปล่อยให้ทุกคนเข้าถึงฐานข้อมูลได้หมด วันหนึ่งถ้ามีบั๊ก (ข้อผิดพลาดในโปรแกรม) หรือมีคนมือบอนไปลบข้อมูลสำคัญทิ้ง งานทั้งหมดที่เราทำมาจะหายไปทันที การจัดการสิทธิ์จึงเป็นเรื่องของ ความปลอดภัย (การป้องกันไม่ให้ข้อมูลรั่วไหลหรือถูกทำลาย) ที่มืออาชีพทุกคนต้องทำเป็น
การสำรองข้อมูล หรือที่เรียกว่า Backup (การคัดลอกข้อมูลเก็บไว้เผื่อเหตุฉุกเฉิน) ก็สำคัญไม่แพ้กัน สมมติคุณกำลังอัปเดตระบบแล้วพลาดจนข้อมูลพัง ถ้าคุณไม่มีตัวสำรองไว้ คุณอาจต้องเสียเวลาเริ่มเขียนโปรแกรมใหม่หมด การรู้วิธี Backup และ Restore (การนำข้อมูลที่สำรองไว้กลับมาใช้งาน) จึงเป็นทักษะเอาตัวรอดที่สำคัญที่สุด
การสร้างผู้ใช้งานและกำหนดสิทธิ์ใน PostgreSQL
ก่อนจะเริ่ม เราต้องเข้าใจแนวคิด Role (บทบาทหรือกลุ่มของผู้ใช้งาน) ใน PostgreSQL กันก่อน มันคือการสร้างชื่อผู้ใช้ขึ้นมาเพื่อให้ระบบจำได้ว่าใครเป็นใคร และคนนั้นมีหน้าที่อะไรในการจัดการข้อมูล การมีชื่อผู้ใช้งานแยกจากชื่อเครื่องคอมพิวเตอร์ ช่วยให้เราคุมสิทธิ์ได้ละเอียดขึ้นมาก
เราจะเริ่มจากการเปิด psql (เครื่องมือสั่งงานฐานข้อมูลผ่านหน้าจอสีดำ) แล้วสั่งสร้างผู้ใช้งานใหม่ การกำหนดสิทธิ์หรือที่เรียกว่า GRANT (การมอบอำนาจให้คนใช้งานทำสิ่งต่างๆ ได้) คือการบอกว่าคนคนนี้ทำอะไรได้บ้าง เช่น ดูข้อมูลได้อย่างเดียว หรือลบข้อมูลได้ด้วย
ข้อควรระวังคือ อย่าให้สิทธิ์ทุกคนเป็น Superuser (ผู้ดูแลสูงสุดที่มีอำนาจทุกอย่าง) เพราะถ้าบัญชีนั้นโดนแฮก ข้อมูลทั้งหมดจะตกอยู่ในอันตราย ให้เลือกให้สิทธิ์เท่าที่เขาต้องใช้ทำงานจริงก็พอ เป็นหลักการที่เรียกว่า Least Privilege (การให้สิทธิ์น้อยที่สุดเท่าที่จำเป็น)
-- สร้างผู้ใช้งานใหม่ชื่อว่า dev_user
CREATE ROLE dev_user WITH LOGIN PASSWORD 'secret123';
-- ให้สิทธิ์ในการเชื่อมต่อฐานข้อมูล
GRANT CONNECT ON DATABASE my_project TO dev_user;
-- ให้สิทธิ์ในการอ่านข้อมูลในตาราง
GRANT SELECT ON ALL TABLES IN SCHEMA public TO dev_user;
บรรทัดแรก CREATE ROLE คือการสร้างบัญชีผู้ใช้ใหม่พร้อมรหัสผ่าน บรรทัดที่สอง GRANT CONNECT คือการยอมให้คนนี้เข้ามาในฐานข้อมูลที่ระบุได้ บรรทัดสุดท้าย GRANT SELECT คือการอนุญาตให้คนนี้อ่านข้อมูลในตารางทั้งหมดที่มีอยู่ ผลลัพธ์ที่ควรเห็นคือข้อความ GRANT ขึ้นมาหลังจากกด Enter เป็นอันว่าสำเร็จ
การ Backup ข้อมูลด้วยคำสั่ง pg_dump
การ Backup คือการสร้างไฟล์จำลองของฐานข้อมูลทั้งหมดออกมาเก็บไว้ในเครื่องของเรา คุณไม่ต้องกังวลว่าข้อมูลจะหาย เพราะเราจะใช้คำสั่ง pg_dump (เครื่องมือสั่งสำรองข้อมูลของ PostgreSQL) ที่ทำหน้าที่เหมือนตู้เซฟ เก็บข้อมูลทุกอย่างลงไฟล์นามสกุล .sql
เราจะทำสิ่งนี้ผ่าน Command Prompt (หน้าจอสีดำสำหรับพิมพ์คำสั่งบน Windows) โดยไม่ต้องเข้าโปรแกรมฐานข้อมูลก่อน วิธีนี้ดีมากเพราะคุณสามารถเขียนคำสั่งนี้ลงใน Script (ไฟล์ที่มีชุดคำสั่งที่รันอัตโนมัติ) เพื่อให้มันทำงานสำรองข้อมูลเองทุกคืนได้เลย
สิ่งที่มือใหม่มักพลาดคือการลืมใส่รหัสผ่าน หรือพิมพ์ชื่อฐานข้อมูลผิด ทำให้ไฟล์ที่ได้ว่างเปล่า ก่อนจะทำ Backup จริงทุกครั้ง ให้ลองรันคำสั่งแล้วเปิดไฟล์ที่ได้ดูว่ามีข้อมูลอยู่ข้างในไหม ถ้าเห็นข้อความภาษา SQL ข้างในแสดงว่าคุณทำสำเร็จแล้ว
-- สำรองข้อมูลฐานข้อมูลชื่อ my_project เก็บไว้ในไฟล์
pg_dump -U postgres -d my_project -f my_backup.sql
คำสั่ง pg_dump คือตัวสั่งให้เริ่มสำรองข้อมูล -U postgres คือการระบุชื่อผู้ดูแลระบบ -d my_project คือชื่อฐานข้อมูลที่ต้องการสำรอง และ -f my_backup.sql คือชื่อไฟล์ที่จะให้เก็บข้อมูล เมื่อรันแล้วระบบอาจถามรหัสผ่าน ให้พิมพ์รหัสผ่านของ postgres ลงไป ผลลัพธ์คือคุณจะได้ไฟล์ my_backup.sql ปรากฏอยู่ในโฟลเดอร์ที่คุณรันคำสั่ง
การ Restore ข้อมูลผ่าน Command Line
เมื่อมีเหตุการณ์ไม่คาดฝัน เช่น ข้อมูลในฐานข้อมูลพังหรือหายไป เราต้องใช้คำสั่ง Restore เพื่อดึงข้อมูลกลับมา การทำแบบนี้เปรียบเหมือนการกดปุ่มย้อนเวลาให้ฐานข้อมูลกลับไปอยู่ในสภาพสมบูรณ์เหมือนวันที่เราสั่ง Backup ไว้
ก่อนจะ Restore เราต้องสร้างฐานข้อมูลเปล่าๆ ขึ้นมารอก่อนเสมอ ถ้าเราพยายาม Restore ทับฐานข้อมูลที่มีอยู่แล้ว อาจจะเกิดความวุ่นวายเรื่องชื่อตารางซ้ำกันได้ การเตรียมฐานข้อมูลใหม่ให้สะอาดจึงเป็นขั้นตอนที่สำคัญมาก
จำไว้ว่าการ Restore ข้อมูลจะเขียนทับข้อมูลเดิมที่มีอยู่ทั้งหมดในฐานข้อมูลนั้นๆ ดังนั้นต้องตรวจสอบให้แน่ใจว่าไฟล์ที่นำมา Restore คือไฟล์ล่าสุดที่คุณต้องการจริงๆ ไม่เช่นนั้นคุณอาจจะเสียข้อมูลใหม่ๆ ที่เพิ่งเพิ่มเข้าไปไปโดยไม่ตั้งใจ
-- สร้างฐานข้อมูลใหม่ก่อนนำข้อมูลเก่ากลับมา
createdb -U postgres new_database
-- สั่ง Restore ข้อมูลจากไฟล์ที่เคยสำรองไว้
psql -U postgres -d new_database -f my_backup.sql
บรรทัดแรก createdb คือการสร้างฐานข้อมูลใหม่ชื่อ new_database บรรทัดที่สอง psql คือการส่งไฟล์ my_backup.sql เข้าไปในฐานข้อมูลใหม่นั้น คำสั่ง -f คือการบอกว่าให้เอาข้อมูลจากไฟล์นี้เข้ามา ผลลัพธ์ที่ควรเห็นคือข้อความแจ้งการสร้างตารางและข้อมูลต่างๆ รันขึ้นมาบนหน้าจอจนจบ
จุดที่มือใหม่มักพลาดและวิธีแก้ไข
ปัญหาที่เจอบ่อยที่สุดคือ Path (ตำแหน่งที่อยู่ของโปรแกรม) ของ PostgreSQL ไม่ได้ถูกเพิ่มเข้าไปในเครื่อง ทำให้พิมพ์คำสั่งแล้วขึ้นว่า "command not found" (หาคำสั่งไม่เจอ) วิธีแก้คือต้องเข้าไปตั้งค่าใน Environment Variables (การตั้งค่าตัวแปรสภาพแวดล้อมของ Windows) เพื่อบอกให้เครื่องรู้จักคำสั่งเหล่านี้
อีกเรื่องคือการลืมใส่รหัสผ่าน หรือสิทธิ์ของผู้ใช้ไม่พอ ทำให้คำสั่ง Backup หรือ Restore ทำงานล้มเหลว ถ้าเจอข้อความว่า "Permission denied" (ถูกปฏิเสธสิทธิ์) ให้เช็คว่าคุณใช้ชื่อผู้ใช้ที่มีสิทธิ์สูงพอไหม หรือรหัสผ่านที่พิมพ์ถูกต้องหรือเปล่า
สุดท้ายคือเรื่องของเวอร์ชัน ถ้าคุณ Backup จาก PostgreSQL เวอร์ชันใหม่ แล้วเอาไป Restore ในเวอร์ชันที่เก่ามาก อาจจะเกิดข้อผิดพลาดได้ พยายามอัปเดตฐานข้อมูลให้เป็นเวอร์ชันเดียวกันทั้งเครื่องที่ Backup และเครื่องที่ Restore จะช่วยลดปัญหาได้มหาศาล
สรุป: การนำไปใช้จริงในการทำงาน
เมื่อคุณเริ่มทำโปรเจกต์จริง สิ่งแรกที่ต้องทำคือสร้าง User แยกสำหรับแอปพลิเคชันของคุณเสมอ อย่าใช้ postgres (บัญชีผู้ดูแลสูงสุด) ในการเชื่อมต่อฐานข้อมูลจากโค้ดเด็ดขาด เพราะถ้าใครแฮกแอปคุณได้ เขาจะได้สิทธิ์คุมฐานข้อมูลทั้งหมดทันที
ลองฝึกทำ Automated Backup (การสำรองข้อมูลอัตโนมัติ) โดยใช้ Task Scheduler (โปรแกรมตั้งเวลาทำงานบน Windows) ให้รันคำสั่ง pg_dump ทุกเที่ยงคืน วิธีนี้จะทำให้คุณเป็นโปรแกรมเมอร์ที่ทำงานอย่างเป็นระบบ และไม่ต้องกลัวว่างานจะหายไปอีก
การฝึกฝนเรื่องพวกนี้ไม่ได้ทำให้คุณเก่งขึ้นแค่วันเดียว แต่เป็นการสร้างนิสัยที่ดีในการดูแลระบบ การจัดการข้อมูลอย่างปลอดภัยและมีสำรองอยู่เสมอ คือคุณสมบัติของโปรแกรมเมอร์มืออาชีพที่บริษัทต่างๆ อยากได้ตัวไปร่วมงานมากที่สุดครับ