在实践中经常遇到TX死锁,什么是死锁呢?就是甲左手抓了一只鸡,右手想抓鹅。而丙右手抓了一只鹅,左手想去抓鸡。鸡在甲手里,鹅在丙手里。并且只有1只鸡,1只鹅。甲丙两人都很争强好胜之人,都不会退一步,也没得退,谁会放弃手中的肉?
在ORACLE数据库单实例中比较好找出来 主要是通过告警日志ALERT.LOG定位到 DEADLOCK,系统会把对应的进程DUMP出来,而ALERT.LOG会有其路径和名字。您只要VIM 它就行了。里面有ROWID和SQL 就知道了。
而RAC ALERT.LOG 定位出来的路径是LMD0.TRC
根据DID = 16_0_52 去定位29948.TRC内容
在这里无法显示完整的SQL文本,也没有SQL_ID,也没有单实例中的死锁图。后面还有一大段甲骨文内部人员看得懂的信息。
要看具体哪行怎么办?
RAC环境下死锁发生的时候,在系统的BDUMP目录下的DIAG进程的TRACE文件中也会有相关的记录的。首先ps -ef|grep diag找到当前实例的DIAG进程的操作系统进程号,然后根据<SID>_diag_<OSPID>.trc来找到对应的TRACE文件,然后翻到死锁发生的时间点
打开看<SID>_DIAG_29905.TRC
在死锁时间段间DUMP两个跟踪文件。
打开这两个进程文件在文件头部分会显示DUMP的是哪个进程ID
两个进程ID 14301 & 14416 以及对应的会话ID ,而进程ID从LMD0_29948.TRC获得。
最后在文件尾巴部分会有具体的哪行?
OBJ =252920 ROWID=AAA9v4AAaABuggAAAA
对象ID 通过
SELECT * FROM DBA_OBJECTS WHERE OBJECT_ID=?
行:
SELECT * FROM T WHERE ROWID ='?'