Select Page

Detecting and Repairing Block Corruption within Oracle Databases

Cindy Putnam | | May 8, 2019

Database outages can be tremendously costly for data-driven organizations, bringing your business to a near standstill. One of the most common causes of database outages is data block corruption. In this article, we’ll discuss how you can detect and repair the problem of block corruption within your Oracle database.

What is a data block corruption?

Data block corruptions occur whenever data is not in its expected state. The block may have contents that are not internally consistent, or it may have been altered to be unrecognizable as part of the Oracle Database format.

Some data block corruptions are relatively minor, affecting only a single block. Others corrupt a significant portion of the database, rendering it unusable and leading to loss of critical information.

Why do data block corruptions occur?

Data block corruptions can occur any time that data is altered, and can be traced back to both hardware and software problems. Problems with any or all of the following components can result in data block corruptions:
 

  • Hard drive
  • Disk controller
  • Operating system
  • Storage area network (SAN)
  • Storage device

How can you prevent data block corruptions?

Data block corruptions are difficult to prevent because they are inherently unpredictable. Indeed, corruptions are inevitable in today’s highly complex database environments.

However, you can still work to mitigate the effects of data block corruptions with a robust backup and recovery strategy. Oracle provides a variety of tools and solutions for these purposes, including:
 

How do you detect and monitor data block corruption?

Despite your best efforts, data block corruption can occur at any time. Fortunately, there are multiple ways that Oracle can detect and repair data block corruption:
 

  • Oracle Recovery Manager (RMAN)
  • DBVerify
  • ANALYZE command
  • DB_BLOCK_CHECKING parameter
  • Block media recovery (BMR)
  • DBMS_REPAIR

Oracle Recovery Manager (RMAN)

To check a database for physical and logical corruption, run the following command within Oracle RMAN:
 

  • BACKUP VALIDATE CHECK LOGICAL DATABASE ARCHIVELOG ALL;

 
The VALIDATE command in Oracle RMAN can be used to validate files, tablespaces, and even entire databases. For example:
 

  • VALIDATE DATAFILE ‘/u01/oradata/ORCL/system01.dbf’;
  • VALIDATE TABLESPACE users;
  • VALIDATE DATABASE;

 
If Oracle RMAN detects any data block corruptions, they will be shown in the V$DATABASE_BLOCK_CORRUPTION view.

DBVerify

DBVerify is an external command-line utility for validating online and offline databases and files, including backups. The example below demonstrates the use of the dbv command:
 

  • dbv file=/u01/oradata/ORACL/system01.dbf feedback=10000 blocksize=8192

 
Note that you cannot use DBVerify for Oracle control files or redo logs.

ANALYZE command

You can use the ANALYZE… VALIDATE STRUCTURE construction to verify the data blocks in an object. Once the analysis is complete, check the INVALID_ROWS table to see the corrupted data.

To first create the INVALID_ROWS table, run the following command within SQL:
 

  • @$ORACLE_HOME/rdbms/admin/UTLVALID.SQL

 
Second, validate the table and index structure with the following command:
 

  • ANALYZE TABLE scott.emp VALIDATE STRUCTURE CASCADE;

DB_BLOCK_CHECKING parameter

By setting the DB_BLOCK_CHECKING parameter to [TRUE|HIGH], you can have Oracle check database blocks for self-consistency. Note that this may add up to 10 percent overhead to the server, so only use this option if performance is not of great importance.

Block media recovery (BMR)

Block media recovery (BMR) lets you recover one or more data blocks without affecting the file as a whole. As a result, you’ll experience a lower mean time to repair (MTTR) and enjoy higher availability, since you only need to take the affected blocks offline.

This tactic is useful when only a limited number of data blocks have been corrupted. You can perform BMR only within Oracle RMAN using the BLOCKRECOVER command.

DBMS_REPAIR

Oracle’s DBMS_REPAIR package can both detect and repair corruption. To do so, you first need to create two administration tables. These tables will contain a list of corrupt blocks, and the index keys pointing to those blocks:

 
BEGIN

DBMS_REPAIR.admin_tables (

table_name => ‘REPAIR_TABLE’,

table_type => DBMS_REPAIR.repair_table,

action     => DBMS_REPAIR.create_action,

tablespace => ‘USERS’);

 

