Oracle Corruption. В очередной раз об ошибке ORA-00600.Рекомендации. Часть 6 последняя

dbstalker, 25 сентября

Предыдущий пост на эту тему. Завершим.

Экземпляр базы данных перемещает много данных - из сеанса пользователя в буферный кэш, из кэша на диск и наоборот. Все эти передвижения могут сделать блок данных восприимчивым к искажению. Как было установлено раньше, появляются повреждения оракловских блоков как на диске так и в памяти.

Повреждения в памяти исправляются механизмом проверки оракловского ядра и операционной системы. Это не всегда хорошо, так как иногда хорошие блоки помечаются как поврежденные.

Дисковые повреждения - самый часто встречающийся вид повреждений. Как только блок записан, он больше не проверяется, пока не будет востребован. Оракл контролирует перемещение блока, пока он не будет передан операционной системе. После чего, ОС принимает всю ответственность за обработку блока. Однако ОС не умеет выполнять интеллектуальную проверку блока, так как у неё нет знаний о оракловской структуре блока.

Оракл обеспечивает несколько возможностей защиты от повреждений блока:

Disk protection

DB_BLOCK_CHECKSUM=TRUE

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

Параметр определяет, производит ли DBWR вычисление контрольной суммы (число, определяемое по всем байтам блока) и ее последующую запись в заголовок блока при его записи на диск.

Когда блок читается с диска, процесс считывания снова вычисляет контрольную сумму, а затем сравнивает ее с сохраненным в заголовке значением. Если данные повреждены, тогда контрольные суммы будут отличаться. Это и есть сигнал о повреждении.

Установка этого параметра предохраняет блок от записывания того, что не соответствует стандартному формату оракловского блока. Если блок поврежден, что явилось следствием измененного формата, то тип повреждения будет определен как ошибка носителя.

В Oracle Database 10g релиз 2 можно заставить базу данных выполнить также проверку в памяти, установив в FULL параметр инициализации DB_BLOCK_CHECKSUM. После этой установки Oracle вычисляет контрольную сумму перед любым изменением и сравнивает контрольную сумму с сохраненным значением. Такое решение выявляет любое нарушение целостности данных непосредственно в памяти. Оракл уведомляет об ошибке. Таким образом, такая проверка предотвращает нарушение целостности данных на диске. А также ошибка не будет передана в резервную (standby) базу данных.

В процессе подтверждения контрольной суммы не читается фактическое содержимое блока, следовательно, есть еще вероятность, что данные в блоке испорчены.

Недостатком установки этого параметра является то, что некоторые блоки могут иметь часть хороших данных, но так как блок помечен как поврежденный, то с ними оракл работать не будет. Если контрольная сумма рассчитана для блока, то она всегда будет использоваться, даже если параметр будет удален.

DB_BLOCK_CHECKING=TRUE

Установка этого параметра дает указание ораклу выполнять подробную логическую (просматривая данные и проверяя их самосогласованность) проверку всего блока (не только заголовка) перед выполнением любых изменений . По умолчанию оракловское ядро всегда выполняет детальную логическую проверку для блоков в табличном пространстве system. Если повреждения в содержимом блока будет обнаружено, то будут сгенерирована ошибка носителя ORA-00600 [6599] или некоторые другие варианты ошибки носителя в зависимости от производимых с блоком дейсвий. Такое событие приостановит активность базы данных до тех пор, пока проблема не будет решена. Кроме того, все данные блока будут утеряны. Остается дискуссионным вопрос, на сколько замедлится работа системы из-за этой проверки. Все зависит от вашей деятельности в базе данных.

Memory protection

_DB_BLOCK_CACHE_PROTECT=TRUE

Если параметр DB_BLOCK_CACHE_PROTECT установлен в TRUE (значение по умолчанию) и установлен параметр DB_BLOCK_CHECKSUM, тогда оракл активизирует специальный алгоритм для защиты модифицированных блоков в памяти базы данных. Любая некорректная запись из памяти базы данных будет обнаружена, защищая диск от получения блоков, которые поврежденны в памяти. После каждого успешного чтения блок базы данных проверяется в памяти базы данных. Контрольная сумма из заголовка блока будет сверена с рассчитанной на лету контрольной суммой в памяти. Когда они не совпадут, оракл сгенерирует ошибку о «мягком» повреждении блока, который будет переформатирован и снова использован.

Хотя обнаружение memory-повреждения является полезным, любое повреждение в памяти вызывает сбой экземпляра. Параметр является скрытым и поумолчанию установлен в ON.

Дополнительные параметры

_CHECK_BLOCK_AFTER_CHECKSUM – выполняет блочную проверку после контрольной суммы, по умолчанию ON, активируется, только если DB_BLOCK_CHECKSUM=TRUE

_DB_ALWAYS_CHECK_SYSTEM_TS – всегда выполняет блочную проверку и контрольную сумму для system пространства, по умолчанию ON.

Мы не можем полностью избежать повреждений. Но мы можем организоватm работу базы данных так, что проблема будет рано обнаружена.

Простой метод для обнаружения поврежденных блоков:

Analyze table table_name validate structure cascade;
Источник

 

Новый комментарий

Я не спамер: введите суму 8+3



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум