Case 4 · Oracle Incident · Capacity

Oracle ฟ้อง ORA-01653 แต่ Disk ยังไม่เต็ม แล้วต้องแก้อย่างไร?

Oracle แสดง ORA-01653 ซึ่งอ่านแล้วเข้าใจได้ทันทีว่า “พื้นที่ไม่พอ” แต่เมื่อทีม IT ตรวจ Disk กลับพบว่ายังมีพื้นที่ว่าง สาเหตุของ Case นี้คือ Datafile เดิมโตถึงขนาดสูงสุดแล้ว Oracle จึงใช้พื้นที่ว่างบน Disk ต่อไม่ได้ และต้องเพิ่ม Datafile ใหม่ให้ Tablespace

Oracle Database ORA-01653 Tablespace & Datafile Disk ยังมีพื้นที่ว่าง ปกปิดชื่อระบบและ Table

Oracle บอกว่าพื้นที่ไม่พอ แต่พอไปดู Disk กลับยังว่าง

เหตุการณ์เริ่มจาก Oracle ฟ้อง ORA-01653: unable to extend table ... in tablespace ... ผู้ใช้บันทึกรายการใหม่ไม่ได้ ทุกคนจึงเข้าใจว่าพื้นที่ของเครื่องน่าจะเต็ม แต่เมื่อเปิดดู Disk กลับพบว่ายังมีพื้นที่เหลืออยู่ จึงเกิดคำถามว่า Oracle บอกว่าพื้นที่ไม่พอได้อย่างไร และควรเพิ่มพื้นที่ตรงไหน

Table → Tablespace → Datafile → Disk

Oracle ไม่ได้นำพื้นที่ว่างบน Disk มาใช้กับ Table โดยตรง แต่ใช้ได้เฉพาะพื้นที่ใน Datafile ที่ผูกไว้กับ Tablespace

เข้าใจเพียง 3 คำนี้ก็เห็นภาพ

Table — ข้อมูลที่ Application ใช้งาน
เช่น รายการขาย ลูกค้า หรือ Transaction เมื่อมีข้อมูลใหม่ Table ก็ต้องการพื้นที่เพิ่ม
Tablespace — พื้นที่ที่ Oracle กำหนดให้ Table ใช้
เป็นชื่อพื้นที่ภายใน Oracle ไม่ใช่พื้นที่ว่างทั้งหมดของ Disk
Datafile — ไฟล์จริงของ Tablespace ที่อยู่บน Disk
Tablespace จะเก็บข้อมูลได้เท่าที่ Datafile ของมันรองรับ ต่อให้ Disk ยังว่าง Oracle ก็ใช้พื้นที่นั้นไม่ได้จนกว่าจะมี Datafile ที่โตได้หรือมี Datafile ใหม่

ใน Case นี้ Tablespace ใช้ Datafile แบบ Smallfile และ Block Size 8 KB ไฟล์เดิมโตใกล้ 32 GB ซึ่งเป็นเพดานของ Datafile ลักษณะนี้แล้ว การเปิด Autoextend หรือสั่ง Resize จึงทำให้ไฟล์เดิมโตต่อไม่ได้ พื้นที่ว่างบน Disk ยังอยู่ แต่ไม่มี Datafile ที่ Oracle สามารถนำพื้นที่นั้นมาใช้กับ Table ได้

คำตอบของ Case นี้: ต้องเพิ่ม Datafile ใหม่ ทีมเพิ่ม Datafile อีกหนึ่งไฟล์ให้ Tablespace เดิม เมื่อ Tablespace มีไฟล์ใหม่ที่ยังมีพื้นที่ Oracle ก็สามารถขยาย Table และรับ Transaction ต่อได้ โดยไม่ต้องเพิ่มขนาด Disk ของเครื่อง

อยากเข้าใจศัพท์ให้ลึกขึ้น?