DBMS_REPAIR.admin_tables (

table_name => ‘ORPHAN_KEY_TABLE’,

table_type => DBMS_REPAIR.orphan_table,

action     => DBMS_REPAIR.create_action,

tablespace => ‘USERS’);

END;

/

 

The second step is to use the CHECK_OBJECT procedure to examine the table:

 
SET SERVEROUTPUT ON

DECLARE

v_num_corrupt INT;

BEGIN

v_num_corrupt := 0;

DBMS_REPAIR.check_object (

schema_name       => ‘SCOTT’,

object_name       => ‘DEPT’,

repair_table_name => ‘REPAIR_TABLE’,

corrupt_count     =>  v_num_corrupt);

DBMS_OUTPUT.put_line(‘number corrupt: ‘ || TO_CHAR (v_num_corrupt));

END;

/

 

Next, use the FIX_CORRUPT_BLOCKS procedure to mark the corrupted blocks:

 
SET SERVEROUTPUT ON

DECLARE

v_num_fix INT;

BEGIN

v_num_fix := 0;

DBMS_REPAIR.fix_corrupt_blocks (

schema_name       => ‘SCOTT’,

object_name       => ‘DEPT’,

object_type       => Dbms_Repair.table_object,

repair_table_name => ‘REPAIR_TABLE’,

fix_count         => v_num_fix);

DBMS_OUTPUT.put_line(‘num fix: ‘ || TO_CHAR(v_num_fix));

END;

/

 

The next step is to check for orphan keys, which are key entries that point to a corrupt data block:

 
SET SERVEROUTPUT ON

DECLARE

v_num_orphans INT;

BEGIN

v_num_orphans := 0;

DBMS_REPAIR.dump_orphan_keys (

schema_name       => ‘SCOTT’,

object_name       => ‘PK_DEPT’,

object_type       => DBMS_REPAIR.index_object,

repair_table_name => ‘REPAIR_TABLE’,

orphan_table_name => ‘ORPHAN_KEY_TABLE’,

key_count         => v_num_orphans);

DBMS_OUTPUT.put_line(‘orphan key count: ‘ || TO_CHAR(v_num_orphans));

END;

/

 

If there are 1 or more orphan keys, then you need to rebuild the database index with the REBUILD_FREELISTS procedure:

 

BEGIN

DBMS_REPAIR.rebuild_freelists (

schema_name => ‘SCOTT’,

object_name => ‘DEPT’,

object_type => DBMS_REPAIR.table_object);

END;

/

 

Finally, use the SKIP_CORRUPT_BLOCKS procedure to ensure that the corrupt blocks are skipped during queries:

 

BEGIN

DBMS_REPAIR.skip_corrupt_blocks (

schema_name => ‘SCOTT’,

object_name => ‘DEPT’,

object_type => DBMS_REPAIR.table_object,

flags       => DBMS_REPAIR.skip_flag);

END;

/

Conclusion

While data block corruption is an unfortunate fact of life, Oracle has a mature, wide-ranging suite of tools to protect and recover your enterprise data. Using software such as Oracle Data Guard and Oracle RMAN, as well as performing regular corruption checks, will help you counteract the issue of data block corruption.

12c Upgrade Bug with SQL Tuning Advisor

This blog post outlines steps to take on Oracle upgrade 11.2 to 12.1 if you’re having performance problems. Oracle offers a patch and work around to BUG 20540751.

Megan Elphingstone | March 22, 2017

Scripting Out the Logins, Server Role Assignments, and Server Permissions

Imagine over one hundred logins in the source server, you need to migrate them to the destination server. Wouldn’t it be awesome if we could automate the process?

JP Chen | October 1, 2015
sharepoint ideas

9 Awesome Things You Can Do with SharePoint

This blog post discusses out-of-the-box uses for SharePoint that you can execute in just a few clicks without using any code.

Amol Gharat | May 23, 2017

Work with Us

Let’s have a conversation about what you need to succeed and how we can help get you there.

CONTACT US

Work for Us

Where do you want to take your career? Explore exciting opportunities to join our team.

EXPLORE JOBS