When it is required to resize the online redo logfiles in a Data Guard configuration you need to perform the resize for both the online redo logfiles as well as the standby redo logfiles.

In this blog post an example how to accomplish this task. In another post will explain an issue which can occur in Rac One, where one thread is not active

We start on the STANDBY database, so the standby is ready before the primary is, we do this to eliminate potential impact when a large amount of redo is generated on the primary during the modifications.  Start with the standby only when you increase the size of the logfiles.

When you want to change the redo log sizes to smaller files start on the PRIMARY database.


SQL> select thread#,group#,bytes,status from v$standby_log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------
1          5  268435456 ACTIVE
1          6  268435456 UNASSIGNED
1          7  268435456 UNASSIGNED
2          8  268435456 UNASSIGNED
2          9  268435456 UNASSIGNED
2         10  268435456 UNASSIGNED

SQL> select thread#,group#,bytes,status from v$log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------------------------
1          1  268435456 CURRENT
1          2  268435456 CLEARING
2          3  268435456 CURRENT
2          4  268435456 CLEARING

Lets resize from to 1G, we start with adding of the new groups before we drop the old groups.

If recovery is still active and you try to add standby redo logfiles you get:

ORA-01156: recovery or flashback in progress may need access to files, so make sure recover process is stopped

DGMGRL> edit database set state=apply-off;

Below statement if we take the Data Guard best practice into account where we only have one file per standby redo logfile group.


alter database add standby logfile thread 1
group 11 ('+RECO') size 1G,
group 12 ('+RECO') size 1G,
group 13 ('+RECO') size 1G;
alter database add standby logfile thread 2
group 14 ('+RECO') size 1G,
group 15 ('+RECO') size 1G,
group 16 ('+RECO') size 1G;

Checking the files again we see the new groups.


SQL> select thread#,group#,bytes,status from v$standby_log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------
1          5  268435456 UNASSIGNED
1          6  268435456 UNASSIGNED
1          7  268435456 UNASSIGNED
2          8  268435456 UNASSIGNED
2          9  268435456 UNASSIGNED
2         10  268435456 UNASSIGNED
1         11 1073741824 UNASSIGNED
1         12 1073741824 UNASSIGNED
1         13 1073741824 UNASSIGNED
2         14 1073741824 UNASSIGNED
2         15 1073741824 UNASSIGNED
2         16 1073741824 UNASSIGNED

Time to drop the old standby redo logfiles

alter system switch logfile;
alter system archive log all;
alter system checkpoint;

alter database drop logfile group 5;
alter database drop logfile group 6;
alter database drop logfile group 7;
alter database drop logfile group 8;
alter database drop logfile group 9;
alter database drop logfile group 10;

Checking once again, the new standby redo logfiles have a size of 1GB.

SQL> select thread#,group#,bytes,status from v$standby_log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------
1         11 1073741824 UNASSIGNED
1         12 1073741824 ACTIVE
1         13 1073741824 UNASSIGNED
2         14 1073741824 UNASSIGNED
2         15 1073741824 UNASSIGNED
2         16 1073741824 UNASSIGNED

So one thing which we didn’t change was the online redo logfile in the standby, is this requires? YES it is. Online redo log file changes are not propegated to the standby.

After a switchover non existing online logfiles are created/cleared but based on the value in the controlfile.

Let’s replace the online logs on the standby


SQL> select database_role from v$database;

DATABASE_ROLE
------------------------------------------------
PHYSICAL STANDBY

SQL> select thread#,group#,bytes,status from v$log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------------------------
1          1  268435456 UNUSED
1          2  268435456 UNUSED
2          3  268435456 UNUSED
2          4  268435456 UNUSED

SQL> alter system set standby_file_management=manual;

alter database add logfile thread 1
group 5 ('+DATA', '+RECO') size 1G,
group 6 ('+DATA', '+RECO') size 1G;
alter database add logfile thread 2
group 7 ('+DATA', '+RECO') size 1G,
group 8 ('+DATA', '+RECO') size 1G;

If you try to execute the above before standby_file_management is set to manual you will get an ORA-01275: Operation ADD LOGFILE is not allowed if standby file management is automatic.

Let’s drop the old online logfiles

alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 4;

SQL> alter system set standby_file_management=auto;

So now the standby/online redo logfiles are modified on the STANDBY database time to go to the primary and execute the steps for the online redo logfiles as well as the standby redo logfiles. If you receive an message ORA-01623: log # is current log for instance (thread #) – cannot drop. Check out this blog for a solution.

