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/