我注意到 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
答案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/
...