อ่านต่อได้ที่ ORA-01653 บอกอะไร, Table, Tablespace และ Datafile ต่างกันอย่างไร และ เหตุใด Datafile เดิมโตเกิน 32 GB ไม่ได้

ทีมพบได้อย่างไรว่าต้องเพิ่ม Datafile ไม่ใช่เพิ่ม Disk

บทที่ 1 · อ่าน Error ให้ครบ

Error บอกชื่อ Table และ Tablespace ที่มีปัญหาอยู่แล้ว

ทีมเริ่มจากข้อความ ORA-01653 และเวลาที่เกิดเหตุ เพื่อระบุ Table กับ Tablespace ที่ได้รับผลกระทบ จึงรู้ได้ทันทีว่าต้องเปิดดู Datafile ของ Tablespace ใด ไม่ต้องไล่ตรวจพื้นที่ทั้งหมดของ Database

บทที่ 2 · พบว่า Disk ว่าง แต่ Datafile เต็ม

Datafile เดิมโตถึงเพดานใกล้ 32 GB แล้ว

ทีมตรวจพบว่า Disk ยังมีพื้นที่ แต่ Datafile เดิมของ Smallfile Tablespace ที่ใช้ Block Size 8 KB โตถึงขนาดสูงสุดแล้ว นี่คือเหตุผลที่ Autoextend ทำงานต่อไม่ได้และ Resize ไฟล์เดิมก็ไม่ใช่คำตอบ

บทที่ 3 · เพิ่มทางให้ Oracle ใช้พื้นที่บน Disk

เพิ่ม Datafile ใหม่เข้าไปใน Tablespace เดิม

เมื่อไฟล์เดิมโตต่อไม่ได้ ทีมจึงสร้าง Datafile ใหม่บน Disk ที่ยังมีพื้นที่และผูกเข้ากับ Tablespace เดิม Oracle จึงมีพื้นที่ก้อนใหม่สำหรับขยาย Table โดย Application ไม่ต้องย้าย Table หรือเปลี่ยนวิธีบันทึกข้อมูล

หลังดำเนินการ: เมื่อเพิ่ม Datafile ใหม่ Oracle สามารถจัดสรรพื้นที่ให้ Table ต่อได้ Transaction กลับมาบันทึกสำเร็จ และผู้ใช้กลับมาใช้งานระบบได้ตามปกติ

ขั้นตอนที่ใช้แก้ปัญหาใน Case นี้

  1. จับคู่เวลาเกิดเหตุจาก Application กับข้อความ ORA-01653 ใน Database เพื่อระบุ Table และ Tablespace ที่ได้รับผลกระทบ
  2. ตรวจ Tablespace type กับ Block Size และพบว่าเป็น Smallfile ขนาด Block 8 KB
  3. ตรวจ Datafile และพบว่าไฟล์เดิมโตถึงเพดานใกล้ 32 GB จึงขยายต่อไม่ได้
  4. ยืนยันว่า Disk ยังมีพื้นที่พอสำหรับสร้างไฟล์ใหม่
  5. เพิ่ม Datafile ใหม่ให้ Tablespace เดิม แล้วทดสอบว่า Transaction กลับมาบันทึกได้
  6. วาง Monitoring จาก Growth Rate และ Time-to-full เพื่อให้ทีมมีเวลาจัดการก่อนกระทบผู้ใช้รอบถัดไป

เปิดดู ORA-01653, Storage Hierarchy และจุดตรวจสำหรับ DBA

รายละเอียดด้านล่างเก็บศัพท์และบริบท Oracle ไว้ครบสำหรับ DBA/IT และการค้นหา แต่พับไว้เพื่อไม่ให้ขัดจังหวะเรื่องราวหลัก

ORA-01653 หมายความว่าอะไร

รูปแบบดั้งเดิมของ Error คือ ORA-01653: unable to extend table ... by ... in tablespace ... หมายถึง Oracle ไม่สามารถจัดสรร Extent (กลุ่ม Data Block ที่ Segment ขอเพิ่มในครั้งหนึ่ง) ให้ Table Segment ใน Tablespace ที่ระบุได้

