Oracle mechanics

28.09.2011

dbverify

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

При работе над ошибкой (ORA-600 [ktbdchk1: bad dscn], возникающей при INSERT’ах в таблицы с предположительно логически битыми индексами — по крайней мере, в нашем случае помогает именно перестройка индексов), в головном свежем описании ошибки ID 139165.1 на металинке нашли рекомендацию использовать утилиту dbv для проверки файлов бд

С детства запомнив, что использовать dbverify можно только на offline-файлах (что однозначно прописано в документации вплоть до 11.2 включительно):

The DBVERIFY program is an external command-line utility that performs a physical data structure integrity check on an offline datafile

Однако, свежие докуметы сайта поддержки (см. DBVERIFY — Database file Verification Utility (7.3.2 — 11.2) [ID 35512.1]) прямо противоречат документации и открывают новые перспективы:

DBV can be run against datafiles which are currently opened by a database instance — there is no need to shutdown the database. Datafiles are opened read-only by DBV so it cannot corrupt the contents

Погонял на тестовом датафайле с интенсивной нагрузкой типа чтение-запись (циклический INDEX REBUILD) — DBV отрабатывает без ошибок, документация (11.2!) устарела или просто утилита неактуальна

Другой интересный документ DBVERIFY enhancement — How to scan an object/segment [ID 139962.1]  описывает новый функционал DBVERIFY — проверку конкретного сегмента, что может быть крайне удобно для проверки сегментов, находящихся в больших, многофайловых табличных пространствах:

% dbv USERID=username/password SEGMENT_ID=<tsn.segfile.segblock>

Пробуем — получаем ошибку:

$ dbv USERID='system/***' SEGMENT_ID=5.7.2451999

DBVERIFY: Release 11.1.0.7.0 - Production on Thu Sep 15 14:36:54 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

DBVERIFY - Verification starting : SEGMENT_ID = 5.7.2451999

DBV-00111: OCI failure (4122) (ORA-01000: maximum open cursors exceeded)

— увеличение параметра open_cursors помогает для небольших сегментов. запрос к V$ обзорам показывает, что рекурсивная сессия от SYS порождает большое количество незакрытых курсоров:

SQL> select username, program, oc.sid, sql_text, count(*)
 2  from v$open_cursor oc, v$session s
 3  where oc.sid = s.sid
 4  and lower(PROGRAM) like '%dbv%'
 5  group by username, program, oc.sid, sql_text
 6  order by 5 desc
7  /
USERNAME PROGRAM                      SID SQL_TEXT                                                      COUNT(*)
-------- ---------------------------- --- ------------------------------------------------------------ --------
SYS      dbverify@host.ru (TNS V1-V3) 856 begin sys.dbms_dbverify.dbv2(:file, :start, :end, :blkz, :o,  625
SYS      dbverify@host.ru (TNS V1-V3) 856 select type#,blocks,extents,minexts,maxexts,extsize,extpct,u    3
...

— похоже, что процедура dbms_dbverify.dbv2 открывает и «забывает» закрывать курсоры в количестве, пропорциональном размеру (количеству блоков) проверяемого сегмента, что похоже на плохо написанный код :(

В ответ на запрос эту гипотезу оперативно подтверждили в техподдержке Oracle :)

The error occurs as the limit of open cursors has been reached. So, kindly increase the value of open_cursor by 10% from the current value and try running db verify

If the segments are huge, there may be a need for very high number of cursors, it is better to use RMAN validate rather than db verify that kind of scenarios.
So, kindly use RMAN validate structure which should be suitable for your environment

Т.е., если уж сотрудники фирмы-производителя не рекомендуют использовать dbverify — :(

К слову, в идентификации логически битых связанных блоков (logical interblock corruption), предположительно являющихся причиной ORA-600 [ktbdchk1: bad dscn] пока не помог ни RMAN VALIDATE (вообще говоря, и не должен был — Only DBVERIFY and the ANALYZE statement detect interblock corruption), ни чудесно-пропатченный DBVERIFY (Patch : Bug 7517208 — DBV enhanced to identify Logical SCN Block corruptions)

1 комментарий »

  1. […] *) при запуске DBVERIFY версии 11.2 на уровне отдельных объектов по прежнему страдает ORA-01000 см. dbverify […]

    Уведомление от ORA-00600 [ktbdchk1: bad dscn] – как найти повреждённые индексы « Oracle mechanics — 22.12.2011 @ 00:23 | Ответить


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 такие блоггеры, как: