วันพฤหัสบดีที่ 20 พฤศจิกายน พ.ศ. 2557

ORACLE CHECKPOINTS



ORACLE CHECKPOINTS
จุดประสงค์ของ check point
            DB blocks จะถูกเก็บไว้ชั่วคราวใน DB buffer cache สำหรับ Blocks ที่ถูกอ่านจาก Data files จะถูกนำไปเก็บไว้ที่ DB buffer cache เพื่อให้ User อื่นๆสามารถใช้งานได้เลยโดยไม่ต้องอ่านจาก Disk
            เมื่อเราแก้ไข Row ใดๆก็ตามจะเป็นการแก้ไขที่ DB buffer cache ที่ตรงกับ Block ที่เก็บไว้ในตัวมันซึ่งเป็นการแก้ไขบน Memory  การเปลี่ยนแปลงนี้จะบันทึกไว้ใน Redo log buffer
                เมื่อ User ทำการ Commit , transaction ของ User จะถูกบันทึกลง Disk เพื่อจะได้เก็บข้อมูลไว้เป็น Permanent  การบันทึกนี้จะเก็บไว้ที่ไหน? ลงไปที่ Data file หรือไม่? ไม่ใช่!!! Transaction จะถูกบันทึกจาก Redo log buffer ลง Redo log file โดย LGWR
                ทำไม Oracle ถึงไม่บันทึกลง Data file เมื่อ User ทำการ Commit ไปเลย?  เหตุผลง่ายๆถ้า Oracle เลือกที่จะบันทึกตรงๆลง Data file เลย   DBWR จะต้องหา Block ใน Data file ก่อนแล้วถึงบันทึกลงไป
User จะต้องรอจนกว่า DBWR จะทำงานเสร็จถึงจะทำ Command ต่อไปได้ จึงทำให้มีผลกระทบกับ Performance มาก
                Redo log จึงมีบทบาทสำคัญในตรงนี้ การบันทึกข้อมูลลงใน Redo log จะเป็นแบบ Sequential write
LGWR แค่นำข้อมูลจาก Redo buffer ลง Redo log file แบบ sequential และ synchronous เพื่อที่ User จะได้ไม่ต้องรอนาน  และยิ่งไปกว่านั้น DBWR จะเขียนเป็นแบบ block แต่ LGWR จะเขียนแค่ transaction ดังนั้นจะเพิ่ม performance โดยลดจำนวนการเขียน data แบบ synchronous
            เมื่อไรที่ต้องเขียน Data block จาก Buffer ลง Data file?   Data block ใน Data file จะถูก update โดย DBWR เขียนแบบ asynchronous ด้วยบาง trigger…   Trigger เหล่านี้เรียกว่า Checkpoint
            Checkpoint เป็นการทำแบบ Synchronization ที่ถูกกำหนดในบางครั้ง จะทำให้บาง dirty block หรือทุกๆ dirty block จะถูกเขียนลง disk เพื่อจะมั่นใจได้ว่า data block จะถูกเขียนลง data file เรียบร้อย

เมื่อไรก็ตามที่ dirty block ถูกเขียนลง data file จะทำให้ Oracle สามารถ :
-         To reuse a redo log  : redo log file จะสามารถเขียนทับได้เมื่อ dirty block ที่เกี่ยวข้องทุกอันถูกเขียนลง disk แล้ว ถ้าเราพยายามจะ reuse มันก่อนที่ DBWR จะเขียนเสร็จ จะมีการแจ้งเตือนขึ้นมาใน  Alert log ว่า
Checkpoint not complete
-         To reduce instance recovery time  : เมื่อ Memory ของ DB Instance เพิ่มขึ้น อาจทำให้ DB Buffer cache ใหญ่มาก จึงต้องการ checkpoint บ่อยขึ้นเพื่อ limit recovery time
-         To free buffers for reads  : เราไม่สามารถอ่าน data ใหม่จาก disk ไปไว้ที่ dirty block จนกว่ามันจะถูกเขียนลง disk ดังนั้น DBWR จะเขียน dirty block ลง disk เพื่อเพิ่ม free block

เมื่อเกิด checkpoint สิ่งที่เกิดขึ้นคือ
-         DBWR เขียน dirty block บางอันหรือทั้งหมดลง data file
-         CKPT process updates control file and data file headers

Checkpoint ชนิดต่างๆใน Oracle
FULL CHECKPOINT
- Writes block images to the database for all dirty buffers from all instances.
- Statistics updated
  . DBWR checkpoints
  . DBWR checkpoint buffers written
  . DBWR thread checkpoint buffers written
