กรณีศึกษา & ผลงานการแก้ปัญหาระบบฐานข้อมูล
รวมประสบการณ์จากงานภาคสนาม เพื่ออธิบายสถานการณ์ ผลกระทบ วิธีหาสาเหตุ การแก้ไข และผลลัพธ์ที่เกิดขึ้นอย่างเป็นขั้นตอน
กรณีศึกษาที่แนะนำ
เริ่มจาก Case ที่สะท้อนอาการ วิธีวิเคราะห์ การแก้ไข และผลลัพธ์ได้ชัด ทั้ง Oracle, Oracle RAC และ SQL Server
ระบบ CRM ช้า เพราะ Transaction กำลังรอ Lock กันเอง
AWR (รายงาน Performance ของ Oracle) พบว่า 61.98% ของเวลาฐานข้อมูลหมดไปกับการรอ Lock ไม่ใช่การประมวลผล ทีมจึงตามรอยจนพบจุดที่ทำให้ผู้ใช้ต้องรอ
ดู Case 10 → Cross-platform Tuning · แก้ไขแล้วEpicor ERP และ SQL Server: ปัญหาไม่ได้อยู่ที่ Database เพียงชั้นเดียว
วิเคราะห์ตั้งแต่ Business Process, Application Query จนถึง Database Engine แสดงประสบการณ์จูนฐานข้อมูลโดยไม่ยึดติดกับยี่ห้อ
ดู Case 1 → Oracle RAC · Commit PerformanceRAC รับ Transaction พอ ๆ กัน แต่ฝั่งหนึ่งรอ COMMIT นานกว่า 2.5 เท่า
จำนวนงานเกือบเท่ากัน แต่ Redo ต่อ Transaction และ log file sync ต่างกันมาก AWR จึงพาทีมตามรอย Commit path แทนการโทษ Load Balancing
อ่าน Case 13 ฉบับเต็ม → Oracle Incident · ORA-01653Oracle ฟ้องพื้นที่ไม่พอ แต่ Disk ยังไม่เต็ม
Datafile เดิมโตถึงเพดานแล้ว Oracle จึงใช้พื้นที่ว่างบน Disk ต่อไม่ได้ ทีมเพิ่ม Datafile ใหม่ให้ Tablespace และระบบกลับมาบันทึก Transaction ได้
อ่าน Case 4 ฉบับเต็ม →Epicor ERP และ SQL Server — วิเคราะห์จาก Business Process ถึง Database Engine
สถานการณ์: Epicor ERP ช้าลงเมื่อข้อมูลและงานค้างสะสม
ทีมวิเคราะห์ระบบแบบ End-to-End ตั้งแต่ Business Process, Application Query จนถึง SQL Server 2016 เพื่อหาคอขวดจริง แทนการมองว่า Database หรือ Hardware เป็นสาเหตุเพียงอย่างเดียว
การ Purge ช่วยบรรเทาอาการได้ช่วงหนึ่ง แต่เมื่อข้อมูลและ Active Records เพิ่มขึ้น ระบบกลับมาช้าอีกครั้ง จึงต้องหาสาเหตุที่เชื่อมโยงทั้งขั้นตอนทำงานและคำสั่ง SQL
ทีมเชื่อมอาการกับสามส่วนที่เกี่ยวข้อง แทนการปรับ Database Parameter แบบแยกส่วน:
การแก้ปัญหาครอบคลุมจุดที่พบจากการวิเคราะห์:
- Business Process: จัดการขั้นตอนปิด Job และลด Active Records ที่ไม่จำเป็น
- Application Query: ปรับ Query Path ที่เกี่ยวข้องกับ Scalar UDF และการเข้าถึงข้อมูล
- Database Engine: ปรับแนวทางให้เหมาะกับพฤติกรรมของ SQL Server 2016 และ Workload ของ ERP
Database Performance Tuning ที่ไม่ยึดติดกับยี่ห้อ
หลังปรับจุดที่เกี่ยวข้องทั้ง Business Process, Application Code และ Database Engine ประสิทธิภาพของ Epicor ERP ดีขึ้นจนตอบโจทย์การใช้งาน Case นี้แสดงว่าทีมสามารถใช้หลัก Performance Engineering กับฐานข้อมูลหลายแพลตฟอร์ม ไม่จำกัดเฉพาะ Oracle
กรณีจากงานภาคสนาม: Oracle 12c และ GlassFish — ตรวจ Connection Pooling ก่อนเพิ่มทรัพยากร
สถานการณ์: Oracle 12c และ GlassFish หน่วงเมื่อมีผู้ใช้พร้อมกัน
ทีมตรวจเส้นทางการทำงานตั้งแต่ Application, GlassFish Connection Pool, Network จนถึง Oracle Database เพื่อแยกปัญหา Connection Churn ออกจากข้อจำกัดด้านทรัพยากร
แอปพลิเคชันแบบ 3-Tier ตอบสนองช้าลงเมื่อมี Concurrent Users มากขึ้น ส่งผลให้การทำงานผ่านหน้าจอและการเชื่อมต่อฐานข้อมูลติดขัด
การเพิ่มทรัพยากรไม่ได้ทำให้อาการหาย เพราะคอขวดไม่ได้อยู่ที่ปริมาณ RAM เพียงอย่างเดียว ทีมจึงเปลี่ยนจากการเพิ่ม Hardware มาเป็นการวิเคราะห์ Connection Lifecycle
การเปิด–ปิด Database Connection บ่อยทำให้เกิด Logon Overhead และเพิ่มภาระ Process ทีมจึงตรวจข้อมูลสองฝั่งควบคู่กัน:
- GlassFish: pool configuration, pool statistics และ connection lifecycle
- Oracle: logon rate, session/process count, AWR/ASH และ listener evidence ในช่วงเกิดอาการ
ทีมปรับพฤติกรรมการใช้ Connection และค่าที่เกี่ยวข้องโดยอ้างอิง Workload จริง:
- Connection Pool: ปรับขนาด Pool, Connection Lifecycle และการนำ Connection กลับมาใช้ซ้ำ
- Oracle Capacity: ตรวจและปรับ
PROCESSESกับSESSIONSให้รองรับจำนวน Connection อย่างเหมาะสม - End-to-End: ตรวจ Response Time, Logon Rate, CPU และ Error ร่วมกันทั้ง Application และ Database
ผลลัพธ์จากการวิเคราะห์แบบ End-to-End
หลังปรับ Connection Pool และค่าที่เกี่ยวข้อง ระบบตอบสนองดีขึ้นเมื่อมีผู้ใช้พร้อมกัน และลดภาระที่เกิดจากการสร้าง Connection ซ้ำโดยไม่จำเป็น
กรณีจากงานภาคสนาม: Oracle 9i Instance Tuning — ตรวจ SGA/PGA ก่อนสรุปว่า Memory เป็น Root Cause
สถานการณ์: Oracle 9i ประมวลผล Batch ช้าแม้เพิ่ม RAM แล้ว
ทีมวิเคราะห์การใช้ Memory ทั้ง Oracle และ Operating System แยก SGA, PGA, Buffer Cache, Workarea และ Physical Reads เพื่อให้ทรัพยากรที่มีอยู่ถูกใช้อย่างเหมาะสมกับ Workload
การเพิ่ม Physical RAM ไม่ทำให้ Oracle ใช้ Memory เพิ่มโดยอัตโนมัติ เมื่อค่า SGA/PGA และรูปแบบ Workload ยังเหมือนเดิม ระบบจึงยังประมวลผลช้า
การเพิ่ม Physical RAM จะไม่ช่วยโดยอัตโนมัติหาก Oracle ยังใช้ค่า memory target เดิม แต่การพิสูจน์ว่า memory เป็นคอขวดต้องมีข้อมูลอย่างน้อย:
- Oracle memory: ค่า SGA/PGA components, cache advice, workarea statistics และ physical reads ในช่วงเกิดอาการ
- Operating System: available memory, paging/swapping และ process memory เพื่อแยก database pressure ออกจาก OS pressure
การปรับ Instance Tuning ควรเริ่มจาก workload และความสามารถของ Oracle version ไม่ใช่ใช้ cache hit ratio หรือสูตรรวม memory เพียงค่าเดียว:
- ตรวจ Baseline: response time, DB time, physical reads และ OS paging ก่อนเปลี่ยนค่า
- ทดสอบ Memory: เปลี่ยน SGA/PGA ทีละขั้น ตรวจผลต่อ workload และรักษา OS headroom โดยคำนึงว่า PGA target ไม่ใช่ hard limit
หลังปรับ SGA/PGA และองค์ประกอบ Memory ให้เหมาะกับ Workload ระบบใช้ทรัพยากรเดิมได้มีประสิทธิภาพขึ้น งานประมวลผลเสร็จเร็วขึ้นและผู้ใช้กลับมาทำงานได้ตามปกติ
AWR Analysis — resmgr:cpu quantum 22.38% และ PX qref latch 12.37%
สถานการณ์: งาน Batch ใช้เวลานานและต้องแยกว่า CPU ไม่พอ หรือ Oracle กำลังรอทรัพยากร
AWR จากระบบจริงยืนยัน Wait Event สำคัญสองรายการในคนละช่วงรายงาน ได้แก่ resmgr:cpu quantum 22.38% ของ DB Time และ PX qref latch 12.37% ของ DB Time ตัวเลขนี้ช่วยชี้จุดตรวจสอบ แต่ยังไม่พิสูจน์ว่า Scheduler, SQL Hint หรือสาเหตุใดสาเหตุหนึ่งเป็น Root Cause เพียงข้อเดียว
resmgr:cpu quantum: 5,408,083 waits, 28,320 วินาที และ 22.38% ของ DB Time ใน AWR ช่วงประมาณ 594 นาทีPX qref latch: AWR อีกช่วงหนึ่งบันทึก 33,385,785 waits, 2,775 วินาที และ 12.37% ของ DB Time- ขอบเขตตัวเลข: เปอร์เซ็นต์เป็นสัดส่วนต่อ DB Time ของแต่ละ AWR ไม่ใช่เปอร์เซ็นต์ Downtime และไม่ควรนำสองช่วงมาบวกกัน
resmgr:cpu quantum คือการรอ CPU quantum ที่ Resource Manager จัดสรรPX qref latch เกี่ยวข้องกับ queue buffer ของ Parallel Execution- เชื่อม Timeline: เทียบเวลา Batch, Scheduler/maintenance job และ Top SQL ให้เป็นช่วงเดียวกัน
- ตรวจ Resource Manager: ดู Resource Plan, Consumer Group และ CPU allocation ก่อนทดลองปรับ พร้อมเก็บ AWR ก่อน–หลัง
- ทดสอบ Parallelism: ตรวจ SQL Monitor/Execution Plan และ Degree of Parallelism; ทดลองเฉพาะระบบทดสอบหรือช่วงควบคุม ไม่ถอด Hint แบบเหมารวม
- วัดผล: เปรียบเทียบ Batch duration, DB Time, wait seconds, throughput และ CPU ของช่วงงานเดียวกัน
สัดส่วน DB CPU และ DB wait time ช่วยจัดลำดับการตรวจสอบ แต่ต้องอ่านร่วมกับ Baseline, Workload และเวลาที่เกิดเหตุ ไม่ใช่เกณฑ์มาตรฐานที่ใช้ตัดสิน Root Cause หรือการเพิ่ม Hardware ได้ด้วยตัวมันเอง:
ผลลัพธ์: งาน Batch กลับมาทำงานได้เร็วขึ้น
ทีมปรับ Resource Plan, Parallel Execution และงานที่ทำงานทับซ้อนกันตามจุดที่ AWR ชี้ ทำให้ภาระการรอทรัพยากรลดลงและ Batch เสร็จในเวลาที่ผู้ใช้งานต้องการ โดยไม่รีบแก้ด้วยการเพิ่ม Hardware เพียงอย่างเดียว
ระบบตอบสนองช้า และฐานข้อมูลเข้าถึงตารางเดียว 628.87 ล้านครั้ง
ผู้ใช้รู้สึกว่าระบบช้า แต่ยังไม่รู้ว่างานไปติดอยู่ตรงไหน
จากหน้าจอ Application (โปรแกรมที่ผู้ใช้ทำงานอยู่) เห็นเพียงว่าระบบตอบสนองช้ากว่าที่ควร ทีมจึงใช้ AWR (รายงานสรุปประสิทธิภาพที่ Oracle เก็บจากการทำงานจริง) เพื่อดูว่าฐานข้อมูลกำลังใช้ทรัพยากรไปกับงานส่วนใด
ทีมเริ่มจากอาการที่ผู้ใช้สัมผัสได้ แล้วตรวจลงไปในฐานข้อมูลแทนการเดาว่าเป็นปัญหาจาก Application, Server หรือ Disk
AWR พบ Logical Reads (จำนวนครั้งที่ Oracle หยิบ Data Block หรือก้อนข้อมูลมาตรวจผ่านหน่วยความจำ) รวมประมาณ 707.23 ล้านครั้ง โดย Table (ตารางข้อมูล) รายการเดียวรับไป 628.87 ล้านครั้งหรือ 88.92% และอีก Partition (ส่วนย่อยของ Table) หนึ่งส่วนรับ 38.71 ล้านครั้งหรือ 5.47% สองจุดรวมกันเป็น 94.39% ของการอ่านทั้งหมด
แม้ Block จะอยู่ใน Memory แต่ Oracle ยังต้องค้นหา ตรวจ และประมวลผลทุกครั้ง การทำซ้ำหลายร้อยล้านครั้งจึงใช้ CPU และทรัพยากรภายในฐานข้อมูล ทำให้งานอื่นมีทรัพยากรเหลือน้อยลงและผู้ใช้อาจต้องรอนานขึ้น
ตัวเลขระดับ Segment จึงเป็นพิกัดว่า “งานกระจุกอยู่ที่ไหน” ไม่ใช่คำตอบทันทีว่า Disk, Table หรือ Index เป็นสาเหตุ
ทีมเชื่อม Segment กับ SQL ordered by Gets/Reads แล้วตรวจ Execution Plan (แผนที่ Oracle ใช้ค้นข้อมูล), Predicate, Bind Value, จำนวน Execution และ Buffer Gets ต่อครั้ง เพื่อแยกว่า SQL ถูกเรียกถี่ อ่านกว้างเกินไป หรือเกิดทั้งสองอย่างพร้อมกัน
สำหรับ Table ที่แบ่ง Partition ทีมตรวจ PSTART/PSTOP เพื่อดูว่า Partition Pruning ตัดส่วนที่ไม่เกี่ยวข้องออกจริงหรือไม่ ก่อนพิจารณา Local Index, Global Index และวงจรชีวิตข้อมูล
- ปรับ Index: เลือกโครงสร้างให้ตรงกับเงื่อนไขค้นหาของ SQL เพื่อลดการเปิดดูข้อมูลกว้างเกินไป
- ปรับ Partition Access: ทำให้ Oracle เลือกอ่านเฉพาะส่วนของข้อมูลที่เกี่ยวข้องกับคำสั่ง
- จัดการ Data Lifecycle: แยกวิธีดูแลข้อมูลเก่า เพื่อลดปริมาณข้อมูลที่งานประจำต้องค้นหา
หลังแก้ Oracle ค้นข้อมูลตรงกับงานมากขึ้น
เมื่อปรับ Index, การเลือก Partition และขอบเขตข้อมูลที่ต้องดูแลแล้ว ระบบตอบสนองดีขึ้น และลดงานที่ไม่จำเป็นในจุดซึ่งเคยมีการอ่านกระจุกตัวสูง
เพิ่ม Memory แล้วก็ยังช้า — เพราะเพิ่มผิดส่วน
สถานการณ์: Parameter Snapshot มี PGA target ต่ำ และ Advisor ประเมินการจัดสรรเกินเป้าหมายหลายครั้ง
Parameter Snapshot พบ pga_aggregate_target 32 MiB, db_cache_size 144 MiB และ sga_max_size ประมาณ 441 MiB ขณะที่ PGA Target Advice แสดง Estimated Over-allocation หลายครั้ง ทีมจึงใช้ Advisor ร่วมกับ Workload เพื่อปรับ Workarea Memory อย่างเป็นขั้นตอน
- 32 MiB (ค่าปัจจุบัน):
ESTD_OVERALLOC_COUNT=993 - 128 MiB: ประเมิน 540 ครั้ง; 192 MiB: ประเมิน 160 ครั้ง
- 256 MiB: ประเมิน 0 ครั้งสำหรับ workload ที่ Advisor บันทึกไว้
- ข้อจำกัด: ตัวเลขจาก
V$PGA_TARGET_ADVICEเป็นการจำลอง workload ในอดีต ไม่ใช่ผลการเปลี่ยนค่าจริงหรือค่าที่ควรใช้ทันที
- เก็บ Baseline: Workarea executions optimal/one-pass/multipass, extra bytes read/written, DB Time และ Temp I/O ในช่วงงานเดียวกัน
- ตรวจระบบปฏิบัติการ: Available memory, process memory และ paging/swapping เพื่อรักษา headroom ให้ OS และ Process อื่น
- ทดลองทีละขั้น: ใช้ Advisor เป็นข้อมูลประกอบ เปลี่ยนค่าในช่วงควบคุม แล้วเปรียบเทียบ workload เดิม;
PGA_AGGREGATE_TARGETเป็น target รวม ไม่ใช่ hard cap - แยก SGA จาก PGA: อย่าลด Java Pool หรือเพิ่ม Buffer Cache โดยอาศัยขนาด Parameter เพียงอย่างเดียว ต้องมี Component usage และ Cache Advice ที่ตรวจสอบได้
ระบบประมวลผลดีขึ้นโดยไม่ใช้สูตร Memory แบบตายตัว
ทีมทดลองปรับ PGA/SGA ทีละขั้นโดยรักษา OS Headroom และติดตาม Workarea ของระบบ หลังปรับแล้วงานประมวลผลทำงานได้ดีขึ้น แนวทางนี้ไม่ได้นำค่า 20% หรือค่า PGA 256 MiB ไปใช้เป็นสูตรทั่วไปกับทุกระบบ
ระบบ CRM ช้า เพราะ Transaction กำลังรอ Lock กันเอง
ฐานข้อมูลไม่ได้ช้าเฉพาะตอนที่เครื่องทำงานหนัก แต่อาจช้าเพราะงานหลายชุดกำลังต่อคิวรอกัน
เมื่อผู้ใช้ CRM ต้องรอนานขึ้น ทีมเปรียบเทียบ AWR (รายงาน Performance ที่ Oracle เก็บจากการทำงานจริงของระบบ) ระหว่างช่วงปกติกับช่วงที่มีปัญหา แล้วพบว่า Oracle ใช้เวลาส่วนใหญ่ไปกับการรอ Transaction อื่นปล่อย Lock ไม่ใช่การคำนวณบน CPU จุดนี้ทำให้ทิศทางการแก้ปัญหาเปลี่ยนไปทั้งหมด
DB Time (เวลารวมของงานฐานข้อมูล) แบ่งได้เป็นช่วงที่ Oracle กำลังประมวลผล และช่วงที่งานต้องหยุดรอ
ถ้านึกว่า DB Time มี 100 ส่วน ช่วงปกติ CPU time ใช้ไป 72.60 ส่วน แต่ช่วงที่ระบบช้าเหลือเพียง 27.02 ส่วน ขณะที่ enq: TM - contention (การรอ Lock ที่เกี่ยวข้องกับ Table หรือ Object) เพิ่มเป็น 61.98 ส่วน
เปรียบเหมือนช่องบริการที่พนักงานยังว่าง แต่ทำงานต่อไม่ได้เพราะเอกสารสำคัญถูกอีกคนถือไว้ การเพิ่มพนักงานจึงไม่ช่วยจนกว่าจะรู้ว่าใครถือเอกสารและทำไมจึงไม่ส่งต่อ
Wait Event (ชื่อที่ Oracle ใช้บอกว่า Session กำลังรออะไร) ช่วยชี้ทิศทาง ส่วน enq: TM - contention หมายถึงการรอ DML Enqueue ที่เกี่ยวข้องกับ Table หรือ Object แต่ชื่ออาการนี้ยังไม่ได้บอกว่า Transaction ใดเป็นต้นทาง
ทีมจึงไล่จาก Blocking Session (Session ที่ถือ Lock และทำให้งานอื่นต้องรอ) ไปยัง Waiting Session ที่ยังทำงานต่อไม่ได้ แล้วเชื่อมต่อกับ Enqueue Mode, Object และลำดับคำสั่ง SQL ในช่วงเวลาเดียวกัน
ระหว่างนั้นยังพบ log file sync และ log file parallel write จึงตรวจ Commit Frequency, LGWR และ I/O แยกต่างหาก เพื่อไม่ให้ปัญหา Redo กลบสาเหตุของ Lock Contention
- หาเส้นทางการรอ: เชื่อม Blocking Session, Waiting Session, Object และ SQL ให้เป็นเหตุการณ์เดียวกัน
- แก้เฉพาะจุด: ตรวจ Foreign Key และ Index เฉพาะ Object ที่เกี่ยวข้อง แทนการสร้าง Index แบบเหมารวม
- แยกปัญหา Commit: ตรวจ
log file sync, LGWR และ I/O โดยไม่รีบสรุปว่า Redo Log หรือ Storage เป็นสาเหตุ
ผลลัพธ์ไม่ได้มาจากการเพิ่ม Hardware แต่มาจากการแก้ Transaction ที่รอกัน
หลังแก้จุดที่สร้าง Contention การรอ Lock ลดลงและผู้ใช้ CRM กลับมาทำงานได้คล่องขึ้น Case นี้จึงเป็นตัวอย่างของการใช้ AWR เปลี่ยน “อาการช้า” ให้กลายเป็นเส้นทางสืบหาสาเหตุที่แก้ได้จริง
Oracle RAC AWR — Streams Capture และ Backup Wait แยกตาม Instance
บทสรุป: แต่ละ Instance มี Wait Profile ต่างกัน จึงต้องตรวจแยกก่อนสรุป Root Cause
AWR สอง Instance ในช่วงเวลาเดียวกันยืนยันว่า Instance 1 มี Streams capture: waiting for archive log 6.4% ของ DB Time ขณะที่ Instance 2 มี Backup: sbtwrite2 6.1% และ io done 5.8% ข้อมูลนี้ช่วยชี้จุดตรวจสอบ แต่ยังไม่พิสูจน์ว่า Streams หรือ Backup เป็นสาเหตุของอาการช้าทั้งระบบ
| AWR metric | Instance 1 | Instance 2 |
|---|---|---|
| CPU time | 28.5% | 37.4% |
db file sequential read | 17.0% | 16.4% |
Streams capture: waiting for archive log | 6.4% | — |
Backup: sbtwrite2 | — | 6.1% |
io done | — | 5.8% |
ตัวเลขเป็นสัดส่วน DB Time จากรายงานแต่ละ Instance ในช่วงประมาณ 450 นาที ทีมจึงวิเคราะห์แยกต่อ Instance และเชื่อมผลด้วย Timeline เดียวกัน แทนการนำเปอร์เซ็นต์ข้าม Instance มารวมกัน
- ตรวจ Capture process, lag และ Archive Log availability ในช่วงเดียวกับ AWR โดยไม่สรุปว่าต้องเพิ่ม Retention จนกว่าจะพบหลักฐาน
- เทียบ Backup start/end, RMAN/SBT media-manager elapsed time และผลต่อ Foreground I/O ก่อนพิจารณาย้าย Schedule หรือแยก I/O path
- ใช้ ASH/AWR ระบุ SQL, Object และ Instance ที่สัมพันธ์กับ
gcwaits แล้ววัดซ้ำหลังการเปลี่ยนแปลง
แก้ปัญหาโดยไม่เหมารวม RAC ทั้ง Cluster
ทีมปรับจุดที่เกี่ยวข้องกับ Streams Capture, Archive Availability, Backup และ Workload ตามอาการของแต่ละ Instance ทำให้ระบบทำงานได้เสถียรขึ้น โดยปกปิดชื่อระบบ Hostname, Schema, Object, SQL และข้อมูลลูกค้า
ระบบเดี๋ยวก็ช้า เดี๋ยวก็เร็ว เป็นมาหลายเดือนแล้ว — Programmer บอกไม่ได้แก้ Code อะไรเลย
บทสรุป: Audit Trail เป็น Segment ที่มี Physical Reads สูง แต่ยังไม่ใช่หลักฐานของ Root Cause
AWR ช่วง 240.25 นาทีระบุว่า SYS.AUD$ มี Physical Reads 7,373,362 ครั้ง คิดเป็น 33.72% ในตาราง Segments by Physical Reads จึงควรตรวจ SQL และกิจกรรม Audit ที่เกี่ยวข้อง แต่ตัวเลขนี้เพียงอย่างเดียวยังพิสูจน์ไม่ได้ว่า Audit Trail ทำให้ธุรกรรมของระบบช้า
สิ่งที่ AWR ชี้: SYS.AUD$ อยู่ใน Tablespace SYSAUX และมี 7,373,362 Physical Reads หรือ 33.72% ตามรายงาน ทีมจึงเชื่อม Segment นี้กับ SQL, Audit Configuration และ Retention Policy โดยปกปิดชื่อ Schema และ Object ธุรกิจอื่นทั้งหมด
- หา SQL/Module ที่อ่านหรือสร้างข้อมูล Audit ในช่วงเดียวกับ AWR และตรวจว่ากิจกรรมนั้นเป็น Foreground impact จริงหรือไม่
- ทบทวน Audit mode, Retention และข้อกำกับกับเจ้าของข้อมูล; Archive ก่อน Purge ตามขั้นตอนที่รองรับกับรุ่นและรูปแบบ Audit ที่ใช้งาน
- หากใช้ Traditional Audit Trail ให้ประเมิน
DBMS_AUDIT_MGMTตามเอกสาร Oracle และยืนยันผลด้วย AWR/SQL metrics หลังเปลี่ยน
ระบบตอบสนองดีขึ้นหลังจัดการ SYS.AUD$ อย่างถูกวิธี
ทีมจัดการ Audit Data, Retention และ Housekeeping ตาม Audit Mode ที่ใช้งาน ทำให้ภาระ I/O ลดลงและระบบตอบสนองดีขึ้น โดยไม่ปิด Audit หรือทำลายข้อมูลที่ต้องใช้ตรวจสอบย้อนหลัง
RAC รับ Transaction พอ ๆ กัน แต่ทำไมฝั่งหนึ่งรอ COMMIT นานกว่า 2.5 เท่า?
จำนวน Transaction ใกล้เคียงกัน แต่เวลาที่ Oracle ใช้ยืนยันแต่ละรายการกลับต่างกันมาก
AWR ช่วงเดียวกันพบว่า RAC ทั้งสอง Instance รับประมาณ 71 Transaction ต่อวินาที และมีจำนวน log file sync เกือบเท่ากัน แต่ Instance 1 รอเฉลี่ย 10ms ขณะที่ Instance 2 รอเพียง 4ms ทีมจึงเปลี่ยนคำถามจาก “งานกระจายเท่ากันหรือไม่” เป็น “เวลาใน Commit path ไปเสียอยู่ตรงไหน”
Redo คือสมุดบันทึกการเปลี่ยนแปลงที่ Oracle ใช้กู้ข้อมูลเมื่อระบบขัดข้อง ส่วน LGWR (Log Writer) คือ Process ที่นำ Redo ไปเก็บใน Online Redo Log
log file sync คือเวลาที่งานรอวงจรนี้ Instance 1 รอรวม 2,420 วินาทีหรือ 38.3% ของ DB Time ส่วน Instance 2 รอรวม 920 วินาทีหรือ 25.7%
Instance 1 สร้าง Redo ประมาณ 3,791 bytes ต่อ Transaction ขณะที่ Instance 2 อยู่ที่ประมาณ 1,501 bytes ต่างกันกว่า 2.5 เท่า ความต่างนี้เกิดพร้อมกับ log file sync ที่ 10ms กับ 4ms แต่ยังต้องวิเคราะห์ต่อก่อนกล่าวว่า Redo เป็นสาเหตุเพียงอย่างเดียว
log file parallel write ซึ่งสะท้อนเวลาฝั่ง LGWR เขียน Redo เฉลี่ยประมาณ 1ms ทั้งสอง Instance จึงไม่ควรสรุปทันทีว่า Disk ของฝั่งหนึ่งช้ากว่า ทีมตรวจ LGWR scheduling, Commit pattern และ Backup timeline ร่วมกัน
- เทียบงานให้ถูก: ตรวจ Transaction rate, จำนวน COMMIT, Waits ต่อ Transaction และ Redo ต่อ Transaction
- แยกเวลาที่รอ: เทียบ
log file syncกับlog file parallel write, LGWR scheduling และ I/O latency - ตรวจสิ่งที่เกิดพร้อมกัน: เชื่อม Backup และ Cluster waits ด้วย Timeline ก่อนเลือกจุดปรับ
แก้ Commit path จากหลักฐาน ไม่ได้เดาจากชื่อ Wait เพียงตัวเดียว
ทีมปรับจุดที่เกี่ยวข้องกับ Commit Frequency, LGWR, Storage และ Job Timeline แยกต่อ Instance ทำให้การตอบสนองของ Transaction และความเสถียรของ RAC ดีขึ้น
direct path read, log file sync และ Concurrent Load Test — จาก SQL ถึง Connection
สถานการณ์: ระบบช้าเมื่อ Workload และจำนวน Connection เพิ่มขึ้น
ทีมวิเคราะห์ร่วมกันทั้ง SQL tuning, direct path read, log file sync, Connection Management และ Concurrent Load Test เพื่อแยกว่าปัญหาเกิดจาก Access Path, Commit Path หรือรูปแบบ Load ของ Application
- SQL และ Execution Plan: ตรวจ Function บนคอลัมน์, Predicate, Full Scan และ Access Path ที่เกิดขึ้นจริง
- Wait Events: เชื่อม
direct path readและlog file syncกับ SQL และช่วงเวลาที่ผู้ใช้พบอาการ - Connection และ Load Test: ทดสอบรูปแบบ Concurrency, Response Time, Throughput และ Error ภายใต้ Load ที่ใกล้เคียงการใช้งานจริง
- ปรับ SQL และ Predicate ที่ทำให้ Access Path ไม่เหมาะสม รวมถึงประเมิน Function-based Index เมื่อเข้ากับ Workload
- ปรับจุดที่เกี่ยวข้องกับ Commit และ Connection Lifecycle โดยพิจารณาทั้ง Application กับ Oracle Database
- ทำ Concurrent Load Test ซ้ำเพื่อดู Response Time, Throughput และ Error ภายใต้ Scenario ที่กำหนด
แก้ครบทั้ง SQL, Wait Event และ Connection
หลังปรับ SQL, Access Path, Commit และ Connection ที่เกี่ยวข้อง ระบบผ่านการใช้งานตาม Load ที่ลูกค้าต้องการและตอบสนองดีขึ้น โดยปกปิดชื่อ Instance, Schema, Procedure, Table, Index, SQL, DDL และ Scenario ภายในทั้งหมด
ORA-01653 ทั้งที่ Disk ยังว่าง เพราะ Datafile เดิมโตต่อไม่ได้
Oracle บอกว่าพื้นที่ไม่พอ แต่พอไปดู Disk กลับยังว่าง
ผู้ใช้บันทึก Transaction ไม่ได้และ Oracle แสดง ORA-01653 ทุกคนจึงคิดว่า Disk เต็ม แต่เมื่อตรวจแล้วกลับยังมีพื้นที่เหลือ สาเหตุคือ Oracle ใช้พื้นที่ผ่าน Datafile และไฟล์เดิมโตถึงเพดานแล้ว
Table คือข้อมูลที่ Application ใช้, Tablespace คือพื้นที่ภายใน Oracle ที่ Table ใช้งาน และ Datafile คือไฟล์จริงของ Tablespace ที่อยู่บน Disk
Table ใช้พื้นที่ว่างบน Disk โดยตรงไม่ได้ แต่ใช้ได้เฉพาะพื้นที่ใน Datafile ต่อให้ Disk ยังว่าง หาก Datafile โตต่อไม่ได้ Oracle ก็ยังฟ้องว่าพื้นที่ไม่พอ
ทีมอ่านชื่อ Table และ Tablespace จาก ORA-01653 แล้วพบว่าเป็น Smallfile Tablespace ที่ใช้ Block Size 8 KB ส่วน Datafile เดิมโตถึงขนาดสูงสุดแล้ว จึง Autoextend หรือ Resize ต่อไม่ได้
- อ่าน Error: ระบุ Table และ Tablespace ที่ขยายไม่ได้
- ตรวจ Datafile: ยืนยันว่าไฟล์เดิมถึงเพดานและโตต่อไม่ได้
- ใช้พื้นที่บน Disk: เพิ่ม Datafile ใหม่เข้าไปใน Tablespace เดิม
- ป้องกันซ้ำ: ติดตาม Growth Rate และ Time-to-full ก่อนพื้นที่กระทบผู้ใช้
Oracle มีไฟล์ใหม่สำหรับใช้พื้นที่บน Disk
เมื่อเพิ่ม Datafile ใหม่ Oracle สามารถขยาย Table และรับ Transaction ต่อได้ ผู้ใช้กลับมาทำงานตามปกติ และทีมวาง Monitoring ก่อนเกิด ORA-01653 รอบถัดไป
กรณีจากงานภาคสนาม: Archive Log Gap — วิเคราะห์ Sequence, Transport และ Recovery Path
สถานการณ์: ระบบ DR ตามข้อมูลจากระบบหลักไม่ทัน
ทีมแยก Transport Lag, Apply Lag และ Missing Archive Log Sequence เพื่อระบุว่าการส่ง Log หรือการ Apply หยุดที่จุดใด ก่อนเลือก Recovery Path ที่กระทบระบบน้อยที่สุด
Managed Recovery เดินหน้าต่อไม่ได้เพราะลำดับ Archive Log ไม่ต่อเนื่อง ทำให้ระบบสำรองตามหลัง Production และกระทบความพร้อมตามแผน DR
Archive Log Sequence ที่ไม่ต่อเนื่องอาจทำให้กระบวนการ Recovery หรือ Apply เดินหน้าต่อไม่ได้ แต่ต้องตรวจสถานะจริงก่อน เพราะ Transport Gap, Apply Lag และไฟล์ถูกลบหรือเสียหายต้องใช้แนวทางแก้ต่างกัน:
- Transport: ตรวจ Destination status, Error, Network path และ Sequence ที่ส่งสำเร็จล่าสุด
- Apply: ตรวจ Sequence ที่รับแล้วเทียบกับ Sequence ที่ Apply และเหตุผลที่ Managed Recovery หยุด
- Availability: ค้นหา Archive Log ที่ระบบหลัก, Backup และ Media อื่นก่อนสรุปว่าไม่สามารถกู้ไฟล์ได้
ทีมเริ่มจากวิธีที่กระทบน้อยและตรวจสอบได้ ก่อนพิจารณาวิธีที่ใช้เวลาและทรัพยากรมากกว่า:
- เติม Gap: Restore/Register Archive Log ที่ขาด หากยังพบในระบบหลักหรือ Backup
- Roll-forward: ประเมิน Incremental Recovery ตาม SCN เมื่อ Version และรูปแบบระบบรองรับ
- Re-instantiate: ใช้เมื่อ Gap กู้ไม่ได้หรือความเสี่ยงของวิธีอื่นสูงกว่า โดยต้องมี Backup, Capacity, Downtime และ Rollback plan
- Verification: ทดสอบ Transport, Apply, RPO/RTO และ Readiness ตาม Runbook ไม่ใช้เพียงสถานะ “Sync” หนึ่งค่า
ระบบ DR กลับมา Apply Log ต่อเนื่อง
หลังเติม Missing Sequence และแก้เส้นทาง Transport/Apply ที่เกี่ยวข้อง ระบบ DR กลับมาตามข้อมูลจากระบบหลักได้ ทีมปรับ Archive Log Retention และ Monitoring ให้เห็น Transport Lag, Apply Lag และ Gap ก่อนกระทบความพร้อมของระบบ
กรณีจากงานภาคสนาม: SYSAUX และ Audit Trail — ตรวจ Occupant ก่อนเพิ่มพื้นที่
สถานการณ์: Oracle หยุดประมวลผลจากการเติบโตใน SYSAUX
ทีมตรวจ V$SYSAUX_OCCUPANTS, Segment Growth, Audit Mode และรูปแบบ DDL เพื่อหาว่า Component ใดใช้พื้นที่จริง ก่อนกู้ Capacity และควบคุมการเติบโตระยะยาว
พื้นที่ใน SYSAUX เติบโตจากข้อมูลภายในและ Audit Activity จนกระทบการทำงานของฐานข้อมูล ทีมต้องกู้ Capacity พร้อมหา Occupant ที่เป็นต้นทางเพื่อป้องกันเหตุซ้ำ
SYSAUX รองรับองค์ประกอบภายในหลายประเภท ขณะที่ตำแหน่ง Audit Trail แตกต่างตาม Oracle version และ Audit mode การพบ SYSAUX โตจึงยังไม่พิสูจน์ว่า DDL Audit เป็น Root Cause:
V$SYSAUX_OCCUPANTS และ Segment growth เพื่อหาว่า Component ใดใช้พื้นที่จริงทีมแยกการกู้บริการเร่งด่วนออกจากการควบคุมการเติบโตในระยะยาว:
- Emergency Capacity: Add/Resize Datafile หลังตรวจ Storage, Backup และ Tablespace Configuration เพื่อให้ระบบกลับมาทำงาน
- Audit Housekeeping: ใช้
DBMS_AUDIT_MGMTตาม Oracle version, Audit mode, Retention และข้อกำหนด Compliance พร้อม Backup และทดสอบก่อน Purge - Application Design: หากหลักฐานพบ CREATE/DROP ซ้ำ ให้ประเมินการ Reuse Object หรือ Global Temporary Table ตาม Transaction semantics และทดสอบผลกระทบ
แก้ทั้ง Capacity เร่งด่วนและสาเหตุการเติบโตระยะยาว
หลังเพิ่ม Capacity และจัดการ Audit/Occupant ตามวิธีที่เหมาะกับ Oracle Version ระบบกลับมาทำงานได้ และมีแนวทาง Housekeeping เพื่อชะลอการเติบโต โดยไม่ลด Audit Coverage ที่องค์กรต้องใช้ด้านความปลอดภัยและ Compliance
ระบบงานไอทีหรือฐานข้อมูลในองค์กรของคุณกำลังประสบปัญหาเหล่านี้?
ทีมงานผู้เชี่ยวชาญของ VT Technology ยินดีช่วยเหลือ ตรวจสอบ จูนนิ่งแก้ไข และวางมาตรการด้านความปลอดภัยและการสำรองข้อมูลให้องค์กรของคุณทำงานได้อย่างปลอดภัย 24x7
📝 ติดต่อวิเคราะห์ปัญหาระบบฟรี