Thursday, May 7, 2009

การแบ็คอัพแบบ Copy Incremental Level 0, 1 (Archivelog Mode)

ข้อเขียนนี้ช่วยฉัน: 
Updated: 5/4/2009

การแบ็คอัพบนเครื่องที่ใช้งานจริง (Production Server)
1. ดาต้าเบสใช้ archivelog mode
การ ดูว่าดาต้าเบสอยู่ใน mode archivelog หรือเปล่า
ล็อคอินเข้า SQL*Plus ด้วย sys as sysdba

--***************************************************************
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 16
Next log sequence to archive 18
Current log sequence 18
SQL>
--***************************************************************

ตรงบรรทัด Database log mode จะต้องเป็น Archive Mode
และ Automatic archival ต้องเป็น Enabled
ถ้าหากว่า Database log mode เป็น No Archive Mode ให้ทำดังนี้

--***************************************************************
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 83887484 bytes
Database Buffers 75497472 bytes
Redo Buffers 7139328 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 16
Next log sequence to archive 18
Current log sequence 18
SQL>
--***************************************************************

2. ข้อมูลของการแบ็คอัพ รวมทั้ง archived logs จะถูกเก็บใน Flash Recovery Area
เมื่อ archive log list จะมี Archive destination เป็น USE_DB_RECOVERY_FILE_DEST

3. คอนฟิค RMAN ดังนี้

C:\> RMAN

RMAN> CONNECT TARGET SYS;

-->> กำหนดว่าจะให้คงไฟล์แบ็คอัพไว้ได้นานแค่ไหน เช่น RETENTION POLICY=1 หมายความว่าจะเก็บไฟล์แบคอัพไว้เพียงชุดเดียว ถ้ามีไฟล์แบ็คอัพใหม่ออกมาตัวเก่าก็จะถูกกำหนดให้ obsolete รอเวลาการลบออกเป็นต้น
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
-->> ถ้าใน Flash Recovery Area มีไฟล์แบ็คอัพที่มีข้อมูลแบ็คอัพชุดเดียวกัน (เช่นมี SCN ชุดเดียวกัน) อยู่แล้ว ก็จะไม่แบ็คอัพซ้ำ
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
-->> กำหนดให้แบ็คอัพ controlfile และ spfile ทุกครั้งที่แบ็คอัพ กรณีไม่ได้ใช้ catalog ควรใช้ฟีเจอร์นี้
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

--***************************************************************************
-->> อันนี้ ถ้ามีเทปก็คอนฟิค
CONFIGURE DEVICE TYPE sbt PARMS='...' PARALLELISM 1; # PARMS are vendor-specific
--***************************************************************************
-->> ตรวจดูคอนฟิคอีกครั้งโดยใช้คำสั่ง
RMAN> SHOW ALL;
RMAN> EXIT;

4. กำหนดขนาดของ Flash Recover Area (FRA) โดยให้มีขนาดอย่างน้อยที่สุดเท่ากับ
ขนาดของ datafile (.DBF) ทั้งหมดรวมกัน ยกเว้น datafile ที่เป็นของ temporary tablespace
+ ขนาดของไฟล์ incremental backup จำนวน 1 ไฟล์
+ ขนาดของไฟล์ archived logs (ถ้าเราเก็บ archived logs ใน FRA) ตามจำนวนวันที่ต้องการให้ย้อนหลังไปได้ หรือจำนวนของวันที่ห่างกันของการแบ็คอัพแต่ละครั้ง บวกด้วย 1
เช่นถ้าแบ็คอัพทุก ๆ 3 วัน ก็ต้องเตรียมพื้นที่ให้พอเก็บ archivelog เป็นจำนวน 4 วัน

การกำหนดขนาดของ flash recovery area ทำได้ดังนี้
สมมติว่าเราต้องการกำหนดขนาดเป็น 10G
ล็อคอินเข้า SQL*PLus ด้วย sys as sysdba

SQL> select name,space_limit,space_used from v$recovery_file_dest;

NAME SPACE_LIMIT SPACE_USED
-------------------------------------------------- ----------- ----------
D:\oracle\product\10.2.0/flash_recovery_area 1073741824 1017326080

SQL> alter system set db_recovery_file_dest_size = 10G;

System altered.

ขนาดที่กำหนดขึ้นนี้เป็นการบอก Oracle ว่าขนาดของ FRA มีได้สูงสุด 10G ถ้าข้อมูลทั้งหมดใน FRA เกินขนาดที่ระบุนี้ระบบจะ Hang

5. เขียนสคริปต์ที่จะใช้รันทุกวัน
RMAN> RECOVER COPY OF DATABASE WITH TAG "whole_db_copy";

