วันอาทิตย์ที่ 26 กรกฎาคม พ.ศ. 2552

Oracle Database Newbie: Overview โครงสร้าง Logical


โครงสร้าง Logical นั้นประกอบไปด้วย data blocks, extents, segments, and tablespaces.

Oracle Database Data Blocks

ขนาดเล็กที่สุดคงไม่พ้น Oracle database data block, ข้อมูลของ oracle database จะเก็บใน “data blocks”, 1 data block นั้นจะสอดคล้อง กับจำนวน byte ของขนาด physical database บน disk. ขนาดของ data block นั้นจะถูกกำหนดด้วยค่า “DB_BLOCK_SIZE” initialization parameter. อย่างไรก็ตามเรายังสามารถกำหนด block size อื่นๆ ได้อีก 4 block sizes

SQL> show parameter k_cache_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size big integer 0
db_2k_cache_size big integer 0
db_32k_cache_size big integer 0
db_4k_cache_size big integer 0
db_8k_cache_size big integer 0

ถ้าเรากำหนด DB_BLOCK_SIZE เป็น 8K ดังนั้น “db_8k_cache_size” จะไม่ถูกสนใจ (ignore) เมื่อเราต้องการ block size อื่นๆ อีก

Extents

ในลำดับต่อมาของ logical database คือ “extent” ซึ่งเป็นตัวกำหนดจำนวนของ data blockน็ปั

Segments

ในระดับที่สูงมาอีกของ extents ในส่วน logical คือ “segment” ซึ่งมองได้ว่าเป็นเซตของ extents โดยถูกจัดสร สำหรับ table, index rollback segment หรือ temporary. extents ทั้งหมดเป็นส่วนหนึ่งของ segment ซึ่งอยู่บน tablespace เดียวกัน แต่อาจอยู่บน data files ที่ต่างกัน

เมื่อ extents ของ segment เต็ม Oracle database จะจัดสรร extent ที่อื่น สำหรับ segment นั้น. extent จะถูกจะสรรรตามที่จำเป็น ดังนั้น extent ของ segment อาจอยู่ชิดกันหรือไม่ชิดกันก็ได้

Tablespaces

database ถูกแบ่งในส่วน logical เรียกว่า tablespaces ซึ่งกลุ่มนี้จะเกี่ยวข้องกับ data blocks, extents และ segments

ทุก oracle database ต้องมี SYSTEM tablespace และ SYSAUX tablespace ซึ่งถูกสร้าง auto เมื่อ database ถูกสร้าง

tablespaces ถูกสร้างเป็น “smallfile tablespace” หรือ “bigfile tablespace” แต่ถ้าไม่กำหนดจะเป็น smallfile tablespace

วันพุธที่ 22 กรกฎาคม พ.ศ. 2552

ต้องการ recreate temporary tablespace

ต้องการลดขนาด tempfile แต่พบปัญหา ORA-03297: file contains used data beyond requested RESIZE value

SQL> ALTER DATABASE TEMPFILE '+DATA/DB/tempfile/temp.305.615032955' RESIZE 50M;

ALTER DATABASE TEMPFILE '+DATA/DB/tempfile/temp.305.615032955' RESIZE 50M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

การแก้ปัญหาก็คือ recreate temporary tablespace:

- สร้าง temporary tablespace และเปลี่ยน default เพราะป้องกันไม่เกิดปัญหากับ sessions ที่ต้องการใช้ temporary tablespace.

SQL> CREATE SMALLFILE TEMPORARY TABLESPACE "TEMP2" TEMPFILE '+DATA' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.


SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP2";

Database altered.


SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.


- เมื่อลบตัวเก่าแล้วก็สร้างใหม่อีกครั้ง พร้อมกับเปลี่ยน default ไปที่ temporary tablespace ตัวเดิม

SQL> CREATE SMALLFILE TEMPORARY TABLESPACE "TEMP" TEMPFILE '+DATA' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP";

Database altered.

SQL> DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.


ตอนนี้เราก็ลดขนาด temporary tablespace เรียบร้อย... นี่เป็นวิธีง่ายๆ ใช่ไหมครับ;)

วันอาทิตย์ที่ 19 กรกฎาคม พ.ศ. 2552

Oracle Database Newbie: Overview โครงสร้าง Physical



โครงสร้าง Physical ของ oracle database ประกอบไปด้วย datafiles, control files, redo log files, archived redo log files, parameter files, alert และ trace files.

