แสดงบทความที่มีป้ายกำกับ 10g แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ 10g แสดงบทความทั้งหมด

วันเสาร์ที่ 27 เมษายน พ.ศ. 2556

_ALLOW_RESETLOGS_CORRUPTION คืออะไร?

ผมได้อ่านบทความ Opening the Door without the Keys ผมคิดว่าเป็นบนความที่น่าสนใจ และให้ไอเดียพอสมควร อย่างไรก็ตาม ผมจะกล่าวคร่่าวๆ เกี่ยวกับ "_ALLOW_RESETLOGS_CORRUPTION" พารามิเตอร์ (Undocument)

เมื่อเรา startup database ไม่ว่าจะเป็น RESETLOGS หรือ  NORESETLOGS  ขั้นตอนของ checkpoint จะต้องทำการเช็ค header ไฟล์ทั้งหมด ของ data files เพื่อให้แน่ใจว่าทุกๆ ไฟล์นั้นตรงกัน หรือสอดคล้องกัน (consistency) แต่หากเราเซต _ALLOW_RESETLOGS_CORRUPTION (TRUE) - สิ่งที่เกิดขึ้นคือ Header ของไฟล์จะไม่ถูกเช็คเมื่อเรา start database
มันนำมาซึ่งข้อมูลหาย และมีผลต่อความสมบูรณ์ของข้อมูล

ข้อดี - ในบางเหตุการณ์ เราสามารถ start database ถึงแม้ว่าbackup ที่มีนั้นไม่สมบูรณ์

ข้อเสีย - อย่างที่ทราบกันดีว่า ฐานข้อมูลจะไม่อยู่ในสภาพที่สอดคล้องกัน (inconsistency) เมื่อใช้พารามิเตอร์นี้ (เราอาจต้อง Export -> Create new database -> Import)

วันอาทิตย์ที่ 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 มีปัญหา หรือข้อมูลมีปัญหา

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