Назад | Перейти на главную страницу

Почему добавление файла данных может вызвать тупик в Oracle?

Я заметил кое-что в 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/

...