หมวดหมู่: System Monitoring

whowho

ในฐานะ System Specialist การเฝ้าระวังสถานะการเชื่อมต่อ (Connection Status) และกิจกรรมของผู้ใช้งาน (User Activity) เป็นสิ่งสำคัญอย่างยิ่งในการดูแลระบบฐานข้อมูล PostgreSQL เพื่อให้มั่นใจว่าไม่มีเซสชันที่ค้างอยู่ (Stale Connections) หรือการใช้งานที่ผิดปกติ บทความนี้จะแนะนำวิธีการตรวจสอบสถานะเหล่านี้โดยใช้ View ระบบที่ทรงพลังที่สุดอย่าง pg_stat_activity

🔍 ทำความเข้าใจ pg_stat_activity: หัวใจของการเฝ้าระวัง

แทนที่จะใช้คำสั่ง who แบบ Unix ซึ่งใช้ตรวจสอบผู้ใช้งานระบบปฏิบัติการ เราจะใช้ pg_stat_activity ซึ่งเป็น System View ที่รวบรวมข้อมูลแบบเรียลไทม์เกี่ยวกับทุกเซสชันที่กำลังเชื่อมต่อกับ PostgreSQL Instance ของคุณ ข้อมูลนี้ช่วยให้เราทราบว่าใครกำลังทำอะไร อยู่ที่ฐานข้อมูลใด และสถานะการเชื่อมต่อเป็นอย่างไร

💡 สถานการณ์ที่ 1: ตรวจสอบผู้ใช้งานและเซสชันทั้งหมดแบบพื้นฐาน

หากคุณต้องการทราบเพียงว่ามีเซสชันใดบ้างที่กำลังเชื่อมต่ออยู่ โดยไม่สนใจรายละเอียดการทำงานมากนัก คุณสามารถรันคำสั่งพื้นฐานเพื่อดึงข้อมูลทั้งหมดจาก View นี้ได้:

SQL

SELECT pid, usename, application_name, client_addr, state, state_change FROM pg_stat_activity;

คำอธิบาย: คำสั่งนี้จะแสดง Process ID (pid), ชื่อผู้ใช้ (usename), ชื่อแอปพลิเคชันที่เชื่อมต่อ (application_name), IP ต้นทาง (client_addr), สถานะปัจจุบัน (state) และเวลาที่สถานะเปลี่ยนแปลงล่าสุด

🛠️ สถานการณ์ที่ 2: การตรวจสอบเชิงลึก (Debugging & Filtering)

หากคุณต้องการตรวจสอบว่าผู้ใช้งานคนใดคนหนึ่งกำลังรันคำสั่งอะไรอยู่ หรือต้องการกรองเฉพาะเซสชันที่อยู่ในสถานะ ‘idle’ (ไม่ได้ทำอะไร) หรือ ‘active’ (กำลังทำงาน) คุณสามารถใช้ WHERE clause ร่วมกับ pg_stat_activity ได้

ตัวอย่าง: ตรวจสอบเซสชันที่กำลังรอการทำงาน (Idle):

SQL

SELECT pid, usename, client_addr, state, query FROM pg_stat_activity WHERE state = 'idle' AND usename = 'report_user';

ตัวอย่าง: ตรวจสอบคำสั่งที่กำลังรันอยู่ (Active Query):

SQL

SELECT pid, usename, client_addr, state, query FROM pg_stat_activity WHERE state = 'active' ORDER BY query DESC LIMIT 5;

⚠️ ข้อควรระวัง: pg_stat_activity vs pg_user

หลายคนอาจสับสนระหว่าง pg_stat_activity และ pg_user pg_user ใช้สำหรับจัดการข้อมูลผู้ใช้ (User Metadata) เช่น ชื่อผู้ใช้และรหัสผ่าน ในทางกลับกัน pg_stat_activity ใช้สำหรับตรวจสอบ กิจกรรม (Activity) และสถานะการเชื่อมต่อในขณะนั้น ซึ่งเป็นข้อมูลที่เปลี่ยนแปลงตลอดเวลา

✅ Best Practices และบทสรุป

การเฝ้าระวัง Active Connections ไม่ได้จบแค่การรัน Query นี้เท่านั้น ในฐานะ Senior Architect คุณควรตั้งค่าการเฝ้าระวังเหล่านี้เป็นส่วนหนึ่งของ Monitoring System โดยเฉพาะการตั้งค่า statement_timeout และ idle_in_transaction_session_timeout ในไฟล์ postgresql.conf เพื่อป้องกันไม่ให้เซสชันที่ค้างอยู่ (Zombie Sessions) ส่งผลกระทบต่อประสิทธิภาพของระบบโดยไม่จำเป็น การใช้ pg_stat_activity อย่างถูกวิธีจึงเป็นกุญแจสำคัญในการรักษาเสถียรภาพและความปลอดภัยของระบบ PostgreSQL ของคุณ