RMAN> BACKUP INCREMENTAL LEVEL 1
FOR RECOVER OF COPY WITH TAG "whole_db_copy" DATABASE;

--***************************************************************************
-->> กรณีมีเทปจะแบ็คอัพเอา flash recovery area ขึ้นเทป
RMAN> BACKUP RECOVERY AREA;
-->> ลบไฟล์ที่ obsolete ออกจากเทป
RMAN> DELETE OBSOLETE DEVICE TYPE sbt;
--***************************************************************************
สมมติว่าไม่มีไฟล์แบ็คอัพชื่อ "whole_db_copy" อยู่ก่อนหน้านี้ ผลของการรันสคริปต์ข้างบนทุกวันจะเป็นดังนี้
> ในวันแรก, คำสั่ง RECOVER จะไม่มีผลอะไร, ส่วนคำสั่ง BACKUP... FOR RECOVER OF COPY... จะสร้างไฟล์แบ็คอัพ level 0 (คล้ายการ copy ไฟล์จาก original datafiles)
> วันที่สอง, คำสั่ง RECOVER ยังคงไม่ทำอะไร เพราะว่ายังไม่มีไฟล์แบ็คอัพ incremental level1 มาให้อัพเดท, ส่วนคำสั่ง BACKUP... จะสร้างไฟล์แบ็คอัพที่เป็น incremental level 1
> วันต่อมา, คำสั่ง RECOVER จะเอาไฟล์ incremental level 1 ที่ได้จากวันก่อนหน้ามาอัพเดทไฟล์แบ็คอัพ level 0 ที่ได้จากวันแรก ทำให้ไฟล์แบ็คอัพ level 0 นี้มีความทันสมัยขึ้นเทียบเท่ากับวันที่สอง, คำสั่ง BACKUP... จะทำการแบ็คอัพ incremental level 1 ของวันนี้

สมมติอีกว่าแผนการแบ็คอัพนี้ให้เริ่มต้นเมื่อวันที่ 1 กุมภาพันธ์ ข้อมูลข้างล่างนี้แสดงให้เห็นว่าเนื้อหาใน flash recovery area เปลี่ยนไปอย่างไรในแต่ละวันเมื่อใช้แผนการแบ็คอัพแบบนี้
วันที่ Sun Feb1
ผลของการรันสคริปต์ :
1) พยายามอัพเดทแบ็คอัพ level 0 ด้วยไฟล์แบ็คอัพ incremental แต่ไม่เป็นผล เพราะไม่มีแบ็คอัพ level 0
2) แบ็คอัพ level 0
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) เริ่มมีไฟล์แบ็คอัพ level 0 ที่มี SCN ตรงกับวันอาทิตย์ที่ 1
--***************************************************************************
ความเปลี่ยนแปลงของเนื้อหาในเทป (ถ้ามีการรันคำสั่งแบ็คอัพลงเทป)
1) ไฟล์แบ็คอัพ level 0
2) ไฟล์อื่นๆ ใน flash recovery area เช่น archived redo logs จะถูกก๊อปปี้ลงเทป ไฟล์เหล่านี้อาจจะถูกลบออกจาก flash recovery area (โดยอัตโนมัติ) เมื่อมีความต้องการพื้นที่
--***************************************************************************

วันที่ Mon Feb2
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 ซึ่งก็ยังคงไม่เป็นผล เพราะยังไม่มีไฟล์แบ็คอัพ incremental level 1
2) เริ่มแบ็คอัพ Incremental Level 1
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 ที่ยังคงมี SCN ของวันอาทิตย์ที่ 1เหมือนเก่า
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงเริ่มจากวันที่ 1 Feb จนถึงวันจันทร์ที่ 2 Feb
3) มีไฟล์ archive logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 1 จนถึง ณ ขณะปัจจุบัน
ความเปลี่ยนแปลงของเนื้อหาในเทป
--***************************************************************************
ความเปลี่ยนแปลงของเนื้อหาในเทป (ถ้ามีการรันคำสั่งแบ็คอัพลงเทป)
1) ไฟล์แบ็คอัพ level 0 และ ไฟล์แบ็คอัพ incremental level 1
2) ไฟล์อื่นๆ ใน flash recovery area เช่น archived redo logs จะถูกก๊อปปี้ลงเทป ไฟล์เหล่านี้อาจจะถูกลบออกจาก flash recovery area (โดยอัตโนมัติ) เมื่อมีความต้องการพื้นที่
3) ไฟล์ที่ obsolete จะถูกลบออกจากเทป
--***************************************************************************