- Caused by :
  . Alter system checkpoint [global]
  . ALter database begin backup
  . ALter database close
  . Shutdown [immediate]
- Controlfile and datafile headers are updated
  . Checkpoint_change#


THREAD CHECKPOINT
- Writes block images to the database for all dirty buffers from one instance
- Statistics updated
  . DBWR checkpoints
  . DBWR checkpoint buffers written
  . DBWR thread checkpoint buffers written
- Caused by :
  . Alter system checkpoint local
- Controlfile and datafile headers are updated
  . Checkpoint_change#


TABLESPACE AND DATA FILE CHECKPOINT
เมื่อ tablespace เข้าสู่ backup mode หรือ offline (normal), DBWR จะเขียนทุก dirty block ที่เกี่ยวข้องกับ tablespace นั้นลง data file ก่อนที่จะเปลี่ยนสถานะของ tablespace นั้น
- Writes block images to the database for all dirty buffers for all files of a tablespace from all instances
- Statistics updated
  . DBWR checkpoints
  . DBWR tablespace checkpoint buffers written
  . DBWR checkpoint buffers written
- Caused by :
  . Alter tablespace xxx offline normal
  . Alter tablespace xxx begin backup
  . Alter tablespace xxx read only
  . Alter tablespace xxx shrink space
- Controlfile and datafile headers are updated
  . Checkpoint_change#

PARALLEL QUERY CHECKPOINT
Parallel query จะใช้ direct path reads บ่อยๆ (Full table scan or Index fast full scan)
นั่นหมายถึง data block จะถูกอ่านขึ้น session’s PGA ตรงๆ ไม่ผ่าน DB buffer cache
แต่ถ้าขณะนั้นมี dirty buffer ที่เกี่ยวข้องอยู่ใน DB buffer cache , session นั้นจะไม่มีทางรู้ข้อมูลเวอร์ชั่นล่าสุดเว้นแต่ dirty block นั้นจะถูกเขียนลง disk ก่อนเริ่ม query
ดังนั้น Parallel query จะเริ่มด้วยการทำ checkpoint ที่เกี่ยวข้องกับ object นั้นๆก่อน
- Writes block images to the database for all dirty buffers belonging to objects accessed by the query from all instances.
- Statistics updated
  . DBWR checkpoints
  . DBWR checkpoint buffers written
- Caused by :
  . Parallel Query
  . Parallel Query component of Parallel DML (PDML) or Parallel DDL (PDDL)
- Mandatory for consistency
- Controlfile and datafile headers are updated
  . Checkpoint_change#


OBJECT CHECKPOINT
  เมื่อ object ถูก drop/truncate , session นั้นจะเริ่มทำ object checkpoint โดยบอก DBWR ให้เขียน dirty buffer ของ object นั้นลง disk
- Statistics updated
  . DBWR checkpoints
  . DBWR object drop buffers written
- Caused by dropping or truncating a segment:
  . Drop table XXX
  . Drop table XXX Purge
  . Truncate table xxx
  . Drop index xxx
- Mandatory for media recovery purposes
- Controlfile and datafile headers are updated
  . Checkpoint_change#

LOG SWITCH CHECKPOINT
- Writes the contents of the dirty buffers whose information is protected by a redo log to the database.
- Statistics updated
  . DBWR checkpoints
  . DBWR checkpoint buffers written
  . background checkpoints started
  . background checkpoints completed
- Caused by log switch
- Controlfile and datafile headers are updated
  . Checkpoint_change#

INCREMENTAL CHECKPOINT
  เป็นชนิดของการ checkpoint อย่างหนึ่งเพื่อหลีกเลี่ยงการเขียน dirty block จำนวนมากเมื่อเกิด log file switch และลดเวลาของการทำ Instance recovery (fast_start_mttr_target เกี่ยวข้องโดยตรงกับ incremental checkpoint)
DBWR จะเช็คทุกๆ 3 วินาทีเพื่อหา block ที่จะเขียนและจะ sleep ไปเมื่อไม่มี block ที่ต้องเขียนเมื่อเสร็จแล้วจะทำให้ CKPT เขียนตำแหน่ง checkpoint ไปที่ control file แต่จะยังไม่เขียนที่ data file header

Note : Incremental checkpoint ได้ถูก implement ด้วยสองอัลกอริทึ่มนี้ (ซับซ้อนมาก)
- Ageing algorithm
- LRU/TCH algorithm


Ref : http://oracleinaction.com/checkpoints/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น