我注意到了Oracle以前从未发生过的一些事情。 虽然我现在经常做这种事情多年。 在这种情况下,它是一个Oracle11实例(Oracle数据库11g企业版版本11.2.0.1.0 – 在Linux上精确运行的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的RAID 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 ...
堆栈跟踪和内存转储可以提供更多的信息,但我不是一个专家解决这些问题。 我所追求的是一个什么样的想法,一个曾经发生过这种事情的人可以做出明智的猜测。 如果这是一个bug,文件系统可能有问题,或者RAID控制器无法处理负载。 为什么这两个语句等待资源,为什么这个资源不可用。
查看争用中的实际资源可能会有所帮助,但是我猜测这两个操作都试图触摸表空间元数据并相互locking。 一个很好的testing就是重新安排你的任务,这样alter tablespace命令没有如此巨大的用尽(创build数据文件):
imp dumpfile control=blahblah.ctl create datafile .... alter tablespace add datafile...
但是,在一台运行11g的计算机上,使用您描述的资源,我build议您考虑使用ASM,而不是手动pipe理文件。 ASM让DBA的生活变得如此简单(不pipe怎么样)。
根据这个网站 (我发现了一个非常简单的networkingsearch ),这是因为你的会议与另一个会议冲突:
ORA-00060错误表示由于与另一个会话的资源争用而发生死锁,Oracle回滚当前语句以解决死锁。 另一个会话可以照常进行。 您所需的资源可用后,您当前的会话已滚存支持的语句需要重新提交以供执行。
阅读这篇文章,了解关于死锁的更多信息。
那么这是一个非常古老的post,但是我试图解决与Oracle 12c服务器相同的问题。 最后是因为我达到了在控制文件中configuration的200个数据文件的默认限制:
SQL> select max(FILE_ID) from DBA_DATA_FILES; MAX(FILE_ID) ------------ 200
我不得不增加这个值,然后我可以创build一个新的表空间o将一个数据文件添加到现有的表空间:
alter system set db_files = 2000 scope = spfile; dbshut / dbstart