Oracle database ต้องมี datafile เพื่อเก็บข้อมูลของ database ซึ่งข้อมูลนั้นจะมองเป็น logical อันได้แก่ tables และ indexes เป็นต้น
สิ่งที่ควรรู้เกี่ยวกับ datafile:
- 1 หรือ หลาย datafiles รวมกัน ในเป็น logical เราเรียกว่า tablespace
- 1 datafile อยู่บน tablespace เดียวเท่านั้น แต่ 1 tablespace มี datafile 1 หรือ มากกว่า 1 ได้
- Datafiles สามารถให้ตัวมันเองขยายขนาดได้ auto เมื่อมีการใช้งานจนเต็ม
ข้อมูลในdatafile จะถูกอ่านเมื่อจำเป็นเท่านั้น เพราะเมื่อมีการอ่าน oracleจะเก็บข้อมูลเหล่านี้ ใน memory cache ของ database เช่น เมื่อเราต้องการข้อมูลใน Table แล้วข้อมูลนั้นไม่อยู่ใน memory cache มันจะอ่านจาก datafile และเก็บไว้ใน memory.
การเปลี่ยนแปลงข้อมูล และข้อมูลใหม่ จะไม่ได้ถูกเขียนลง datafiles ทันทีทันใด ข้อมูลจะอยู่ใน memory และเขียนลง datafiles ทั้งหมดโดยทีเดียวด้วย background process ที่เรียกว่า database writer process (DBWn)

Oracle database ต้องมี control file ซึ่งจะเก็บข้อมูลโครงสร้าง physical ของ database อันได้แก่
- ชื่อ database
- ชื่อ และ location ของ datafiles และ redolog files
- เวลามี database ถูกสร้าง
Oracle database สามารถมี control file ได้หลาย file
เมื่อ มีการเพิ่ม datafile หรือ redo log file; control files จะถูกเปลี่ยนแปลงข้อมูลเพื่อให้รู้ว่ามีการเพิ่ม datafile หรือ redo log file ซึ่งจะมีประโยชน์มากตอน database recovery
เราสามารถ backup control file จาก ”alter database backup” และยังสร้าง script สำหรับ สร้าง control files
alter database backup controlfile to 'controlfile_backup' reuse;
alter database backup controlfile to trace as 'controlfile_script' reuse;

อย่างไรก็ตาม เราควรจะ “CONFIGURE CONTROLFILE AUTOBACKUP ON”
Oracle จะทำการ auto backup control files และ server parameter file (SPFILE) ทุกครั้งที่มี backup รวมทั้งเมื่อ metadata ใน control file มีการเปลี่ยนแปลง

Online Redo Log Files
Oracle database ต้องมีอย่างน้อย 2 redo log group และ 1 redo log group มี 1 redo log file ซึ่งมันจะเก็บข้อมูลทุกอย่างที่มีการเปลี่ยนแปลงใน database (หรือ เรียกว่า transaction log)
เราสามารถมี หลาย redo log file ใน 1 redo log group

Archived Redo Log Files
Archived Redo Log Files เป็น offline file ที่ถูกก๊อปปี้ มาจาก Online redo log file. Oracle จะทำการบันทึก online redo log files เป็น Archived redo log files เมื่อ oracle database เป็น ARCHIVELOG mode
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
Parameter Files
Parameter Files จะเก็บ configuration parameters สำหรับ instance และ database ซึ่งประกอบไปด้วย parameter file(PFILE) และ server parameter file (SPFILE) และ server parameter file จะมีข้อดีกว่า
- สามารถเปลี่ยนแปลง บาง Parameter ในขณะที่ Instance ยังทำงาน
- เป็นศูนย์กลางของ parameter file จากทุกๆ Instance ใน Oracle Real Application Cluster Database

Alert and Trace Log Files
แต่ละ server และ background process สามารถเขียน trace file
เมื่อเกิด Internal error บน process นั้นๆ process นั้นจะเขียนข้อมูลเกี่ยวกับ error ลง trace file
ข้อมูลใน trace file สามารถนำไป พิจารณาในการ ปรับปรุง application หรือ Instance ให้ดีขึ้น
ทุก database มี alert log ซึ่งจะเก็บข้อความเกี่ยวกับ
- internal errors (ORA-600), block corruption errors (ORA-1578), และ deadlock errors (ORA-60)
- SQL เช่น CREATE/ALTER/DROP DATABASE/TABLESPACE และจาก Oracle Enterprise Manager หรือ SQL*Plus ที่เกี่ยวกับ STARTUP, SHUTDOWN, ARCHIVE LOG, RECOVER
- Errors เกี่ยวกับ shared server และ dispatcher processes
- Errors ขณะที่ materialized view (refresh)
บน 11g trace file และ alert file จะถูกเก็บที่ Automatic Diagnostic Repository (ADR) Home

