Oracle mechanics

04.08.2011

dbms_backup_restore.resetCfileSection: очистка и заполнение списка битых блоков

Filed under: Backup and Recovery,Oracle — Игорь Усольцев @ 09:57

В процессе работы с очередным SR (Oracle 11.1.0.7) техподдержка Oracle (в ответ на наши настойчивые предложения) одобрила использование процедуры dbms_backup_restore.resetcfilesection для очистки списка битых блоков (corrupted blocks) в controlfile, отображаемый в системном обзоре v$database_block_corruption:

You can execute the command:

sql> execute dbms_backup_restore.resetcfilesection(35);
sql>commit;

This will clean up the V$DATABASE_BLOCK_CORRUPTION view
Once cleared you can un the rman backup to fill this view again.
But be aware that the corrupted blocks will remain corrupted until will be reused and reformatted, so even you will drop and recreate a corrupted object the corrupted blocks will be reported as corrupted until will be reused, but after recreating the object the corrupted blocks do not belong to any object.
This means that you still will see the same corrupted blocks in V$DATABASE_BLOCK_CORRUPTION, but when you execute the query to check the affected objects you will find no object with corruptions.

Список параметров функции dbms_backup_restore.resetcfilesection (секций controlfile), предположительно, совпадает со списком типов функции cfileResizeSection в файле $ORACLE_HOME/rdbms/admin/dbmsbkrs.sql:

-- Valid record types are defined as the following constants:

RTYP_DB_INFO                    constant binary_integer :=   0;
RTYP_CKPTPROG                   constant binary_integer :=   1;
RTYP_THREAD                     constant binary_integer :=   2;
RTYP_LOGFILE                    constant binary_integer :=   3;
RTYP_DATAFILE                   constant binary_integer :=   4;
RTYP_FILENAME                   constant binary_integer :=   5;
RTYP_TABLESPACE                 constant binary_integer :=   6;
RTYP_RESERVED1                  constant binary_integer :=   7;
RTYP_TEMPFILE                   constant binary_integer :=   7;
RTYP_RMAN_CONFIGURATION         constant binary_integer :=   8;
RTYP_LOG_HISTORY                constant binary_integer :=   9;
RTYP_OFFLINE_RANGE              constant binary_integer :=  10;
RTYP_ARCHIVED_LOG               constant binary_integer :=  11;
RTYP_BACKUP_SET                 constant binary_integer :=  12;
RTYP_BACKUP_PIECE               constant binary_integer :=  13;
RTYP_BACKUP_DFILE               constant binary_integer :=  14;
RTYP_BACKUP_LOG                 constant binary_integer :=  15;
RTYP_DFILE_COPY                 constant binary_integer :=  16;
RTYP_BACKUP_DFILE_CORR          constant binary_integer :=  17;
RTYP_DFILE_COPY_CORR            constant binary_integer :=  18;
RTYP_DELETED_OBJECT             constant binary_integer :=  19;
RTYP_RESERVED3                  constant binary_integer :=  20;
RTYP_PROXY                      constant binary_integer :=  20;
RTYP_RESERVED4                  constant binary_integer :=  21;
RTYP_BACKUP_SPFILE              constant binary_integer :=  21;
RTYP_DB2                        constant binary_integer :=  22;
RTYP_INCARNATION                constant binary_integer :=  23;
RTYP_FLASHBACK                  constant binary_integer :=  24;
RTYP_RA_INFO                    constant binary_integer :=  25;
RTYP_INST_RSVT                  constant binary_integer :=  26;
RTYP_AGED_FILES                 constant binary_integer :=  27;
RTYP_RMAN_STATUS                constant binary_integer :=  28;
RTYP_THREAD_INST                constant binary_integer :=  29;
RTYP_MTR                        constant binary_integer :=  30;
RTYP_DFH                        constant binary_integer :=  31;
RTYP_SDM                        constant binary_integer :=  32;
RTYP_RSP                        constant binary_integer :=  33;
RTYP_NRR                        constant binary_integer :=  34;
RTYP_BLOCK_CORRUPTION           constant binary_integer :=  35;
RTYP_ACM_OPERATION              constant binary_integer :=  36;
RTYP_FOREIGN_ARCHIVED_LOG       constant binary_integer :=  37;

PROCEDURE cfileResizeSection( record_type     IN  binary_integer
...

, и с выводом такого забавного запросом (для версии 11g):

select case when rownum<23 then rownum-1 else rownum end id, type from v$controlfile_record_section;

В версии 10.2.0.4 обзор v$database_block_corruption строится на основе обзоров v$backup_corruption и v$copy_corruption, и для очиски списка битых блоков в V$Database_block_corruption Shows Entries for Non-existent Datafile [ID 782137.1] указывается 2 вызова функции:

SQL> execute dbms_backup_restore.resetCfileSection(17); /** clear v$backup_corruption
SQL> execute dbms_backup_restore.resetCfileSection(18); /**clear v$copy_corruption

Само собой, использовать официально недокументированную функцию имеет смысл только по согласованию с техподдержкой Oracle, с тестированием и т.д.

Заполняется список corrupted блоков во время выполнения операций, читающих блоки бд — 11g New Feature V$Database_block_corruption Enhancements and Rman Validate Command [ID 471716.1]:

  • Analyze table .. Validate structure
  • Dbverify
  • CTAS(Create table as Select)
  • Export
  • RMAN VALIDATE | BACKUP … VALIDATE | RESTORE … VALIDATE (CHECK LOGICAL)

, например:

RMAN> run {
 allocate channel d1 type disk;
 backup check logical validate database;
 release channel d1;
 }

, а также может частично (по одному блоку на запрос :) заполняться при обычных запросах, завершающихся ошибками типа:

ORA-01578: ORACLE data block corrupted (file # 564, block # 966708)

при попытке считать данные «повреждённого» блока

P.S. В последнем указанном документе описана появившаяся в Oracle 11g команда RMAN VALIDATE, позволяющая проверять блоки бд на уровнях database | backupset/datafile | block

Database :-
RMAN > Validate database;
Datafile :-
RMAN > Validate datafile <file no>,<file no>  ;
Data block :-
RMAN > Validate datafile <file no> block <Block no> ;

2 комментария »

  1. Spasibo za statju. Tol’ko chto pojavilas’ neobhodimost’ ochistit’ corrupted blocks zapisi.
    Mne interesno kak vy nabreli na dbms_backup_restore.resetcfilesection(38) reshenije?
    Ja poprobyval poisklat’ v Google i MOS i ne sil’no mnogo nashol.

    Yura

    комментарий от Yury Velikanov — 04.10.2012 @ 11:36 | Ответить

    • Приветствую, Юрий
      dbms_backup_restore.resetcfilesection упоминается часто, например для очистки списка архивных логов — http://hemantoracledba.blogspot.com/2011/04/archivelogs-in-controlfile.html, на форуме sql.ru,..
      Забавно, что специалисты MOS первоначально не одобрили 35 в качестве правильного аргумента для очистки списка битых блоков — предлагали другие варианты)

      комментарий от Igor Usoltsev — 04.10.2012 @ 13:48 | Ответить


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: