Рубрика:
Базы данных /
Диагностика
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ВАЛЕРИЙ МИХЕИЧЕВ, эксперт Oracle, ОСАО «Ингосстрах», Valery.Mikheitchev@ingos.ru
Взаимоблокировки deadlock-сессий в Oracle
В статье изложены практический опыт диагностики взаимоблокировок deadlock-сессий, причины возникновения взаимоблокировок, методы борьбы с ними и возможности предупреждения
Взаимоблокировка deadlock – это ситуация, при которой сессии (сессия) находятся в состоянии бесконечного ожидания освобождения ресурсов. При обычных блокировках, когда один из сеансов захватывает какой-либо ресурс, другие сеансы ожидают его освобождения. Однако, если удерживающий сеанс не может освободить ресурс вследствие того, что оножидает освобождения ресурса, захваченного другим из ожидающих сеансов, возникает парадоксальная ситуация, при которой ни один из захваченных сеансами ресурсов не может быть освобожден. Эта ситуация в Oracle проявляется в виде ошибки:
ORA-00060: deadlock detected while waiting for resource
Если взаимоблокировки возникают нечасто, то они не составляют серьезной угрозы для работы баз данных, поскольку Oracle сам решает эту проблему, снимая взаимоблокировки автоматически в пределах трех секунд откатом DML-операции в одной из сессий (при этом откатившаяся DML-операция может попытаться повторно модифицировать строки, заблокированные не откатившейся операцией).
Вместе с тем если ошибка deadlock возникает часто, то потребуется детальный анализ причин возникновения взаимоблокировок. Диагностировать наличие deadlock-блокировок обычными средствами, которые эффективно работают на выявление обычных блокировок, например динамическими представлениями Oracle, сложно в силу короткого времени ихсуществования. В выявлении наличия deadlock большую помощь может оказать информация из файла системного журнала ошибок alert.log, в котором не только констатируется факт наличия взаимоблокировки, но и указывается на файл трассировки. Последний является важным инструментом в выявлении причин deadlock. Файл трассировки, как правило, размещен в каталоге, который находится через параметр инициализации user_dump_dest запросом:
Select value from v$parameter where name='user_dump_dest';
В анализе же причин блокировок важную роль играет граф ожиданий транзакций из файла трассировок (все эти вопросы будут рассмотрены ниже).
Следует заметить, что в нашей практике возникновение взаимоблокировок в подавляющем случае обусловлено взаимоблокировкой между двумя сессиями. Однако иногда возникают ошибки deadlock внутри одной сессии, что порой создает серьезные проблемы в работе базы данных.
Статью целиком читайте в журнале «Системный администратор», №03 за 2016 г. на страницах 38-42.
PDF-версию данного номера можно приобрести в нашем магазине.
- Михеичев В. Мониторинг блокировок в Oracle. Методы предупреждения и автоматического устранения. // «Системный администратор», №4, 2015 г. – С. 30-35 (http://samag.ru/archive/article/2926).
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|