จากการขั้นตอนติดตั้ง Oracle Data Guard 11gR2 (Primary & Standby Database)
- เครื่อง Standby ตอนแรกนั้น ผมใช้วิธี Create Standby Using DUPLICATE โดยวิธี duplicate ผ่าน rman นั้นจะทำการสร้าง Standby Redo Logs บน Standby Server ให้เอง แต่ต้องสร้าง Standby Redo Logs บน Primary Server ไว้ก่อน
- สาเหตุที่ควรต้องมี Standby Redo Logs บน Primary Server ก็เผื่อกรณีที่ว่ามีการสวิตซ์ Primary เป็น Standby กรณีเกิดปัญหาขึ้นกับตัว Primary เองซึ่งต้องโปรโมท Standby ขึ้นมาใช้งานก่อน จะได้ไม่ติดปัญหาต่อไป
- กลับกัน กรณีที่ต้องมี Redo Logs บน Standby Server ก็เป็นกรณีที่โปรโมท Standby ให้เป็น Primary Server ในอนาคตนั้นเอง
- ดังนั้นทำให้แต่ละ Primary & Standby Database จะประกอบด้วย Redo Logs Group ในแต่ละเครื่อง ด้วยกัน 2 group คือ
- Normal Redo Logs Group (เหมือนเครื่อง Oracle Database Standalone ทั่วไป)
- Standby Redo Logs Group
ดังนั้นเวลาเปลี่ยนขนาด Redo Logs ของ Member ใน Group ควรเปลี่ยนทั้ง 2 Group ข้างต้น
ส่วนสาเหตุที่เราจำเป็นต้องเปลี่ยนขนาดของ Redo Logs นั้น เกิดการ switches redo logs rate ต่อ ชม. เยอะเกินค่าแนะนำทั่วไป
มาจากบทความที่แล้ว How to check the frequency of redo log switches ?
ขั้นตอน Resizing Redo Logs in Data Guard
ล้อตามลิงค์ในส่วน Resources ด้านล่าง / แล้วเรียบเรียง / เพิ่มเติมกรณีต้องการใช้ Redo Logs Group ให้เป็นเลขเรียงกัน
- ssh เข้าไปยัง Primary & Standby Server
- ตรวจสอบ database_role ปัจจุบันว่าตรงตามที่เรา configuration ไว้ก่อนหน้าหรือไม่ ?
เครื่อง Primary Server
12345678910111213141516171819202122232425primary$ sqlplus / as sysdbaSQL> select status,instance_name,database_role from v$database,v$instance;STATUS INSTANCE_NAME DATABASE_ROLE------ ------------- --------------OPEN db01 PRIMARYSQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$log group by group#;GROUP# Size in MB------- ----------1 502 503 50SQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$standby_log group by group#;GROUP# Size in MB------- ----------4 505 506 50
เครื่อง Standby Server
12345678910111213141516171819202122232425standby$ sqlplus / as sysdbaSQL> select status,instance_name,database_role from v$database,v$instance;STATUS INSTANCE_NAME DATABASE_ROLE------ ------------- --------------OPEN db01 PHYSICAL STANDBYSQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$log group by group#;GROUP# Size in MB------- ----------1 502 503 50SQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$standby_log group by group#;GROUP# Size in MB------- ----------4 505 506 50 - มาดูเฉพาะฝั่ง Primary Server ก่อน สามารถลบเฉพาะ Group สถานะ INACTIVE และ UNASSIGNED เท่านั้น
กรณีที่ต้องการให้ชื่อ Group เรียงกัน และ ให้ทำขั้นตอน Drop Standby Redo Logs Group ก่อน
เช่น ผมต้องการ Group 1 – 5 เป็น Redo Logs Group และ 6 – 8 เป็น Standby Redo Logs Group** บนเครื่อง Primary ตัว Redo Logs ธรรมดาจะทำงาน ดังนั้น สามารถเริ่มทำ Standby Redo Logsได้ก่อน **
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061primary$ sqlplus / as sysdbaSQL> select group#,status from v$standby_log;GROUP# STATUS------ ------------4 UNASSIGNED5 UNASSIGNED6 UNASSIGNEDSQL> alter database drop standby logfile group 4;Database altered.SQL> alter database drop standby logfile group 5;Database altered.SQL> alter database drop standby logfile group 6;Database altered.SQL> alter database add standby logfile group 6 ('/u01/app/oracle/oradata/db01/standby_redo01.log') SIZE 200M REUSE;Database altered.SQL> alter database add standby logfile group 7 ('/u01/app/oracle/oradata/db01/standby_redo02.log') SIZE 200M REUSE;Database altered.SQL> alter database add standby logfile group 8 ('/u01/app/oracle/oradata/db01/standby_redo03.log') SIZE 200M REUSE;Database altered.SQL> select group#,status from v$standby_log;GROUP# STATUS------ ------------4 UNASSIGNED5 UNASSIGNED6 UNASSIGNEDSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$standby_log group by group#;GROUP# size in MB------ -------------4 2005 2006 200SQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/db01/redo04.log') SIZE 200M;Database altered.SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/db01/redo05.log') SIZE 200M;Database altered.SQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 ACTIVE2 ACTIVE3 CURRENT4 UNUSED5 UNUSED– กรณีที่ไม่มี Group INACTIVE จำเป็นต้องเพิ่ม Group ใหม่เข้าไป แล้วทำการ alter system switch logfile; หลายรอบหน่อย;
– เบื้องต้นไม่จำเป็นต้องทำคำสั่ง alter system checkpoint; ก่อนนะ ให้ทดลองทำการ alter system switch logfile; ไปก่อนแทนครับ (*กรณีจำเป็น เช่น รอนานแล้ว log ไม่เปลี่ยนสถานะจาก ACTIVE เป็น INACTIVE สักที)
– แล้วรอจน status ของ Group เป็น INACTIVE แล้วค่อย drop แล้ว create group ชื่อเดิม / เปลี่ยนขนาด size / ใช้ชื่อ filename เดิมผ่าน REUSE option123456789101112131415161718192021222324252627282930primary$ sqlplus / as sysdbaSQL> alter system switch logfile;System altered.SQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 INACTIVE2 ACTIVE3 ACTIVE4 CURRENT5 UNUSEDSQL> alter database drop logfile group 1;SQL> alter database add logfile group 1 ('/u01/app/oracle/oradata/db01/redo01.log') SIZE 200M REUSE;SQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 UNUSED2 ACTIVE3 ACTIVE4 CURRENT5 UNUSEDเสร็จสิ้นขั้นตอนฝั่ง Primary Server แล้ว
จะมาทำฝั่ง Primary อีกครั้งในการ switch logfile บน Primary เพื่อ switch logfile ในฝั่ง Standby Server
_ - มาดูฝั่ง Standby เหมือนฝั่ง Primary Server / Drop ได้เฉพาะ status เป็น CLEARING และ UNASSIGNED เท่านั้น
กรณีที่ต้องการให้ชื่อ Group เรียงกัน และ ให้ทำขั้นตอน Drop Standby Redo Logs Group ก่อน
เช่น ผมต้องการ Group 1 – 5 เป็น Redo Logs Group และ 6 – 8 เป็น Standby Redo Logs Group** ก่อนอื่นต้องปรับ standby_file_management เป็น Manual และยกเลิก apply log process จาก Primary **
123456789101112131415161718SQL> show parameter standby_file_managementNAME TYPE VALUE----------------------- ------- -------standby_file_management string AUTOSQL> alter system set standby_file_management=manual;System altered.SQL> show parameter standby_file_managementNAME TYPE VALUE----------------------- ------- -------standby_file_management string MANUALSQL> alter database recover managed standby database cancel;Database altered.
** บนเครื่อง Standby ตัว Standby Redo Logs จะทำงาน ดังนั้น สามารถเริ่มทำ Redo Logs ธรรมดาได้ก่อน **
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253standby$ sqlplus / as sysdbaSQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 CLEARING_CURRENT2 CLEARING3 CLEARINGSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$log group by group#;GROUP# size in MB------ -------------1 502 503 50SQL> alter database clear logfile group 2;Database altered.SQL> alter database drop logfile group 2;Database altered.SQL> alter database add logfile group 2 ('/u01/app/oracle/oradata/db01/redo02.log') SIZE 200M REUSE;Database altered.SQL> alter database clear logfile group 3;Database altered.SQL> alter database drop logfile group 3;Database altered.SQL> alter database add logfile group 3 ('/u01/app/oracle/oradata/db01/redo03.log') SIZE 200M REUSE;Database altered.SQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 CLEARING_CURRENT2 UNUSED3 UNUSEDSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$log group by group#;GROUP# size in MB------ -------------1 502 2003 200
ทำการ switch logfile บนฝั่ง Primary เพื่อให้ Redo Logs บนฝั่ง Standby rotate ด้วย
123456primary$ sqlplus / as sysdbaSQL> alter system switch logfile;System altered.
มาดูฝั่ง Standby และทำการแก้ไข Group 1 พร้อมปรับขนาดจาก 50M Size เป็น 200M ด้วย
12345678910111213141516171819202122232425262728standby$ sqlplus / as sysdbaSQL> select group#,status from v$log;GROUP# STATUS------ -------------------1 CLEARING2 CLEARING_CURRENT3 UNUSEDSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$log group by group#;GROUP# size in MB------ -------------1 502 2003 200SQL> alter database clear logfile group 1;Database altered.SQL> alter database drop logfile group 1;Database altered.SQL> alter database add logfile group 1 ('/u01/app/oracle/oradata/db01/redo01.log') SIZE 200M REUSE;Database altered.
ยังคงเหลือ Group 4, 5 ที่ถูกใช้งานใน Standby Logs Group อยู่ ค้างไว้ก่อน / ข้ามไปทำ Standby Logs Group ต่อไป
มาดู Standby Logs Group บน Standby Server กัน ( Drop -> Group 4 , 5, 6 | Create -> Group 6, 7, 8 )
12345678910111213141516171819standby$ sqlplus / as sysdbaSQL> select group#,status from v$standby_log;GROUP# STATUS------ -------------4 ACTIVE5 UNASSIGNED6 UNASSIGNEDSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$standby_log group by group#;GROUP# size in MB------ --------------4 505 506 50
Group 4 Active อยู่ข้ามไปก่อน / ลบ Group 5 , 6 / สร้าง 6 – 8 โลด
123456789101112131415161718192021222324252627282930313233343536standby$ sqlplus / as sysdbaSQL> alter database drop standby logfile group 5;Database altered.SQL> alter database drop standby logfile group 6;Database altered.SQL> alter database add standby logfile group 6 ('/u01/app/oracle/oradata/db01/standby_redo01.log') SIZE 200M REUSE;Database altered.SQL> alter database add standby logfile group 7 ('/u01/app/oracle/oradata/db01/standby_redo02.log') SIZE 200M REUSE;Database altered.SQL> alter database add standby logfile group 8 ('/u01/app/oracle/oradata/db01/standby_redo03.log') SIZE 200M REUSE;Database altered.SQL> select group#,status from v$standby_log;GROUP# STATUS------ -------------4 ACTIVE6 UNASSIGNED7 UNASSIGNED8 UNASSIGNEDSQL> select group#,sum(bytes/1024/1024)"size in MB" from v$standby_log group by group#;GROUP# size in MB------ --------------4 506 2007 2008 200
ส่วนการเปลี่ยนสถานะของ Group 4 ให้เป็น INACTIVE ต้องมีการ switch log file ที่เครื่อง Primary เพื่อให้ redo logs rotate
123456primary$ sqlplus / as sysdbaSQL> alter system switch logfile;System altered.
มาดูเครื่อง Standby ต่อ
1234567891011121314151617181920212223standby$ sqlplus / as sysdbaSQL> select group#,status from v$standby_log;GROUP# STATUS------ -------------4 UNASSIGNED6 ACTIVE7 UNASSIGNED8 UNASSIGNEDSQL> alter database drop standby logfile group 4;Database altered.SQL> select group#,status from v$standby_log;GROUP# STATUS------ -------------6 ACTIVE7 UNASSIGNED8 UNASSIGNED
บนเครื่อง Standby ไปทำ Group 4, 5 ที่ยังเหลือการทำอยู่ใน Redo Logs Group
123456789standby$ sqlplus / as sysdbaSQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/db01/redo04.log') SIZE 200M;Database altered.SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/db01/redo05.log') SIZE 200M;Database altered. - ปรับ standby_file_management เป็น AUTO และเริ่มทำการ apply log จากเครื่อง Primary ตามเดิม
123456789101112131415161718SQL> show parameter standby_file_managementNAME TYPE VALUE----------------------- ------- -------standby_file_management string MANUALSQL> alter system set standby_file_management=AUTO;System altered.SQL> show parameter standby_file_managementNAME TYPE VALUE----------------------- ------- -------standby_file_management string AUTOSQL> alter database recover managed standby database disconnect from session;Database altered. - อ่านมาถึงตรงนี้แล้ว… มีคำถามหรือไม่ว่า Redo Logs & Standby Redo Logs ไม่กำหนดจำนวน Group เท่าไปกันเลย ?
เพื่อต้องการให้เห็น Group ชัดเจนในการยกตัวอย่างเลยขอแยกชุดเป็น 1 – 5 และ 6 – 8 ครับ
หากไม่ติดขัดเรื่อง disk space หรือข้อจำกัดอื่นๆ ที่ชัดเจน ควรกำหนดให้ Group & Size เท่ากันไปเลย
เพราะเครื่อง Primary ใช้ Redo Logs Group ธรรมดา และ เครื่อง Standby ใช้ Standby Redo Logs Group นั้นเอง 🙂
v$log and v$standby_log บนเครื่อง Standby
Resources
- http://shivanandarao-oracle.com/2012/10/03/resizing-redo-logs-in-a-dataguard-envrionment-physical-standby-in-place/
- https://oracle-base.com/articles/11g/data-guard-setup-11gr2