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