ORA-10560: block type ‘KTU UNDO BLOCK’

In the middle of last month an oracle Data Guard standby database of our production system there had shown the very weird message in its ALERT log file.

......
Mon Mar 15 10:01:16 2021
Media Recovery Waiting for thread 1 sequence 2768 (in transit)
Recovery of Online Redo Log: Thread 1 Group 4 Seq 2768 Reading mem 0
  Mem# 0: /u01/oradata/DGstandby/standbyredo01.log
Mon Mar 15 11:01:06 2021
RFS[4]: Selected log 5 for thread 1 sequence 2769 dbid 298590189 branch 1059239666
Mon Mar 15 11:01:09 2021
Archived Log entry 58618 added for thread 1 sequence 2768 ID 0x1ab474d5 dest 1:
Mon Mar 15 11:21:04 2021
Errors in file /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/trace/DGstandby_pr1e_28452.trc  (incident=494753):
ORA-00600: internal error code, arguments: [3020], [3], [1820], [12584732], [], [], [], [], [], [], [], []
ORA-10567: Redo is inconsistent with data block (file# 3, block# 1820, file offset is 14909440 bytes)
ORA-10564: tablespace UNDOTBS1
ORA-01110: data file 3: '/u01/oradata/DGstandby/undotbs01.dbf'
ORA-10560: block type 'KTU UNDO BLOCK'
Incident details in: /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/incident/incdir_494753/DGstandby_pr1e_28452_i494753.trc
Mon Mar 15 11:21:13 2021
Dumping diagnostic data in directory=[cdmp_20210315112113], requested by (instance=1, osid=28452 (PR1E)), summary=[incident=494753].
Mon Mar 15 11:21:19 2021
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Slave exiting with ORA-600 exception
Errors in file /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/trace/DGstandby_pr1e_28452.trc:
ORA-00600: internal error code, arguments: [3020], [3], [1820], [12584732], [], [], [], [], [], [], [], []
ORA-10567: Redo is inconsistent with data block (file# 3, block# 1820, file offset is 14909440 bytes)
ORA-10564: tablespace UNDOTBS1
ORA-01110: data file 3: '/u01/oradata/DGstandby/undotbs01.dbf'
ORA-10560: block type 'KTU UNDO BLOCK'
Mon Mar 15 11:21:20 2021
Errors in file /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/trace/DGstandby_mrp0_28299.trc  (incident=494313):
ORA-00600: internal error code, arguments: [3020], [3], [1820], [12584732], [], [], [], [], [], [], [], []
ORA-10567: Redo is inconsistent with data block (file# 3, block# 1820, file offset is 14909440 bytes)
ORA-10564: tablespace UNDOTBS1
ORA-01110: data file 3: '/u01/oradata/DGstandby/undotbs01.dbf'
ORA-10560: block type 'KTU UNDO BLOCK'
Incident details in: /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/incident/incdir_494313/DGstandby_mrp0_28299_i494313.trc
Mon Mar 15 11:21:21 2021
Sweep [inc][494753]: completed
Sweep [inc][494313]: completed
Sweep [inc2][494753]: completed
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Recovery Slave PR1E previously exited with exception 600
Mon Mar 15 11:21:22 2021
MRP0: Background Media Recovery terminated with error 448
Errors in file /u01/app/oracle/diag/rdbms/DGstandby/DGstandby/trace/DGstandby_pr00_28328.trc:
ORA-00448: normal completion of background process
Managed Standby Recovery not using Real Time Apply
Dumping diagnostic data in directory=[cdmp_20210315112122], requested by (instance=1, osid=28299 (MRP0)), summary=[incident=494313].
Recovery interrupted!
Recovered data files to a consistent state at change 22382148475
MRP0: Background Media Recovery process shutdown (DGstandby)
Mon Mar 15 11:22:21 2021
Sweep [inc2][494313]: completed
......

As you can see from the prior partial alert log contents some critical messages with the highlighting green color. Yes, you have found that the ORA-00600 error with four arguments [3020], [3], [1820], [12584732] ……, and beneath the 1 – 4 lines you’ll notice the message is obviously clear: UNDO data block with datafile 3 (UNDO tablespace) is inconsistent with REDO.

Next you continue to observe the underneath hightlighting lines, MRP0 process shutdown by oracle itself, hence Managed Standby Recovery not using Real Time Apply for my oracle Data Guard standby database.

Oh, my God!

Immediately I use the command DBV to check whether UNDO datafile 3 has several corrupt logical data blocks.

[oracle@DGstandby ~]$ dbv file =/u01/oradata/DGstandby/undotbs01.dbf blocksize=8192

DBVERIFY: Release 11.2.0.4.0 - Production on Tue Mar 16 12:16:03 2021

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = /u01/oradata/DGstandby/undotbs01.dbf


DBVERIFY - Verification complete

Total Pages Examined         : 3308160
Total Pages Processed (Data) : 0
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 3308159
Total Pages Processed (Seg)  : 15869
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 1
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 907311993 (5.907311993)

Fortunately the UNDO datafile has none corrupt logic data blocks. Next I searched “ORA-00600:[3020] ORA-10567” on Google by coincidence the ranking 3rd blog post is the same as my case.

Now I start to do the begin backup of UNDO tablespace on primay database and next scp undotbs01.dbf to standby database as well as do the end backup of UNDO tablespace.

SYS@DGprimary> alter tablespace UNDOTBS1 begin backup;

Tablespace altered.

[oracle@DGprimary DGprimary]$ scp undotbs01.dbf oracle@xx.xxx.x.xx:/u01/oradata/DGstandby/
oracle@xx.xxx.x.xx's password: 
undotbs01.dbf                                 100%   25GB  57.3MB/s   07:31 

SYS@DGprimary> alter tablespace UNDOTBS1 end backup;

Tablespace altered.

In the mean time creating standby controlfile and next scp to the standby database from primary database.

SYS@DGprimary> alter database create standby controlfile as '/u01/oradata/DGprimary/standby.ctl';

Database altered.

[oracle@DGprimary DGprimary]$ ls -lrht standby.ctl 
-rw-r----- 1 oracle oinstall 20M Mar 17 09:30 standby.ctl
[oracle@DGprimary DGprimary]$ 
[oracle@DGprimary DGprimary]$ scp standby.ctl oracle@xx.xxx.x.xx:/u01/oradata/DGstandby/
oracle@xx.xxx.x.xx's password: 
standby.ctl                                   100%   20MB  19.9MB/s   00:00

At this very moment I go to restart my Data Guard standby database.

SYS@DGstandby> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@DGstandby> startup
                            !!!WARNING!!!
This database may be accessed only by authorized users for Legitimate
business purposes. Unauthorized use of this database is strictly
prohibited and may be subject to criminal prosecution. By continuing
to use this database you indicate your consent to these conditions of
use. LOG OFF IMMEDIATELY if you do not agree to the conditions stated
in this warning.

ORACLE instance started.

Total System Global Area 1.6034E+11 bytes
Fixed Size                  2261848 bytes
Variable Size            2.6844E+10 bytes
Database Buffers         1.3314E+11 bytes
Redo Buffers              352444416 bytes
Database mounted.
                            !!!WARNING!!!
This database may be accessed only by authorized users for Legitimate
business purposes. Unauthorized use of this database is strictly
prohibited and may be subject to criminal prosecution. By continuing
to use this database you indicate your consent to these conditions of
use. LOG OFF IMMEDIATELY if you do not agree to the conditions stated
in this warning.

SYS@DGstandby> 

Next I have seen receiving archived logs from primary database on the standby database’s ALERT log file.

......
Wed Mar 17 09:35:19 2021
Media Recovery Log /u01/oradata/arch/1_2769_1059239666.dbf
Wed Mar 17 09:35:21 2021
Primary database is in MAXIMUM PERFORMANCE mode
RFS[1]: Assigned to RFS process 2026
RFS[1]: Selected log 4 for thread 1 sequence 2826 dbid 298590189 branch 1059239666
Wed Mar 17 09:35:22 2021
RFS[2]: Assigned to RFS process 2036
RFS[2]: Selected log 5 for thread 1 sequence 2825 dbid 298590189 branch 1059239666
Wed Mar 17 09:35:40 2021
Archived Log entry 58675 added for thread 1 sequence 2825 ID 0x1ab474d5 dest 1:
Wed Mar 17 09:36:42 2021
Media Recovery Log /u01/oradata/arch/1_2770_1059239666.dbf
Wed Mar 17 09:37:40 2021
Media Recovery Log /u01/oradata/arch/1_2771_1059239666.dbf
Wed Mar 17 09:38:51 2021
Media Recovery Log /u01/oradata/arch/1_2772_1059239666.dbf
......
Wed Mar 17 10:14:38 2021
Media Recovery Log /u01/oradata/arch/1_2819_1059239666.dbf
Media Recovery Log /u01/oradata/arch/1_2820_1059239666.dbf
Wed Mar 17 10:14:52 2021
Media Recovery Log /u01/oradata/arch/1_2821_1059239666.dbf
Wed Mar 17 10:15:08 2021
Media Recovery Log /u01/oradata/arch/1_2822_1059239666.dbf
Media Recovery Log /u01/oradata/arch/1_2823_1059239666.dbf
Wed Mar 17 10:15:48 2021
Media Recovery Log /u01/oradata/arch/1_2824_1059239666.dbf
Wed Mar 17 10:16:37 2021
Media Recovery Log /u01/oradata/arch/1_2825_1059239666.dbf
Wed Mar 17 10:17:03 2021
Incomplete Recovery applied until change 22391814304 time 03/17/2021 09:35:21
Completed Standby Crash Recovery.
Wed Mar 17 10:17:04 2021
SMON: enabling cache recovery
Dictionary check beginning
Dictionary check complete
Database Characterset is AL32UTF8
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
Physical standby database opened for read only access.
Completed: ALTER DATABASE OPEN

As you can see from my previous alert log file standby database has been open. Now I am going to do the operation with Managed Standby Recovery starting Real Time Apply.

SYS@DGprimary> select open_mode from v$database;

OPEN_MODE
----------------------------------------
READ ONLY

SYS@DGprimary> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

Database altered.

SYS@DGprimary> select open_mode from v$database;

OPEN_MODE
----------------------------------------
READ ONLY WITH APPLY

Nice!!! Finally I checked the view v$managed_standby and v$dataguard_stats, MRP0 has been working so far.

SYS@DGprimary> SELECT process,pid,status,sequence#,block#,blocks,delay_mins FROM v$managed_standby;

PROCESS                   PID STATUS                    SEQUENCE#     BLOCK#     BLOCKS DELAY_MINS
------------------ ---------- ------------------------ ---------- ---------- ---------- ----------
ARCH                     1902 CLOSING                        2825     661504        773      0
ARCH                     1904 CLOSING                        2826     987136       2041      0
ARCH                     1907 CONNECTED                         0          0          0      0
ARCH                     1909 CONNECTED                         0          0          0      0
RFS                      2014 IDLE                              0          0          0      0
RFS                      2026 IDLE                           2827      78062         49      0
RFS                      2036 IDLE                              0          0          0      0
MRP0                    14310 APPLYING_LOG                   2827      78110    2097152      0

8 rows selected.

SYS@DGprimary> COL name          FOR  a22
SYS@DGprimary> COL value         FOR  a12
SYS@DGprimary> COL unit          FOR  a28
SYS@DGprimary> COL time_computed FOR  a19
SYS@DGprimary> COL datum_time    FOR  a19
SYS@DGprimary> 
SYS@DGprimary> SELECT * FROM v$dataguard_stats;

NAME                   VALUE        UNIT                         TIME_COMPUTED       DATUM_TIME
---------------------- ------------ ---------------------------- ------------------- -------------------
transport lag          +00 00:00:00 day(2) to second(0) interval 03/17/2021 10:23:47 03/17/2021 10:23:45
apply lag              +00 00:00:00 day(2) to second(0) interval 03/17/2021 10:23:47 03/17/2021 10:23:45
apply finish time                   day(2) to second(3) interval 03/17/2021 10:23:47
estimated startup time 25           second                       03/17/2021 10:23:47

Welcome to give a feedback or comment as always, hope this note help you as well.

Update Apr 03, 2021

I have forgotten to mention that manually trying to start MRP firstly in my mind but after half an hour which has been terminated by oracle. In other words at that moment oracle is not able to allow starting redo log real time apply on Data Guard primary database in case of showing ORA-00600 [3020].

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.