วันอาทิตย์ที่ 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 เรียนรู้และพัฒนาไอเดีย ;)