วันอังคารที่ 12 พฤษภาคม พ.ศ. 2552

จำนวน datafile ที่สามารถสร้างได้ บน Oracle ดาต้าเบส

ผู้ดูแลจะไม่พบปัญหา จนต้องตอบคำถามเกี่ยวกับจำนวน datafile บนดาต้าเบสที่ไม่ใหญ่มากนัก
แต่หากดาต้าเบสมีขนาดใหญ่ จนต้องใช้จำนวน tablespace มากๆ มันเริ่มจะมีคำถามกลับมาที่จำนวนของ datafile ที่จะสร้างได้ในดาต้าเบส

ผู้ดูแลดาต้าเบสสามารถที่จะหาจำนวนของ datafile ที่จะสามารถสร้างบนดาต้าเบส ได้จาก DB_FILES พารามิเตอร์

SQL> show parameter db_files

NAME TYPE VALUE
----------------------
db_files integer 200
จากตัวอย่าง สามารถสร้าง datafile ได้ที่ 200 ไฟล์
แต่ทั้งนี้ต้องขึ้นกัน Operation System (การจำกัดจำนวนไฟล์บน OS) ด้วย... ซึ่งจะเจอได้น้อยมาก

หากมีการสร้าง datafile ที่มากกว่าค่า db_files พารามิเตอร์ แน่นอนจะทำให้ผู้ดูแลรู้จัก ORA Error มากขึ้นอีกตัว

SQL> create tablespace a01 datafile '+DATA1' size 20M;
create tablespace a01 datafile '+DATA1' size 20M
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded
อย่างไรก็ตาม ผู้ดูแลสามารถที่จะเพิ่มค่า DB_FILES พารามิเตอร์
แต่ต้อง restart ดาต้าเบส...
ในเคสที่ใช้ Oracle RAC ผู้ดูแลต้อง shutdown ทุก node (shutdown ดาต้าเบส นั่นเอง... ไม่สามารถ restart ทีละnode)

ค่า db_files เท่าไหร่... ถึงจะเป็นค่าที่เหมาะสม
นั่นเป็นสิ่งที่ผู้ดูแลต้องคิดและตอบโจทย์ เพราะมันผูกกับการจำกัดจำนวนไฟล์บน OS... แล้วยังใช้ SGA memory ในการเก็บข้อมูล datafile ด้วย

หลายคนที่ใช้ Oracle ดาต้าเบส คงมีคำถามว่า... แล้ว MAXDATAFILES บน controlfile ??? ...ยังมีผลเกี่ยวข้องหรือไม่
แน่นอน! ถ้าคุณใช้ Oracle 8i หรือสูงกว่า ค่า MAXDATAFILES บน controlfile จะการขยายโดยอัตโนมัติ... เมื่อมีการเพิ่มจำนวน datafile เกินค่า MAXDATAFILES แต่น้อยกว่าหรือเท่ากับค่า db_files (metalink: 331067.1)

ตัวอย่างการเพิ่ม db_files พารามิเตอร์ (เมื่อใช้ spfile)
SQL> show parameter db_files

NAME TYPE VALUE
----------------------
db_files integer 200

SQL> alter system set set db_files=500 scope=spfile;

SQL> shutdown immediate

SQL> startup

SQL> show parameter db_files

NAME TYPE VALUE
----------------------
db_files integer 500
การเปลี่ยนค่า db_files ไม่ใช่ปัญหา ถ้าระบบสามารถหยุดการใช้งาน
สิ่งที่ยากยิ่งกว่า คือการกำหนดค่า ว่าในเวลาหนึ่งปี หรือสองปี ต้องใช้จำนวน datafile เท่าไหร่

วันอังคารที่ 5 พฤษภาคม พ.ศ. 2552

การลดขนาด (oracle) database segment ออนไลน์

ตั้งแต่ oracle 10g เราสามารถออนไลน์ลดขนาด(shrink) segment เพื่อให้ได้พื้นที่ว่าง ส่งผลให้เกิดประสิทธิภาพกับการเก็บข้อมูล พร้อมกันนี้ยังช่วยลด High Water Mark (HWM)
อย่างไรก็ตามวิธีนี้ใช้ได้กับ tablespace ที่เป็น Locally Manage และ Automatic Segment Space Management (ASSM)

การลดขนาด(shrink) segment สามารถทำได้ทั้ง TABLE และ INDEX แต่อย่างไรก็ตามเราต้อง enable row movement บน TABLE เสียก่อน
การ enable/disable row movement คำสั่งนี้สามารถทำให้ package/procedure/function ที่ผูกกับ table นี้ invalid ได้

SQL> create table temp (id number);

Table created.

SQL> alter table temp shrink space;
alter table temp shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled


SQL> alter table temp enable row movement;

Table altered.

SQL> alter table temp shrink space;

Table altered.
การใช้คำสั่ง shrink เพื่อลดขนาด segment นั้น...
ALTER TABLE...SHRINK ช่วยบีบขนาดพื้นที่ของข้อมูล และลด HWM, ถ้า SHRINK SPACE COMPACT ช่วยบีบอัดข้อมูล แต่ HWM ไม่ได้เปลี่ยนแปลง, แต่... ถ้าเรา SPACE CASCADE มันจะกระทำกับ object ที่เกี่ยวข้องด้วย

การ shrink นี้ แน่นอนสามารถใช้กับ table, index (b-tree,bit-mapped) และ object บางปรเภท
เราสามารถหาข้อมูลได้จาก Oracle Document

อีกประเด็นเกี่ยวกับการ shrink ในระหว่างที่เรา shrink, ROWID อาจจะมีการเปลี่ยนแปลง เมื่อเราย้ายข้อมูลระหว่าง block ดังนั้นก็แน่นอนอีกนั่นแหละว่า เราไม่สามารถ shrink กับ materialized view ที่ใช้ rowid และเราต้อง enable row movement

อะไรที่เราต้องกังวลเมื่อทำการลดขนาด segment ด้วยวิธีนี้, การ lock ข้อมุลในระหว่างที่กระทำการ shrink นั้นจะเป็นในระดับ row หรือ ข้อมูลใน block ที่ถูกย้าย แน่นอนมันให้ lock บน DML ที่เป็น update/delete... ในขณะที่ HWM มีการปรับเปลี่ยนจะส่งผลให้เกิด lock ในระดับ exclusive จนปรับเปลี่ยนสำเร็จ

สำหรับ index(ไม่ทำให้ unusable)ไม่มีผลกระทบ

ในบางขณะเวลา เราอาจจำเป็นที่จะต้องแบ่งงานออก เป็นสองขั้นตอน โดยการ SHRINK SPACE COMPACT จากนั้น SHRINK SPACE ตามทีหลัง

SQL> alter table temp shrink space compact;

Table altered.

SQL> alter table temp shrink space;

Table altered.
การหาพื้นที่ว่างกับ TABLE บางครั้งเราคิดถึง ALTER TABLE...MOVE
แต่... ถ้าใช้ tablespace ที่เป็น ASSM ลอง ALTER TABLE...SHRINK มันอาจจะช่วยได้