在数据库迁移脚本中, alter tablespace $ts read only;这句可能会僵死,原因是之前有sql语句的事务阻塞了导致的,可以通过下面的方法来查询:
1、执行sql:
SELECT SQL_TEXT, SADDRFROM V$SQLAREA,V$SESSIONWHERE V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESSAND SQL_TEXT LIKE 'alter tablespace%';
这句sql是查出alter tablespace这句sql的地址号,结果如下,红色为地址号
SQL_TEXT SADDR
---------------------------------------- ----------------
alter tablespace tbs_tts1 read only 0000040634C0D8B8
2、执行 sql:
SELECT SES_ADDR, START_SCNB
FROM V$TRANSACTION
ORDER BY START_SCNB;
这句sql是查询阻塞的事务,并按先后顺序排列,结果如下,红色为alter tablespace的事务号,在它的上面有个事务被阻塞了,因此它要等待,之前的事务号是:2976616884,sql地址是0000040634C254F8
SES_ADDR START_SCNB---------------- ----------0000040634C254F8 2976616884 --> Waiting on this transaction
0000040634C0D8B8 2980274305 --> alter tablespace read only
0000040634C53858 2980283454
3、 执行sql:
SELECT T.SES_ADDR, S.USERNAME, S.MACHINE
FROM V$SESSION S, V$TRANSACTION T
WHERE T.SES_ADDR = S.SADDR
ORDER BY T.SES_ADDR
此sql语句查出是哪个用户以及哪个机器导致了事物被阻塞了,结果如下,可以看到0000040634C254F8是用户RT_ADMIN导致的,他的机器名是isdweb1
SES_ADDR USERNAME MACHINE---------------- -------------------- ------------------0000040634C254F8 RT_ADMIN isdweb14、知道事务的ses_addr号后就可以查询它的所有东西了,如它的sql语句是多少,session号是多少等都可以查出来,这样就能定位出导致数据库僵死的原因了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24015283/viewspace-709154/ ,如需转载,请注明出处,否则将追究法律责任。