Tablespace กับ Datafile: เมื่อพื้นที่ใกล้เต็ม ต้องดูอะไรบ้าง?
ตรวจ used space, ขนาดและเพดาน datafile, autoextend และพื้นที่ storage ก่อนเพิ่มพื้นที่
เมื่อระบบแจ้งเตือนว่า Tablespace ใกล้เต็ม เราจำเป็นต้องรีบเพิ่ม Datafile หรือขยายขนาดไฟล์ทันทีเลยหรือไม่? ก่อนที่จะตัดสินใจปรับเพิ่มพื้นที่ เรามาอ่านค่าจริงในระบบเพื่อแยกแยะให้ชัดเจนกันก่อนครับว่า ตัวเลขที่เห็นกำลังบอกถึงปริมาณการใช้งานจริง ขนาดไฟล์ปัจจุบัน หรือเพดานขยายขีดสุดของระบบ
Tablespace vs Datafile:
- Tablespace: คือหน่วยจัดเก็บข้อมูลเชิงตรรกะ (Logical Storage) ที่แอปพลิเคชันและตารางต่าง ๆ มองเห็น
- Datafile: คือไฟล์ข้อมูลจริงที่จัดเก็บอยู่ในระบบปฏิบัติการ (Physical Storage) หรือ ASM Disk Group โดยหนึ่ง Tablespace สามารถประกอบด้วย Datafile ได้ตั้งแต่หนึ่งไฟล์ขึ้นไป
(หมายเหตุ: ตัวอย่างในบทความนี้เป็นการอ่านค่าจาก Tablespace ชื่อ USERS ในสภาพแวดล้อม Lab ซึ่งยังไม่ได้อยู่ในสภาวะดิสก์เต็มจริง)

