Oracle DB: Защита от потерянной записи

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

Потерянная запись - это когда база данных считает что успешно записала блок данных, но по факту при физической записи произошел сбой и блок не был изменен на физическом уровне, при этом сам блок не является сбойным. Аналогичная ситуация будет при внесении прямого изменения в файл данных базы.

База данных не заметит эту ситуацию. Проблема проявится, только при следующем изменении данного блока и попытке его применения на резервном сервере.

Для устранения данной проблемы придется возвращать базу данных на момент до сбоя, когда база еще была консистентна.

Чем раньше будет обнаруженная неконсистентность базы, тем меньше последующих изменений будет потеряно.

В Oracle имеется механизм обнаружения потерянной записи, который управляется параметром DB_LOST_WRITE_PROTECT.

DB_LOST_WRITE_PROTECT = NONE | TYPICAL | FULL
  • NONE - выключено
  • TYPICAL - применяется для табличных пространств работающих в режиме READ/WRITE
  • FULL - применяется для табличных пространств работающих в режиме READ/WRITE и READ ONLY

Если механизм обнаружения потерянной записи включен, то

  • на PRIMARY в redo-логи пишутся SCN всех читаемых блоков
  • на STANDBY выполняется считывание и сверка SCN всех блоков попавших в redo-лог

BRR (Block Redo Read)

Т.е. когда на PRIMARY будет выполняться SELECT, то STANDBY будет повторять чтения всех блоков и сверять их SCN с тем что записано в redo-log. Если производительность дисковой подсистемы резервного сервера ниже, то это может создать проблему.

Redo I/O Is Higher On Active Data Guard Physical Standby Than Primary (Doc ID 2249431.1)

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

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