我有一些客户,对于ORL和SRL的使用不太熟悉。简单介绍一下这个REDO的具体应用。
一般Primary和Standby两方都要构建ORL和SRL,ORL和SRL的size最好一样大。SRL的group个数比ORL大一个以上。
Primary用ORL,不用SRL,Standby用SRL,不用ORL。
Primary的SRL和Standby的ORL在switchover,互换角色之后使用。
Standby端的ORL,虽然不使用,但是vSlog的Status的状态是更新的。在12.1.0.2/12.2.0.1之后,修正Bug 16091872,
带来的影响是v$log的Status显示为UNUSED,不再随着primary的ORL更新。
例如
11.2
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME CON_ID
---------------- ------------- --------- ------------ --------- ----------
1 1 58 52428800 512 1 YES
CLEARING ★★ 1976963 24-DEC-18 2011322 25-DEC-18 0
2 1 59 52428800 512 1 YES
CURRENT ★★ 2011322 25-DEC-18 1969237 24-DEC-18 0
3 1 57 52428800 512 1 YES
CLEARING ★★ 1969237 24-DEC-18 1976963 24-DEC-18 0
12.2
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME CON_ID
---------------- ------------- --------- ------------ --------- ----------
1 1 0 209715200 512 1 YES
UNUSED★★ 0 0 0
2 1 0 209715200 512 1 YES
UNUSED★★ 0 0 0
3 1 0 209715200 512 1 YES
UNUSED ★★ 0 0 0
对于ORL,Oracle推荐使用多重化,也就是创建多个REDO Member. 因为,ORL的损坏会影响数据库的操作。
因此,通常使用多个来提高容错能力。
但是对于SRL,Oracle不推荐多重化,推荐只使用一个SRL Member。因为即使SRL坏了,可以用archivelog
来继续应用REDO,不需要使用SRL来预防数据的破损。而且SRL的多重化会使 I/O增多。所以,Oracle推荐
SRL只用一个member。
还有一点:
ORL是循环使用的:
Group1→Group 2→Group 3→Group1→Group 2→Group 3→。。。
而SRL不是循环使用:
没有具体的使用顺序,可能只是用前面一个,或是前面两个SRL,只要可用就行。可能后面很多Group从来没用过,这事没有问题的。
例如:
Group4→Group 5→Group4→Group 5→。。。
ORL和SRL的重建方法:
先确认ORL和SRL的group数和size
SQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$log group by group#;
GROUP# Size in MB
---------- ----------
1 50
2 50
3 50
SQL> select group#,sum(bytes/1024/1024)"Size in MB" from v$standby_log group by group#;
GROUP# Size in MB
---------- ----------
6 50
4 50
5 50
7 50
把standby_file_management改成MANUAL:
SQL> show parameter standby_file_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string AUTO
SQL> alter system set standby_file_management=manual;
System altered.
SQL> show parameter standby_file_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string MANUAL
在Primary端修改或重建ORL:
确认LOG的状态
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 INACTIVE
3 CURRENT
如果是INACTIVE,可以直接删除,重做。
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database add logfile group 1 ('<path>/redo01.log') size 100M;
Database altered.
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database add logfile group 2 ('<path>/redo02.log') size 100M;
Database altered.
如果是Current,做log切换,变成INACTIVE之后重做
SQL> alter system switch logfile;
System altered.
SQL> alter system checkpoint;
System altered.
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
SQL> alter database drop logfile group 3;
Database altered.
SQL> alter database add logfile group 3 ('<path>/redo03.log') size 100M;
Database altered.
在Primary 端修改或重建SRL。
SQL> select group#,status from v$standby_log;
GROUP# STATUS
---------- ----------
4 UNASSIGNED
5 UNASSIGNED
6 UNASSIGNED
7 UNASSIGNED
SQL> alter database drop standby logfile group 4;
Database altered.
SQL> alter database add standby logfile group 4 ('<path>/stbredo04.log') size 100M;
Database altered.
Group 5-7 做同样的操作。
在Standby端修改或重做ORL:
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
3 CLEARING
2 CLEARING
停止MRP的使用:
SQL> alter database recover managed standby database cancel;
Database altered.
对于状态是非CURRNT的REDO,Group2-3 ,做下面的操作。
SQL> alter database clear logfile group 2;
Database altered.
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database add logfile group 2 ('<path>/redo02.log') size 100M;
Database altered.
执行log switch,把current状态的ORL变成非Current之后,做上面的操作。
在Standby端,修改或重建SRL:
SQL> select group#,status from v$standby_log;
GROUP# STATUS
---------- ----------
4 ACTIVE
5 UNASSIGNED
6 UNASSIGNED
7 UNASSIGNED
对于状态是Active的,先Clear,然后删除,重建。
SQL> alter database clear logfile group 4;
Database altered.
SQL> alter database drop logfile group 4;
Database altered.
SQL> alter database add logfile group 4 ('<path>/stbredo04.log') size 100M;
Database altered.
对于状态是UNASSIGNED,可以直接删除,然受重建。
修改完成后,在Primary,Standby两方把standby_file_management改回Auto。
SQL> alter system set standby_file_management=auto;
System altered.
在Standby端可以打开MRP
SQL> alter database recover managed standby database disconnect from session using current logfile;
Database altered.
如果是RAC,可以使用下面的语句。
SQL>Alter database add standby logfile Thread <thread no> group <group no> size <>M;
SQL>Alter database add logfile Thread <thread no> group <group no> size <>M;
简单介绍这些。
谢谢