oracle锁表以及存储的原因
针对在数据库中锁表或者编译存储时,经常会出现无法编译存储,或者编译状态一直在卡着,从而plsql客户端无响应,这时候就要判定是否存在锁表从而导致存储无法编译通过。
-
查询数据库里面是否存在锁表,查询sql如下:
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
可以查到锁表的信息如下:
- 查到数据后,可以使用如下语句进行解锁,后面的session后面的参数 6187是上述sql查到的sid,后面的46273是上述sql查到的字段serial。
alter system kill session '6187,46273';
- 但是当执行这段sql时,会有提示,数据库登陆用户权限不足,该怎么办呢?
- 用dba用户给你所登陆的数据库用户进行添加权限,sql如下:wasys350_gsdl这个是我当前登陆的数据库用户
grant select any dictionary,select any table,unlimited tablespace,update any table,connect,
resource,dba,exp_full_database,imp_full_database,alter any index,insert any table,alter any procedure,alter any table,delete any table,drop any sequence,debug any procedure, debug connect session to wasys350_gsdl;
- 执行完上述添加权限后,可以再次执行下面的sql
alter system kill session '6187,46273';
- 执行完后就可以正常的解锁了,然后用下面sql再次去查询就不会出现锁表的信息了
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
- 当上述sql查不到消息时,说明锁表信息已正常解锁,但是在编译存储的时候还会出现卡死状况,说明锁表进程资源还没有释放,可以使用如下sql第二种,直接可以释放锁表信息资源
alter system kill session 'sid,serial#';(用来终止会话,不释放资源)
alter system kill session '154,58' immediate;(终止会话,释放资源)
- 用第二种可以终止会话并且释放资源,然后进行编译,编译正常通过。