ภาพอธิบายแนวคิด: ภาพความสัมพันธ์เชิงแนวคิด จำนวนไฟล์ในภาพไม่ใช่จำนวนจาก Lab และเพดาน autoextend ไม่ใช่พื้นที่ว่างจริง
ขั้นที่ 1: ตรวจสอบเปอร์เซ็นต์การใช้งานจริง (Usage Metrics)
สำหรับบัญชีผู้ใช้ที่มีสิทธิ์อ่าน DBA Views สามารถตรวจสอบสัดส่วนการใช้พื้นที่ผ่าน DBA_TABLESPACE_USAGE_METRICS ได้ดังนี้:
SELECT tablespace_name, used_percent
FROM dba_tablespace_usage_metrics
WHERE tablespace_name = 'USERS';
TABLESPACE_NAME USED_PERCENT
-------------------- ------------
USERS 0.033176
1 row selected.
วิเคราะห์ผลลัพธ์:
USERS มีค่า USED_PERCENT เท่ากับ 0.033176% ซึ่งการคำนวณเปอร์เซ็นต์ของ View นี้ จะคิดคำนวณเปรียบเทียบกับ "ขนาดสูงสุดที่ Tablespace นั้นสามารถโตได้" (รวมเพดาน Autoextend) ไม่ใช่คิดจากพื้นที่ดิสก์จริงของระบบปฏิบัติการ หากโปรแกรม Client แสดงผลโดยปัดเศษทศนิยมเหลือ 1 ตำแหน่ง อาจเห็นเป็น 0.0% แต่ไม่ได้หมายความว่าไม่มีข้อมูลอยู่เลย
ขั้นที่ 2: ตรวจสอบขนาดไฟล์และคุณสมบัติ Autoextend
คำนวณแปลงหน่วยจาก Bytes เป็น MiB โดยการหารด้วย 1024 สองครั้ง เพื่อดูขนาดไฟล์ปัจจุบันและเพดานขยายสูงสุด:
SELECT file_id,
bytes / 1024 / 1024 AS size_mb,
autoextensible,
maxbytes / 1024 / 1024 AS max_mb
FROM dba_data_files
WHERE tablespace_name = 'USERS';
FILE_ID SIZE_MB AUT MAX_MB
------- ---------- --- ----------
15 72 YES 33554432
1 row selected.
วิเคราะห์ผลลัพธ์:
FILE_ID15 มีขนาดปัจจุบัน (SIZE_MB) เท่ากับ 72 MiBAUTOEXTENSIBLE(ย่อเป็นAUTบน Client) แสดงสถานะเป็นYESหมายถึงไฟล์นี้สามารถขยายขนาดตัวเองอัตโนมัติเมื่อข้อมูลเพิ่มขึ้นMAX_MBเท่ากับ 33,554,432 MiB (หรือ 32 TiB) คือเพดานสูงสุดที่ตั้งค่าไว้ให้ไฟล์นี้ขยายไปถึงได้
ขั้นที่ 3: แยก "เพดานของไฟล์" ออกจาก "พื้นที่ดิสก์จริง"
แม้ว่า AUTOEXTENSIBLE จะเปิดเป็น YES และมีค่า MAXBYTES สูงมาก แต่การที่ไฟล์จะขยายขนาดได้จริงในทางปฏิบัตินั้น ต้องขึ้นอยู่กับปัจจัยภายนอกฐานข้อมูลด้วย:
- พื้นที่ดิสก์จริง (Physical Storage): โครงสร้างดิสก์ระดับ OS (Filesystem), ASM Disk Group หรือ Cloud Storage ต้องมีพื้นที่ว่างจริงรองรับ
- ข้อจำกัดระดับ PDB: ในสถาปัตยกรรม Multitenant อาจมีการตั้งค่าโควตาพื้นที่ (Storage Limit) กำกับไว้ที่ระดับ Pluggable Database (PDB) อีกชั้นหนึ่ง
ดังนั้น การสั่งเพิ่มค่า MAXBYTES หรือเปิด Autoextend เป็นเพียงการปรับเปลี่ยนตัวเลขขีดจำกัดเชิงตรรกะในฐานข้อมูลเท่านั้น แต่ไม่ได้เป็นการสร้างพื้นที่ดิสก์จริงขึ้นมาแต่อย่างใด
ขั้นที่ 4: ตรวจสอบแนวโน้มก่อนตัดสินใจแก้ไข (Best Practices)
เมื่อพบสัญญาณเตือนเรื่องพื้นที่เต็ม ควรปฏิบัติตามลำดับขั้นตอนดังนี้:
- หาสาเหตุการเติบโตผิดปกติ: ตรวจสอบก่อนว่ามี Segment, Table หรือ Index ใดที่มีข้อมูลเพิ่มขึ้นอย่างรวดเร็วผิดปกติหรือไม่ (เช่น มีการ Run Batch Process แล้วลืม Purge ข้อมูลทิ้ง)
- กรณีไม่ได้เปิด Autoextend: ตรวจสอบแผนการบริหารจัดการพื้นที่ร่วมกับ DBA ว่าควรใช้วิธี Resize เพิ่มขนาดไฟล์เดิม หรือขยายโดยการเพิ่ม Datafile ลูกใหม่
- กรณีเปิด Autoextend แต่ชนเพดาน (
MAXBYTES): ให้ตรวจสอบว่าโครงสร้างดิสก์ระดับล่างสุด (ASM / OS) ยังมีพื้นที่เหลือเพียงพอหรือไม่ หากพื้นที่ดิสก์จริงเหลือน้อย ต้องแก้ปัญหาด้วยการขยาย Disk Group หรือ Storage ด้านล่างก่อน ไม่ใช่เพียงแค่แก้ตัวเลขในฐานข้อมูลครับ
อ่านหัวข้อ Oracle อื่นต่อได้ที่ บทความ Oracle บน teeDBA.com
บทความที่เกี่ยวข้อง

ต่อ Oracle ไม่ได้: Host, Port และ Service Name ต้องตรวจตรงไหน?
แยก Host, Port และ Service Name ใน Oracle Easy Connect พร้อมลำดับตรวจเมื่อ client เชื่อมต่อไม่ได้

Oracle Database กับ Instance ต่างกันอย่างไร? แยกให้เห็นจากภาพเดียว
Database กับ Instance เป็นคนละส่วน ดูภาพและผล SQL จริงเพื่อแยกไฟล์ฐานข้อมูลออกจากส่วนที่กำลังทำงาน

อยากเรียน Oracle แต่ไม่รู้จะเริ่มตรงไหน? ลองเริ่มจากงานหนึ่งงาน
ไม่รู้จะเริ่มเรียน Oracle ตรงไหน? ลองเริ่มจากงานหนึ่งงาน ฝึก SQL ด้วยคำสั่งซื้อสามรายการ แล้วเลือกเรียน Database, Instance และ DBA ต่อให้เหมาะกับงาน