Oracle รุ่นใหม่อาจแสดงข้อความในรูป “unable to increase tablespace ... during insert or update on table ...” แต่ใจความเหมือนกันคือคำสั่ง Insert หรือ Update ต้องใช้พื้นที่เพิ่มและ Tablespace ไม่สามารถโตให้เพียงพอในขณะนั้น

Error สำหรับ Segment ประเภทอื่นอาจใช้รหัสต่างกัน เช่น ORA-01654 สำหรับ Index จึงควรอ่านข้อความ Error จริงให้ครบ ไม่ใช้คำว่า “Tablespace เต็ม” แทนทุกรหัสโดยอัตโนมัติ

Table, Tablespace และ Datafile ต่างกันอย่างไร

Table คือข้อมูลที่ Application อ่านและบันทึก เช่น รายการขายหรือลูกค้า

Tablespace คือพื้นที่ภายใน Oracle ที่กำหนดว่า Table กลุ่มนี้จะใช้พื้นที่จากที่ใด

Datafile คือไฟล์จริงบน Disk ที่ส่งพื้นที่ให้ Tablespace หนึ่ง Tablespace มี Datafile ได้หลายไฟล์ จึงเพิ่มไฟล์ใหม่ได้เมื่อไฟล์เดิมโตถึงเพดาน

ก่อนเพิ่มพื้นที่ DBA ควรตรวจอะไรบ้าง
  • ข้อความ Error, Timestamp, Container/PDB, Schema, Table และ Tablespace ที่เกี่ยวข้อง
  • DBA_TABLESPACES: BIGFILE/SMALLFILE, Block Size และ Allocation Type
  • DBA_DATA_FILES: BYTES, AUTOEXTENSIBLE, INCREMENT_BY และ MAXBYTES
  • DBA_FREE_SPACE และข้อมูล Segment เพื่อดูพื้นที่ที่จัดสรรได้กับแนวโน้มการเติบโต
  • พื้นที่จริงของ Filesystem หรือ ASM Disk Group, Quota, Permission และข้อจำกัดของ Platform
  • Backup coverage, Recovery Window และวิธี Rollback ก่อนเปลี่ยนโครงสร้าง Storage
ทำไม Datafile เดิมโตเกิน 32 GB ไม่ได้ และต้องเพิ่มไฟล์ใหม่

Case นี้เป็น Smallfile Tablespace ที่ใช้ Block Size 8 KB แต่ละ Datafile รองรับได้ประมาณ 222 Data Block หรือมีขนาดสูงสุดใกล้ 32 GB เมื่อไฟล์เดิมถึงเพดานนี้แล้ว Autoextend และ Resize ไม่สามารถทำให้ไฟล์เดิมโตข้ามข้อจำกัดดังกล่าวได้

Smallfile Tablespace รองรับ Datafile หลายไฟล์ วิธีใช้พื้นที่ว่างที่ยังเหลือบน Disk จึงเป็นการเพิ่ม Datafile ใหม่เข้าไปใน Tablespace เดิม แล้ว Oracle จะจัดสรรพื้นที่ของ Table ต่อจากไฟล์ใหม่ได้

ที่มาของคำอธิบาย ORA-01653 และโครงสร้างพื้นที่

ระบบพบ ORA-01653 หรือพื้นที่ Oracle โตเร็วกว่าที่คาดหรือไม่?

ทีม VT Technology ช่วยตรวจว่า Table อยู่ใน Tablespace ใด, Datafile เดิมโตต่อได้หรือไม่ และเพิ่ม Datafile ให้ถูกจุดเพื่อกู้บริการ พร้อมวาง Monitoring ก่อนพื้นที่กระทบผู้ใช้อีกครั้ง

ปรึกษาปัญหา Oracle และ Capacity