วันอังคารที่ 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 มันอาจจะช่วยได้

วันพฤหัสบดีที่ 30 เมษายน พ.ศ. 2552

ต้องการตรวจสอบการทำงานของ sys บน oracle

เมื่อผู้ดูแล oracle database ต้องการที่จะการตรวจสอบ(audit)การทำงานของผู้ใช้ 
ผู้ดูแลสามารถใช้ audit_trail พารามิเตอร์ เพื่อเริ่มต้นการตรวจสอบผู้ใช้งานได้
แต่อย่างไรก็ตาม การใช้ audit_trail ไม่สามารถที่จะตรวจสอบการทำงานของ sys

ดังนั้นเราต้องใช้ AUDIT_SYS_OPERATIONS เท่ากับ true เข้ามาช่วย 
เพื่อตรวจสอบการทำงานของ sys หรือผู้ใช้ที่ติดต่อดาต้าเบสด้วย sysdba หรือ sysoper

ตัวอย่าง:
SQL> show parameter audit_sys_operations
NAME                                 TYPE        VALUE
-----------------------------------------------------------------
audit_sys_operations      boolean     FALSE
SQL> alter system set audit_sys_operations=true scope=spfile;
SQL> shutdown
SQL> startup
SQL> show parameter audit_sys_operations
NAME                                 TYPE        VALUE
-----------------------------------------------------------------
audit_sys_operations      boolean     TRUE

ข้อมูลในการตรวจสอบจะถูกเขียนลง OS ในโฟลเดอร์ audit_file_dest 

SQL> show parameter audit_file_dest
NAME                                 TYPE        VALUE
------------------------------------------------------------------
audit_file_dest       string      $ORACLE_BASE/admin/$ORACLE_SID/adump  
 ตัวอย่างการเช็ค audit ไฟล์:
SQL> show parameter audit_file_dest
NAME                                 TYPE        VALUE
------------------------------------------------------------------
audit_file_dest       string      $ORACLE_BASE/admin/$ORACLE_SID/adump                                         
$ sqlplus / as sysdba
SQL> SELECT p.spid FROM   v$process p,   v$session s WHERE  p.addr = s.paddr and s.sid = (SELECT SYS_CONTEXT ('USERENV', 'SID') from dual);
SPID
------------
25561

SQL> select 'test' from dual;

'TES
----
test

$ cat $ORACLE_BASE/admin/$ORACLE_SID/adump/ora_25561.aud

Audit file $ORACLE_BASE/admin/$ORACLE_SID/adump/ora_25561.aud
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
.
.
.
Wed Mar 28 15:47:28 2007
ACTION : 'CONNECT'
DATABASE USER: '/'
PRIVILEGE : SYSDBA
CLIENT USER: oracle
CLIENT TERMINAL: 
STATUS: 0
.
.
.
Fri May  1 02:22:33 2009
LENGTH : '154'
ACTION :[23] 'select 'test' from dual'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/9'
STATUS:[1] '0'
จากตัวอย่างข้างบน จะแสดงข้อมูลการใช้งานของ session ที่ติดต่อดาต้าเบส ด้วย sysdba

หากต้องการให้ฟอร์แมทใน audit ไฟล์ เป็น XML เราต้องเซตค่า AUDIT_TRAIL เป็น XML

เมื่อเราเริ่มต้นการตรวจสอบผู้ใช้งาน สิ่งที่สำคัญอย่างหนึ่งที่ขาดไม่ได้ ก็คือ การเข้าไปตรวจสอบข้อมูล อย่างต่อเนื่อง