วันที่ Mon Feb3
ผลของการรันสคริปต์ :
1) อัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 สำเร็จ แบ็คอัพ level 0 ขณะนี้มีความทันสมัยเทียบเท่ากับวันวาน (เนื่องจากเอา incremental แบ็คอัพของวันวานมาอัพเดทนั่นเอง)
2) เริ่มแบ็คอัพ Incremental Level 1
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 แต่ SCN (รวมทั้งข้อมูล) ได้อัพเดทไปจนถึงวันที่ SCN ของไฟล์ level 1 อันสุดท้าย (วันที่ 2 Feb)
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงที่เกิดขึ้นกับระบบฐานข้อมูล 24 ชั่วโมงก่อนหน้าไว้
3) มีไฟล์ archived logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 1 จนถึง ณ ขณะปัจจุบัน
--***************************************************************************
ความเปลี่ยนแปลงของเนื้อหาในเทป (ถ้ามีการรันคำสั่งแบ็คอัพลงเทป)
1) ไฟล์แบ็คอัพ level 0 และ ไฟล์แบ็คอัพ incremental level 1
2) ไฟล์อื่นๆ ใน flash recovery area เช่น archived redo logs จะถูกก๊อปปี้ลงเทป ไฟล์เหล่านี้อาจจะถูกลบออกจาก flash recovery area (โดยอัตโนมัติ) เมื่อมีความต้องการพื้นที่
3) ไฟล์ที่ obsolete จะถูกลบออกจากเทป
--***************************************************************************
หมายเหตุ
ไฟล์ incremental backup และ archived logs ที่หมดประโยชน์ คือไม่สามารถนำมาใช้ rolled-forward แบ็คอัพ level 0 จะถูกลบทิ้งโดยอัตโนมัติเมื่อระบบการแบ็คอัพต้องการใช้พื้นที่ใน flash recovery area

ถ้าลองเปลี่ยนตัวอย่างข้างบนเล็กน้อย โดยหากต้องการให้ flash recovery area เก็บข้อมูลที่เป็น archived logs และ incremental backups ไว้เป็นจำนวน n วัน เพื่อที่จะสามารถจะ recover ย้อนกลับไปในเวลาใด เวลาหนึ่งในช่วง n วันนี้ได้ จะต้องทำดังนี้คือ
กำหนดขนาดของ Flash Recover Area โดยให้มีขนาดอย่างน้อยที่สุดเท่ากับ
ขนาดของ datafile (.DBF) ทั้งหมดรวมกัน ยกเว้น datafile ที่เป็นของ temporary tablespace
+ ขนาดของไฟล์ incremental backup จำนวน n ไฟล์
+ ขนาดของไฟล์ archived logs ตามจำนวนวันที่ต้องการให้ย้อนหลังไปได้ หรือจำนวนของวันที่ห่างกันของการแบ็คอัพแต่ละครั้ง บวกด้วย 1
เช่นถ้าแบ็คอัพทุก ๆ 3 วัน ก็ต้องเตรียมพื้นที่ให้พอเก็บ archivelog เป็นจำนวน 4 วัน

การกำหนดขนาดของ flash recovery area ทำได้ดังนี้
ล็อคอินเข้า SQL*PLus ด้วย sys as sysdba

SQL> select name,space_limit,space_used from v$recovery_file_dest;

NAME SPACE_LIMIT SPACE_USED
-------------------------------------------------- ----------- ----------
D:\oracle\product\10.2.0/flash_recovery_area 1073741824 1017326080

SQL> alter system set db_recovery_file_dest_size = 4G;

System altered.

โดยใช้สคริปต์ข้างล่างนี้ในการ backup

RECOVER COPY OF DATABASE TAG "whole_db_copy" UNTIL TIME 'SYSDATE-3';
# Make an incremental backup of the database to the flash recovery area.
BACKUP INCREMENTAL LEVEL 1
FOR RECOVER OF COPY WITH TAG "whole_db_copy"
DATABASE;

ส่วนที่เพิ่มขึ้นมาคือ UNTIL TIME 'SYSDATE-3' ซึ่งเป็นตัวที่บอกว่า การ recover copy ให้ทำมาจนถึง 3 วันก่อนหน้าวันปัจจุบัน (ซึ่งเมื่อรวมกับ archived logs ของวันที่ SYSDATE-3 จนถึงวันปัจจุบัน จะสามารถ recover ไปที่จุดใด ๆในช่วง 3 วันดังกล่าวได้)

วันที่ Sun Feb1
ผลของการรันสคริปต์ :
1) พยายามอัพเดทแบ็คอัพ level 0 ด้วยไฟล์แบ็คอัพ incremental แต่ไม่เป็นผล เพราะไม่มีแบ็คอัพ level 0
2) สร้างแบ็คอัพ level 0
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) เริ่มมีไฟล์แบ็คอัพ level 0 ที่มี SCN ตรงกับวันอาทิตย์ที่ 1 Feb

