Я заметил кое-что в Oracle, чего раньше со мной не случалось. Хотя я часто этим занимаюсь уже много лет. В данном случае это экземпляр Oracle11 (если быть точным, Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64-разрядная версия, работающая в Linux).
Я импортирую файл дампа и в то же время увеличиваю табличное пространство, используя такие инструкции:
alter tablespace example add datafile '/path/to/oradata/instance/exampleXX.dbf' size 31000m;
Иногда я получаю следующую ошибку при выполнении вышеуказанного оператора:
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
Я могу перезапустить оператор alter tablespace, и со второй попытки все пройдет нормально.
Я спрашиваю, почему это происходит, потому что это необычно для меня. Указывает ли это на ошибку или мешающий сбой файловой системы? Я понимаю, что одновременный запуск импорта и добавление файлов данных в табличное пространство может быть сложным для сервера, однако в его распоряжении 4 ЦП, 64 ГБ и несколько ТБ SAS raid10.
Между прочим, это не производственная система.
Соответствующий вывод файла трассировки:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TT-00000006-00000010 36 11 SX 38 142 S
TT-00000006-00000010 38 142 S 36 11 SX
session 11: DID 0001-0024-0000005D session 142: DID 0001-0026-00000068
session 142: DID 0001-0026-00000068 session 11: DID 0001-0024-0000005D
Rows waited on:
Session 11: no row
Session 142: no row
----- Information for the OTHER waiting sessions -----
Session 142:
sid: 142 ser: 30639 audsid: 0 user: 5/SYSTEM flags: 0x8000051
pid: 38 O/S info: user: example_user, term: UNKNOWN, ospid: 14589
image: example@example (DW00)
current SQL:
CREATE TABLE EXAMPLE ...
----- Error Stack Dump -----
ORA-00060: deadlock detected while waiting for resource
----- Current SQL Statement for this session (sql_id=6bvzdgdn8vqqt8) -----
alter tablespace ...
Трассировка стека и дамп памяти могут предоставить дополнительную информацию, однако я не являюсь специалистом по их устранению. Мне нужна идея, что это может быть, кто-то, у кого такое случалось раньше, кто мог сделать обоснованное предположение. Если это ошибка, это означает, что в файловой системе могут возникнуть проблемы или что рейд-контроллер не может справиться с нагрузкой. Почему два утверждения ждали ресурс и почему этот ресурс был недоступен.
В соответствии с этот сайт (что я нашел с очень простой поиск в Интернете) это потому, что ваш сеанс конфликтует с другим:
Ошибка ORA-00060 указывает на то, что мертвая блокировка возникла из-за конфликта ресурсов с другим сеансом, и Oracle откатил ваш текущий оператор, чтобы разрешить мертвую блокировку. Другой сеанс может продолжаться как обычно. Операторы с откатом текущих сеансов должны быть повторно отправлены на выполнение после того, как требуемые ресурсы станут доступны.
Прочтите эту статью, чтобы узнать больше о взаимоблокировках.
Было бы полезно увидеть фактические ресурсы в состязании, но я предполагаю, что обе операции пытаются коснуться метаданных табличного пространства и, таким образом, блокируют друг друга. Хорошим тестом для этого будет перегруппировка задач так, чтобы alter tablespace
у команды не было такого большого биения (создание файла данных):
imp dumpfile control=blahblah.ctl
create datafile ....
alter tablespace add datafile...
Однако на машине с 11g и описанными вами ресурсами я бы рекомендовал взглянуть на использование ASM, а не на управление файлами вручную. ASM значительно упрощает жизнь администраторам баз данных (ну, в любом случае, мою).
Что ж, это очень старый пост, но я попал на эту страницу, пытаясь решить ту же проблему с моим сервером Oracle 12c. Наконец, это произошло потому, что я достиг предела по умолчанию в 200 файлов данных, настроенных в управляющих файлах:
SQL> select max(FILE_ID) from DBA_DATA_FILES;
MAX(FILE_ID)
------------
200
Мне пришлось увеличить это значение, а затем я мог создать новое табличное пространство, чтобы добавить файл данных к существующему:
alter system set db_files = 2000 scope = spfile;
dbshut / dbstart
Тупиковая ситуация возникает, когда 2 сеанса блокируют друг друга, пытаясь обновить строку, которая уже обновлена другим сеансом, но еще не была зафиксирована или откат. Может быть задействовано больше двух сессий, но основная идея одна и та же.
http://dbpilot.net/2018/01/15/ora-00060-deadlock-detected- while-waiting-for-resource/
...