Password File
Database สามารถใช้ password file ในการติดต่อ database กับ SYSDBA or SYSOPER privileges.

Backup Files
Backup files ไม่ได้เป็น database files ในทาง technique แต่มันประโยชน์ และถูกใช้ในการ recover database เมื่อ database มีปัญหา หรือข้อมูลมีปัญหา

วันจันทร์ที่ 13 กรกฎาคม พ.ศ. 2552

เปิด firewall policy อย่างไรกับ Oracle RAC


connect โดยใช้ VIP แล้ว
เวลาที่ cluster ตอบกลับ มันจะใช้ Public IP หรือ VIP ตอบกลับมาครับ เพราะน้องเขาต้องไปเปิด โพรีซีของพวกไฟร์วอลนะครั

นั่นเป็นคำถามที่ คนทำ Oracle RAC DBA อาจจะสงสับว่า ความจริงเป็นอย่างไร... แน่นอนถ้าเรา install Oracle RAC โดยที่ไม่ได้ มีการปรับปรุงไรเลย
นั่นเป็นสิ่งที่ผิดจริงหรือ ไม่

ลอง lsnrctl services แล้วลองดูว่า เห็นอะไร

$ lsnrctl services...Service "service1" has 2 instance(s).
Instance "db1", status READY, has 1 handler(s) for this service...
Handler(s):"DEDICATED" established:2 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac01)(PORT=1521))
Instance "db2", status READY, has 2 handler(s) for this service...Handler(s):"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac02)(PORT=1521))
"DEDICATED" established:8316 refused:0 state:readyLOCAL SERVER

นี่คือ default ที่ install เรียบร้อย เมื่อลอง TCPDUMP เพื่อจำ packets จากคำถามข้างบน
จะเห็นว่าตอนแรกนั้น client ติดต่อที่ VIP จริงแต่พอใช้งานไม่ใช่ แล้วดันไปใช้ที่ Public IP

client -> rac01-vip:1521..
client -> rac01:1521.
.
.


อย่างนี้ FailOver=ON ก็ไม่โอเคแน่นอน เพราะมันไม่ได้ใช้ VIP ดังนั้น เมื่อ node down ย่อมมีปัญหา (Firewall ต้องเปิดทั้ง VIP + Public IP)

ถ้า ศึกษาจาก Expert จะรู้ว่า client ต้องติดต่อ RAC Database ด้วย VIP ส่วนของ RAC servers เองต้อง register listener ที่ VIP ไม่ใช่ Public IP (metalink: มองว่าการ register listener ด้วย Public IP เป็นบัก จากการใช้ netca และ oracle tools ตอนสร้าง Listener)

กลับมาเรื่องของเรา ผมได้แก้ไขเกี่ยวกับ Listener อย่างคร่าวๆ เพื่อให้ register listener กับ VIP
-> listener.ora

rac01:
LISTENER_rac01 =
(DESCRIPTION_LIST =
(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521)(IP = FIRST)))
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01)(PORT = 1521)(IP = FIRST))))
)

rac02:
LISTENER_rac02 =
(DESCRIPTION_LIST =
(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521)(IP = FIRST)))
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02)(PORT = 1521)(IP = FIRST)))
))

-> tnsnames.ora on both nodes

LISTENERS_DB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521))
)

LISTENERS_rac01 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521))
)

LISTENERS_rac02 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521))
)

-> DATABASE


rac01:

SQL> show parameter listener

NAME TYPE VALUE
-----------------------------------------------------------------
local_listener string LISTENERS_rac01
remote_listener string LISTENERS_DB

rac02:
SQL> show parameter listener

NAME TYPE VALUE
-----------------------------------------------------------------
local_listener string LISTENERS_rac02
remote_listener string LISTENERS_DB

จากนั้นเช็ค lsnrctl services
$ lsnrctl services
.
.
Service "service1" has 2 instance(s).
Instance "db1", status READY, has 1 handler(s) for this service...
Handler(s):"DEDICATED" established:2 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=rac01-vip)(PORT=1521))
Instance "db2", status READY, has 2 handler(s) for this service...Handler(s):"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac02-vip)(PORT=1521))
"DEDICATED" established:8316 refused:0 state:readyLOCAL SERVER