วันที่ Mon Feb2
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 ซึ่งก็ยังคงไม่เป็นผล เพราะยังไม่มีไฟล์แบ็คอัพ incremental level 1
2) เริ่มแบ็คอัพ Incremental Level 1 ของการเปลี่ยนแปลงในวันที่ 2 Feb
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 ที่ยังคงมี SCN ของวันอาทิตย์ที่ 1 เหมือนเก่า
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงเริ่มจากวันที่ 1 Feb จนถึงวันจันทร์ที่ 2 Feb
3) มีไฟล์ archive logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 1 จนถึง ณ ขณะปัจจุบัน

วันที่ Tue Feb3
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 แต่ก็ยังไม่สำเร็จ เพราะว่ายังไม่มีไฟล์แบ็คอัพที่เก่าพอที่จะ roll forward ไปที่วันที่ SYSDATE-3
2) เริ่มแบ็คอัพ Incremental Level 1 ของการเปลี่ยนแปลงในวันที่ 3 Feb
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 ที่ยังคงมี SCN ของวันอาทิตย์ที่ 1 เหมือนเก่า
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงที่เกิดขึ้นกับระบบฐานข้อมูลในวันที่ 2 Feb (1 ไฟล์) และวันที่ 3 Feb (อีก 1 ไฟล์)
3) มีไฟล์ archived logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 1 จนถึง ณ ขณะปัจจุบัน

วันที่ Wed Feb4
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 แต่ก็ยังไม่สำเร็จ เพราะว่ายังไม่มีไฟล์แบ็คอัพที่เก่าพอที่จะ roll forward ไปที่วันที่ SYSDATE-3
2) เริ่มแบ็คอัพ Incremental Level 1 ของการเปลี่ยนแปลงในวันที่ 4 Feb
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 ที่ยังคงมี SCN ของวันอาทิตย์ที่ 1 เหมือนเก่า
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงที่เกิดขึ้นกับระบบฐานข้อมูลในวันที่ 2 Feb (1 ไฟล์), วันที่ 3 Feb (อีก 1 ไฟล์) และวันที่ 4 Feb (วันปัจจุบัน)
3) มีไฟล์ archived logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 1 จนถึง ณ ขณะปัจจุบัน


วันที่ Thu Feb5
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 สำเร็จ ด้วยไฟล์แบ็คอัพ incremental ไฟล์แรกคือของวันที่ 2 Feb
2) เริ่มแบ็คอัพ Incremental Level 1 ของการเปลี่ยนแปลงในวันที่ 5 Feb
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 แต่ SCN (รวมทั้งข้อมูล) ได้อัพเดทไปจนถึงวันที่ SCN ของไฟล์ level 1 ของวันที่ SYSDATE - 3 (คือวันที่ 2)
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงที่เกิดขึ้นกับระบบฐานข้อมูลตั้งแต่วันที่ 2 Feb จนถึงวันปัจจุบัน
3) มีไฟล์ archived logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ 2 (archived logs ของวันที่ 1 obsolete ไปแล้ว เนื่องจากแบ็คอัพ level 0 ถูก update เป็นวันที่ 2 แล้ว) จนถึง ณ ขณะปัจจุบัน


หลังวันที่ 5
ผลของการรันสคริปต์ :
1) พยายามอัพเดทไฟล์ level 0 ด้วยไฟล์แบ็คอัพ incremental level 1 สำเร็จ ด้วยไฟล์แบ็คอัพ incremental ของวันที่ SYSDATE - 3
2) เริ่มแบ็คอัพ Incremental Level 1 ของการเปลี่ยนแปลงในวันนั้น ๆ
ความเปลี่ยนแปลงของเนื้อหาของ flash recovery area เมื่อรันสคริปต์ :
1) ยังคงมีไฟล์เดิมคือ ไฟล์แบ็คอัพ level 0 แต่ SCN (รวมทั้งข้อมูล) ได้อัพเดทไปจนถึงวันที่ SCN ของไฟล์ level 1 ของวันที่ SYSDATE - 3
2) มีไฟล์แบ็คอัพ incremental level 1 ซึ่งเก็บความเปลี่ยนแปลงที่เกิดขึ้นกับระบบฐานข้อมูลของสามวันย้อนหลัง
3) มีไฟล์ archived logs ซึ่งเริ่มตั้งแต่เมื่อวันที่ SYSDATE - 3 จนถึง ณ ขณะปัจจุบัน

No comments:

Post a Comment