DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Как избежать ошибки "ORA-01555 - Snapshot too old"


Основной причиной возникновения этой ошибки является неудача при ре­конструировании совместимого по чтению образа или моментального снимка данных из сегмента отката. Ниже приводятся некоторые рекомендации, помо­гающие избежать этой проблемы.
Увеличьте размер сегментов отката и/или добавьте еще сегментов
Наиболее часто причиной возникновения данной ошибки служит слишком малое число сегментов отката и/или слишком малый их размер. При не­правильном выборе размера сегментов отката информация отмены будет пере-
всякий раз, когда сегменты отката повторно используют имеющиеся у них экстенты для записи в них новой информации отмены. Если
база данных обрабатывает много транзакций, которые часто модифицируют и
фиксируют данные, ни один из долго выполняющихся запросов не сможет ре­конструировать совместимый по чтению стоп-кадр данных, что и приведет к по­явлению ошибки. Имеется два способа избежать ее. Во-первых, следовать
методологии, описанной ранее в данной главе, чтобы соответствующим обра­зом выбрать размер сегментов отката. Во-вторых, перенести выполнение "дол­гоиграющих" запросов, чтобы они выполнялись в те моменты времени, когда DML-активность базы данных не так высока. Но это легче сказать, чем сделать!
Модифицируйте код приложения, в котором фиксация изменений происходит путем выборки из курсора
Второй наиболее распространенной причиной появления ORA-01555 явля­ется сам код приложения, предоставленный разработчиками. На самом деле
именно Oracle позволил им кодировать нестандартные операторы SQL. По стандартам ANSI после фиксации изменений курсор становится недействитель­ным и должен быть повторно открыт. Но Oracle разрешил приложениям выби­рать строки из курсора и после операции фиксирования изменений, что увеличивает вероятность появления этой ошибки.
Виновником этого является код приложения, но обратите внимание, что в этом случае Oracle помечает SCN временем открытия курсора, чтобы дать согла­сованное по чтению представление данных. Последующая обработка происхо­дит в цикле, где фиксируются данные. Таким образом, SCN для выбранных и обработанных блоков наращивается. Любые последующие операции выборки
для зафиксированных блоков требуют перестройки блока с использованием со­гласованного по чтению представления для помеченного SCN. Если Oracle мо­жет найти информацию отмены, сохранившуюся в помеченном SCN, то, как говорится - нет проблем, но иногда сделать это не удается, и тогда возникает
пресловутая ошибка.
Обычно такой код хорошо работает для небольших объемов данных, но по мере роста таблицы растет и вероятность ошибки. Чтобы разрешить эту проб­лему, попробуем делать фиксирование данных не так часто за счет увеличения размеров сегмента отката, чтобы информация отмены могла храниться в нем дольше. Еще лучше, если разгневанный АБД напишет разработчику письмо, где объяснит ему все преимущества, вытекающие из строгого следования стандар­там ANSI, а он (или она) внимательно рассмотрит его предложения о закрытии курсора после каждой операции фиксирования данных. Да, при этом увеличат­ся накладные расходы на написание приложения, но зато можно будет избежать
очистки Oracle (для откаченных или закончившихся аварийно транзакций), а
разработчику удастся уйти от разбора вопросов несовместимости данных. Од­нако подобная модификация приложения возможна не всегда, так как закрытые приложения нельзя легко изменить, чтобы обеспечить доступ к тому же набору строк при открытии и закрытии курсора. В таких случаях един­ственным возможным выбором может оказаться более редкое выполнение фик­сирования данных и конфигурирование больших сегментов отката,
Перед тем как перевести табличное пространство в режим READ ONLY, выполните полное сканирование таблиц для всех модифицированных таблиц
Перед обсуждением этого решения давайте разберемся, что такое 

отложен-


ная очистка блоков. 

Когда транзакция фиксирует данные, Oracle выполняет так
называемую 

быструю фиксацию 

(fast commit). При этом обновляется заголовок
сегмента отката, чтобы отметить, что транзакция была зафиксирована, но не
очищаются заголовки измененных блоков данных или индексов. Этот труд пе-
рекладывается на следующую транзакцию, которая будет читать из этого блока.
Однако для того чтобы подтвердить фиксирование данных, необходимо обра-
титься к сегменту отката. Это и называется 

отложенной очисткой блока. 

Уместно
также отметить, что        очистит ITL, если после операции фикси-
рования блок все еще находится в памяти.
При некоторых весьма специфических условиях попытка запроса получить подтверждение фиксации данных в сегменте отката, которая, как мы говорили ранее, выполняется для очистки блока данных, может закончиться неудачей и Oracle выдаст сообщение об ошибке ORA-01555. При нормальной работе базы данных эта ошибка вследствие отложенной очистки блоков встречается очень редко. Обычно проблема решается за счет подходящего выбора размера блоков
сегмента отката. Однако с ней можно столкнуться там, где этого меньше всего ожидаешь. Мы встретились с подобной ситуацией у одного из наших клиентов.
После выполнения довольно большой работы по обновлению табличное про­странство было переведено в режим read-only (только для чтения). Перед тем как таблицы были переведены в этот режим, к ним не было сделано никаких
обращений.
Последующие транзакции в базе данных попытались повторно использовать
сегменты отката и ID транзакций, связанных с давно закончившимися больши-
ми обновлениями. Когда были запущены запросы к обновленным таблицам из
табличного пространства, которое теперь можно было использовать только
для чтения, они привели к возникновению ошибок ORA-01555. Блоки данных в
этих таблицах не были чистыми - не были очищены SCN в ITL. Обычно при вы-
полнении запросов к данным, размещенных в блоках, используемых только для
чтения, модификация этих данных невозможна. Чтобы такая ситуация не воз-
никла, рекомендуется перед переводом табличного пространства в режим толь-
ко для чтения выполнить полное сканирование таблицы. Эти действия вызовут
очистку блоков        таблиц и при последующих запросах не возникнет необходимости в обращениях к сегментам отката.
 









jAntivirus