The last one is easy so lets start with this one.

Current status:

SQL> select database_role from v$database;

DATABASE_ROLE
------------------------------------------------
PRIMARY

SQL> select thread#,group#,bytes,status from v$log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------------------------
1          1  268435456 CURRENT
1          2  268435456 INACTIVE
2          3  268435456 INACTIVE
2          4  268435456 INACTIVE

SQL> select thread#,group#,bytes,status from v$standby_log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------
1          5  268435456 UNASSIGNED
1          6  268435456 UNASSIGNED
1          7  268435456 UNASSIGNED
2          8  268435456 UNASSIGNED
2          9  268435456 UNASSIGNED
2         10  268435456 UNASSIGNED

As redo logsize needs to be the same on primary and standby we also use the file size of 1 GB.


alter database add standby logfile thread 1
group 11 ('+RECO') size 1G,
group 12 ('+RECO') size 1G,
group 13 ('+RECO') size 1G;
alter database add standby logfile thread 2
group 14 ('+RECO') size 1G,
group 15 ('+RECO') size 1G,
group 16 ('+RECO') size 1G;

Also here we need to drop the old standby logfile groups, simular as we performed on the standby.


SQL> select thread#,group#,bytes,status from v$standby_log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------
1          5  268435456 UNASSIGNED
1          6  268435456 UNASSIGNED
1          7  268435456 UNASSIGNED
2          8  268435456 UNASSIGNED
2          9  268435456 UNASSIGNED
2         10  268435456 UNASSIGNED
1         11 1073741824 UNASSIGNED
1         12 1073741824 UNASSIGNED
1         13 1073741824 UNASSIGNED
2         14 1073741824 UNASSIGNED
2         15 1073741824 UNASSIGNED
2         16 1073741824 UNASSIGNED

alter database drop logfile group 5;
alter database drop logfile group 6;
alter database drop logfile group 7;
alter database drop logfile group 8;
alter database drop logfile group 9;
alter database drop logfile group 10;

Now the standby log files are dropped we can add the online redo logfiles


alter database add logfile thread 1
group 5 ('+DATA', '+RECO') size 1G,
group 6 ('+DATA', '+RECO') size 1G;
alter database add logfile thread 2
group 7 ('+DATA', '+RECO') size 1G,
group 8 ('+DATA', '+RECO') size 1G;

Remark:

– Notice we have one group less than the standby redo logfiles, this is correct and not an error. The best practice for standby redo logfiles is that their will be one more group than the online redo logfiles

– Also a group will exists of 2 members for online redo logfiles, where with the standby redo logfiles the best practice is to have just one member per group


SQL> select thread#,group#,bytes,status from v$log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------------------------
1          1  268435456 CURRENT
1          2  268435456 INACTIVE
2          3  268435456 INACTIVE
2          4  268435456 INACTIVE
1          5 1073741824 UNUSED
1          6 1073741824 UNUSED
2          7 1073741824 UNUSED
2          8 1073741824 UNUSED

Now drop the old online redo log files, but before we perform this step we switch logfiles and perform a checkpoint.


alter system switch logfile;
alter system archive log all;
alter system checkpoint;

SQL> select thread#,group#,bytes,status from v$log;

THREAD#     GROUP#      BYTES STATUS
---------- ---------- ---------- ------------------------------------------------
1          1  268435456 INACTIVE
1          2  268435456 INACTIVE
2          3  268435456 INACTIVE
2          4  268435456 INACTIVE
1          5 1073741824 CURRENT
1          6 1073741824 UNUSED
2          7 1073741824 UNUSED
2          8 1073741824 UNUSED

alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 4;

When you receive an error about the drop of a logfile in a RACOne database this is expected as thread 2 is not active and therefore can not be dropped, to fix this


SQL> alter database drop logfile group 3;

alter database drop logfile group 3
*
ERROR at line 1:

ORA-01623: log 3 is current log for instance DBA1_2 (thread 2) - cannot drop
ORA-00312: online log 3 thread 2: '+DATA/dba1_02/onlinelog/group_3.303.870101525'
ORA-00312: online log 3 thread 2: '+RECO/dba1_02/onlinelog/group_3.828.870101525'

SQL> alter database clear unarchived logfile group 3;
Database altered.

SQL> alter database drop logfile group 3;
Database altered.