Oracle DB, Режимы проверки целостности

Материал из sysadm
Перейти к навигации Перейти к поиску

Параметры управляющие механизмами контроля целостности

DB_BLOCK_CHECKSUM = FULL
DB_LOST_WRITE_PROTECT = NONE | TYPICAL | FULL
DB_BLOCK_CHECKING = MEDIUM | FULL

-- комплексный параметр управления целестностью, игнорируется если определен хотя бы один параметр из перечисленных выше
DB_ULTRA_SAFE = OFF | DATA_ONLY | DATA_AND_INDEX
  OFF - параметры целостности не переопределяются (значение по умолчанию)

  DATA_ONLY - эквивалентно:
     DB_BLOCK_CHECKING = MEDIUM
     DB_LOST_WRITE_PROTECT = TYPICAL
     DB_BLOCK_CHECKSUM = FULL

  DATA_AND_INDEX - эквивалентно:
     DB_BLOCK_CHECKING = FULL
     DB_LOST_WRITE_PROTECT = TYPICAL
     DB_BLOCK_CHECKSUM = FULL

Lost Write Protect

DB_LOST_WRITE_PROTECT = { NONE | TYPICAL | FULL }
  • NONE - выключено
  • TYPICAL - включено на всех табличных пространствах, кроме открытых в режиме READ ONLY
  • FULL - включено на всех табличных пространствах

Lost Write Protect предназначен для раннего обнаружения потерянной записи. Т.е. ситуации, когда изменение блока записано в redo-лог и передано на PHYSICAL STANDBY, но на PRIMARY в файле данных физически блок не изменился, либо был восстановлен в прошлое состояние без участия СУБД. Если Lost Write Protect не включен, то потерянная запись может обнаружиться только когда проблемный блок будет изменен повторно и PHYSICAL STANDBY не сможет принять новое изменение из-за несовпадения SCN.

Принципы работы и особенности:

  • на PRIMARY в redo-лог пишутся SCN всех читаемых блоков в специальный тип записи BRR (Block Redo Read)
  • на PHYSICAL STANDBY выполняется сверка всех SCN полученных из BRR записей redo-лога с текущими SCN блоков в локальных файлах данных
  • в случае расхождения в alert-лог пишется ошибка
  • время обнаружения нарушения целостности сокращается за счет того что обычно недавно измененные блоки чаще читаются чем повторно изменяются
  • необходим оперативный мониторинг alert-лога для своевременного обнаружения проблемы
  • данный механизм приводит к тому что PHYSICAL STANDBY повторяет все чтения производимые на PRIMARY, что может стать проблемой если PHYSICAL STANDBY имеет более слабую дисковую подсистему
  • запись о прочитанном блоке занимает мало места, но при большом количестве операций чтения размер redo-логов может в несколько раз превышать объем необходимый для записи изменений

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

Примечание: Lost Write Protect создает значительные накладные расходы, если база активно читается. Нужно разобраться, можно ли средствами RMAN обнаружить потерянную запись.

Block Checking

DB_BLOCK_CHECKING = { FALSE | OFF | LOW | MEDIUM | TRUE | FULL }
  • OFF или FALSE - Проверка блоков не выполняется для пользовательских табличных пространств. При этом, в табличном пространстве SYSTEM полная семантическая проверка блоков выполняется всегда.
  • LOW - Выполняется простая проверка заголовка блоков, после изменения их содержимого в памяти. Например после UPDATE, INSERT, DELETE или внутреннего перемещения средствами RAC )
  • MEDIUM - К проверкам LOW добавляется полная семантическая проверка для всех объектов, кроме индексов
  • FULL или TRUE - К проверкам LOW добавляется полная семантическая проверка для всех объектов (включая индексы)

Block Checksum

DB_BLOCK_CHECKSUM = { OFF | FALSE | TYPICAL | TRUE | FULL }

DB_BLOCK_CHECKSUM определяет будут ли процессы DBWn и direct loader вычислять, сохранять и сверять контрольную сумму блоков данных.

  • OFF или FALSE - контрольная сумма блока не вычисляется для табличных пространств, кроме табличного пространства SYSTEM, а также для блоков redo-логов.
  • TYPICAL или TRUE - контрольная сумма блока вычисляется и записывается в заголовок его кэша перед каждой записью блока на диск. Сверка контрольной суммы выполняется только если она была ранее сохранена на диск. Накладные расходы 1-2%.
  • FULL - выполняется тоже что при TYPICAL, плюс выполняется проверка контрольных сумм до изменения блоков операторами update/delete и повторно вычисляется после применения изменений. Также контрольная сумма вычисляется перед записью каждого блока текущего redo-лога. Если установлено значение FULL, то также перехватываются повреждения в памяти и не позволяет им попасть на диск. Накладные расходы 4-5%.

Для большинства блоков redo-лога контрольная сумма вычисляется основными (foreground) процессами, пока LGWR и его подчиненные LGnn процессы выполняют остальную часть работы. Так сделано для оптимальной производительности.

Ссылки по теме

Прочитать, разобрать