oragle gran授权被锁住的情况分析

来源:互联网 发布:js 怎么取数组前10条 编辑:程序博客网 时间:2024/06/04 19:41

一、问题发现

grant select on table1 to user1;
grant select on table2 to user1;
第一个语句能够顺利执行,第二个语句执行不过去,显示一直在执行中,PLSQL显示Executing,只能强行终止。

为什么table1能成功授权,table2不能成功授权,是什么原因引起的呢?

二、问题分析

感觉table2被锁住了。

但是通过以下语句

select * from v$locked_object t1,user_objects t2
where t1.object_id=t2.object_id
未看到有table2被锁住的情况。

 

查询v$session_wait表看看情况

select * from v$session_wait where sid=203  注203为授权窗口对应的会话。

看出有library cache lock事件。
 
判断是不是有存储过程或者function调用此table2。
 
用select * from v$session_wait where event like 'library cache%'查下,里有多少pin和lock
就这一条数据。
用这个查下:
SELECT s.sid,s.SERIAL#, p.kgllkmod "Mode", p.kgllkreq "Req", SPID "OS Process"
                         FROM v$session_wait w, DBA_KGLLOCK p, v$session s, v$process o
                        WHERE p.kgllkuse = s.saddr
                          AND p.kgllkhdl = w.p1raw
                          and w.event like '%library cache%'
                          and s.paddr = o.addr
                          order by p.kgllkmod desc;
 
发现有个26的会话
查下26会话,正在执行什么操作,是否涉及table2
语句:
select sid,
       v$session.username 用户名,
       last_call_et 持续时间,
       status 状态,
       LOCKWAIT 等待锁,
       machine 用户电脑名,
       logon_time 开始登入时间,
       sql_text
from v$session, v$process, v$sqlarea
where paddr = addr
   and sql_hash_value = hash_value
   and status = 'ACTIVE'
   and v$session.username is not null
order by last_call_et desc;
未发现26会话对应的sql_text。
先把26kill掉,再试试授权。
kill 报ora 00031错误。
接着到OS里用kill杀,或orakill杀
到OS上KILL后,现在可以授权了。
问题解决。
三、问题总结
1.为什么v$locked_object什么都不显示
v$locked_object显示的是应用级别的重量级锁
像library cache lock/pin是加在library cache中的轻量级锁,肯定你在v$objected_lock里找不到
v$locked_object列出的锁,是针对某个具体对象的,而library cache lock/pin是应该是针对内存指针或区域的锁
library cache lock/pin,已经有点类似于latch了
这两个概念有点不太好理解,大家如果要弄清楚,估计还要花更多的精力查。
可以看看owi
2.DBA_KGLLOCK lists all the locks and pins held on KGL objects (objects in the Kernel Generic Library cache).
是用library cache pin,就必定有library cache lock,但有library cache lock,不一定有library cache pin
3.请看博文《library cache pin和library cache lock(转) 》