为什么添加数据文件会导致 Oracle 死锁?

为什么添加数据文件会导致 Oracle 死锁?

我注意到 Oracle 中发生了一些我以前从未遇到过的事情。虽然多年来我经常做这种事情。在这种情况下,它是一个 Oracle11 实例(准确地说是在 Linux 上运行的 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64 位)。

我正在导入一个转储文件,同时使用如下语句增加表空间:

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 个 CPU、64 GB 和几 TB 的 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 ...

堆栈跟踪和内存转储可以提供更多信息,但我不是这方面的专家。我所追求的是知道可能是什么,有人以前遇到过这种情况,可以做出明智的猜测。如果这是一个错误,则表明文件系统可能有问题,或者 raid 控制器无法处理负载。为什么这两个语句在等待资源,为什么这个资源不可用。

答案1

查看实际的争用资源可能会有所帮助,但我猜这两个操作都在尝试接触表空间元数据,因此相互锁定。一个很好的测试方法是重新安排您的任务,以便命令alter tablespace不会出现如此巨大的运行(创建数据文件):

imp dumpfile control=blahblah.ctl
create datafile ....
alter tablespace add datafile...

但是,在运行 11g 的机器上,以及您描述的资源,我建议您考虑使用 ASM,而不是手动管理文件。ASM 使 DBA 的工作变得轻松很多(至少对我来说是这样)。

答案2

根据本网站(我发现非常简单的网络搜索)这是因为您的会话与另一个会话冲突:

ORA-00060 错误表示由于与另一个会话发生资源争用而发生死锁,Oracle 回滚了您当前的语句以解决死锁。另一个会话可以照常继续执行。您当前会话回滚的语句需要在所需资源可用后重新提交执行。

阅读该文章中的更多内容以获取有关死锁的更多信息。

答案3

好吧,这是一篇非常老的帖子,但我在尝试解决 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

答案4

当两个会话试图更新某一行时,如果该行已被另一个会话更新但尚未提交或回滚,则会发生死锁。可能涉及两个以上的会话,但主要思想是相同的。

http://dbpilot.net/2018/01/15/ora-00060-deadlock-detected-while-waiting-for-resource/

...

相关内容