โอเค และทดสอบอีกครั้งด้วย TCPDUMP
client -> rac01-vip:1521..
client -> rac01-vip:1521.
.
.

ซึ่งตอนนี้ไม่เห็น Packets ที่ใช้ Public IP อีกแล้ว(งั้นเปิด firewall ที่ VIP เป็นอันพอ)...
นี่เป็นสิ่งที่ Oracle RAC DBA เรียนรู้และพัฒนาไอเดีย ;)




วันอังคารที่ 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

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


วันพุธที่ 28 มกราคม พ.ศ. 2552

ROWID


rowid เ็ป็น column ที่ unique เก็บ address ของ row นั้นๆ

SQL> select rowid, id from A;

ROWID                      ID
------------------ ----------
AAAUd2AAHAAAACTAAB          1
AAAUd2AAHAAAACTAAC          2

ตั้งแต่ Oracle Release 8i เราจะพบ Extended Rowids ซึ่งจะเก็บด้วย BASE64 Encoding
ซึ่่งแบ่งเป็น 4 ส่วน

- OOOOOO: เรียกว่า data object number จะเป็นตัวบอกเกี่ยวกับ segment 
- FFF: ตัวบอกกี่ยวกับ datafile number
- BBBBBB: เป็นตัวบอกว่าอยู่บน block number อะำไรของ datafile...
- RRR: row...

 SELECT ROWID, 
   SUBSTR(ROWID,1,6) "OBJECT", 
   SUBSTR(ROWID,7,3) "FIL", 
   SUBSTR(ROWID,10,6) "BLOCK", 
   SUBSTR(ROWID,16,3) "ROW" from A;

ROWID              OBJECT                   FIL          BLOCK                    ROW
------------------ ------------------------ ------------ ------------------------ ------------
AAAUd2AAHAAAACTAAB AAAUd2                   AAH          AAAACT                   AAB
AAAUd2AAHAAAACTAAC AAAUd2                   AAH          AAAACT                   AAC

อย่างไรก็ตามเราสามารถหาข้อมูล เกี่ยวกับ rowid โดยใช้ dbms_rowid

> เช็ค datafile ที่ rowid  อยู่

SQL> select file_name
  2   from dba_data_files
  3   where file_id = dbms_rowid.rowid_to_absolute_fno('AAAUd2AAHAAAACTAAB', user, 'A');

FILE_NAME
--------------------------------------------------------------------------------
+DATA1/test.274.673800173


> เช็ค block ที่  rowid อยู่

SQL> select dbms_rowid.rowid_block_number('AAAUd2AAHAAAACTAAB') from dual;

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAAUD2AAHAAAACTAAB')
---------------------------------------------------
                                                147


> และสามารถเช็คได้ว่า อยู่ที่ row ไหน

SQL> select dbms_rowid.rowid_row_number('AAAUd2AAHAAAACTAAB') from dual;

DBMS_ROWID.ROWID_ROW_NUMBER('AAAUD2AAHAAAACTAAB')
-------------------------------------------------
                                                1

เรายังสามารถใช้ rowid ได้มากมาย...

วันเสาร์ที่ 10 มกราคม พ.ศ. 2552

เปลี่ยน PORT 8080 บน Oracle Express


เมื่อลง oracle express เราจะเข้าใช้งานเว็บ

http://localhost:8080/apex

แต่หลายคนจะเกิดปัญหาเพราะว่า Port นี้ถูใช้ด้วย Program อื่นๆๆ เราสามารถเปลี่ยนได้ ด้วย dbms_xdb package.

dbms_xdb.sethttpport('new_port'); ใช้เปลี่ยนport http

dbms_xdb.setftpport('new_port'); ใช้เปลี่ยนport ftp

ตัวอย่าง
sqlplus / as sysdba SQL> select dbms_xdb.gethttpport , dbms_xdb.getftpport from dual;
GETHTTPPORT GETFTPPORT
----------- ----------
8080 0

SQL> begin
2 dbms_xdb.sethttpport('8081');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> select dbms_xdb.gethttpport , dbms_xdb.getftpport from dual;
GETHTTPPORT GETFTPPORT
----------- ----------
8081 0

Test.... http://localhost:8081/apex/