oracle 锁表查询
- 格式:doc
- 大小:27.00 KB
- 文档页数:3
通过搜索摸索,总结了一下 oracle 中查询表的信息,包括表名,字段名,字段类型,主键, 外键唯一性约束信息,索引信息查询 SQL 如下,希望对大家有所帮助:1、查询出所有的用户表select * from user_tables 可以查询出所有的用户表select owner,table_name from all_tables; 查询所有表,包括其他用户表通过表名过滤需要将字母作如下处理select * from user_tables where table_name = upper('表名 '因为无论你建立表的时候表名名字是大写还是小写的, create 语句执行通过之后,对应的 user_tables表中的 table_name字段都会自动变为大写字母, 所以必须通过内置函数 upper 将字符串转化为大写字母进行查询, 否则, 即使建表语句执行通过之后, 通过上面的查询语句仍然查询不到对应的记录。
2、查询出用户所有表的索引select * from user_indexes3、查询用户表的索引 (非聚集索引 :select * from user_indexes where uniqueness='NONUNIQUE'4、查询用户表的主键 (聚集索引 :select * from user_indexes where uniqueness='UNIQUE'5、查询表的索引select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name andt.table_name='NODE'6、查询表的主键select cu.* from user_cons_columns cu, user_constraints au wherecu.constraint_name = au.constraint_name andau.constraint_type = 'P' AND cu.table_name = 'NODE'7、查找表的唯一性约束(包括名称,构成列:select column_name from user_cons_columns cu, user_constraints au wherecu.constraint_name=au.constraint_name andcu.table_name='NODE'8、查找表的外键select * from user_constraints c where c.constraint_type = 'R' andc.table_name='STAFFPOSITION'查询外键约束的列名:select * from user_cons_columns cl where cl.constraint_name = 外键名称查询引用表的键的列名:select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名9、查询表的所有列及其属性方法一:select * from user_tab_columns where table_name=upper('表名 ';方法二:select cname,coltype,width from col where tname=upper('表名 ';;10. 查询一个用户中存在的过程和函数select object_name,created,status from user_objectswhere lower(object_type in ('procedure','function';11. 查询其它角色表的权限select * from role_tab_privs ;。
oracle锁表问题处理查询表的状况的对象:V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS select * from v$locked_objectselect * from dba_objects方法:首先查看哪些表被锁住了select b.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_object a,dba_objects bwhere b.object_id = a.object_id;select ername,b.sid,b.serial#,logon_timefrom v$locked_object a,v$session bwhere a.session_id = b.sid order by b.logon_time;杀进程中的会话alter system kill session 'sid,serial#';例如:alter system kill session '29,5497';查询锁表的方法:SELECT S.SID SESSION_ID, ERNAME, s.SERIAL#,DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION SWHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;解锁方法:ALTER SYSTEM KILL SESSION 'SID,SERIR#'0----------0--------SQL> alter system kill session '1679,2456';alter system kill session '1679,2456'*ERROR at line 1:ORA-01031: insufficient privilegesgrant execute on p_kill_user_session to rtgs_liush();操作的时候用命令:EXEC SYS.P_KILL_USER_SESSION(1679);------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------数据库锁表的分析与解决上面介绍了内存溢出的原因和处理方法,下面再介绍一下数据库锁表及阻塞的原因和处理办法。
Oracle死锁的查看以及解决办法1、查看死锁是否存在select username,lockwait,status,machine,program from v$session where sid in(select session_id from v$locked_object);Username:死锁语句所⽤的数据库⽤户;Lockwait:死锁的状态,如果有内容表⽰被死锁。
Status:状态,active表⽰被死锁Machine:死锁语句所在的机器。
Program:产⽣死锁的语句主要来⾃哪个应⽤程序2、查看死锁的语句select sql_text from v$sql where hash_value in(select sql_hash_value from v$session where sid in(select session_id from v$locked_object));3、死锁的解决办法1)查找死锁的进程:sqlplus "/as sysdba" (sys/change_on_install)SELECT ername,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;2)kill掉这个死锁的进程: alter system kill session ‘sid,serial#’; (其中sid=l.session_id)3)如果还不能解决:select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr; 其中sid⽤死锁的sid替换: exitps -ef|grep spid 其中spid是这个进程的进程号,kill掉这个Oracle进程----------------------------------------------------------------------------------------------------------------------------------"ORA-00054: 资源正忙, 但指定以 NOWAIT ⽅式获取资源, 或者超时失效"的快速解决⽅法今天在导⼀个临时表的数据,导出完成后准备清空数据,执⾏truncate命令时,遇到如下问题:ORA-00054: 资源正忙, 但指定以 NOWAIT ⽅式获取资源, 或者超时失效解决⽅法如下:=========================================================SQL> select session_id from v$locked_object;SESSION_ID----------56SQL> SELECT sid, serial#, username, osuser FROM v$session where sid = 56;SID SERIAL# USERNAME OSUSER---------- ---------- ------------------------------ ------------------------------56 2088 ghb fySQL> ALTER SYSTEM KILL SESSION '56,2088';System altered执⾏完上述命令后,提⽰会话断开。
Oracle查询表空间使⽤情况 --查询表空间使⽤情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间⼤⼩(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使⽤空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使⽤⽐", F.TOTAL_BYTES "空闲空间(M)", F.MAX_BYTES "最⼤块(M)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 1; --查询表空间的free space select tablespace_name, count(*) as extends, round(sum(bytes) / 1024 / 1024, 2) as MB, sum(blocks) as blocks from dba_free_space group by tablespace_name; --查询表空间的总容量 select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name; --查询表空间使⽤率 select total.tablespace_name, round(total.MB, 2) as Total_MB, round(total.MB - free.MB, 2) as Used_MB, round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_free_space group by tablespace_name) free, (select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name) total where free.tablespace_name = total.tablespace_name;1.查找当前表级锁的SQL如下:select sess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefrom v$locked_object lo,dba_objects ao,v$session sesswhere ao.object_id = lo.object_id and lo.session_id = sess.sid;2.杀掉锁表进程:alter system kill session '436,35123';3.RAC环境中锁查找:SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,id1, id2, lmode, request, type,block,ctimeFROM GV$LOCKWHERE (id1, id2, type) IN(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)ORDER BY id1, request;4.监控当前数据库谁在运⾏什么SQL语句select osuser, username, sql_textfrom v$session a, v$sqltext bwhere a.sql_address =b.address order by address, piece;5.找使⽤CPU多的⽤户sessionselect a.sid,spid,status,substr(a.program,1,40) prog, a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat cwhere c.statistic#=12 andc.sid=a.sid anda.paddr=b.addrorder by value desc;6.查看死锁信息SELECT (SELECT usernameFROM v$sessionWHERE SID = a.SID) blocker, a.SID, 'is blocking',(SELECT usernameFROM v$sessionWHERE SID = b.SID) blockee, b.SIDFROM v$lock a, v$lock bWHERE a.BLOCK = 1 AND b.request > 0 AND a.id1 = b.id1 AND a.id2 = b.id2;7.具有最⾼等待的对象SELECT o.OWNER,o.object_name, o.object_type, a.event,SUM (a.wait_time + a.time_waited) total_wait_timeFROM v$active_session_history a, dba_objects oWHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATEAND a.current_obj# = o.object_idGROUP BY o.OWNER,o.object_name, o.object_type, a.eventORDER BY total_wait_time DESC;SELECT a.session_id, s.osuser, s.machine, s.program, o.owner, o.object_name,o.object_type, a.event,SUM (a.wait_time + a.time_waited) total_wait_timeFROM v$active_session_history a, dba_objects o, v$session sWHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATEAND a.current_obj# = o.object_idAND a.session_id = s.SIDGROUP BY o.owner,o.object_name,o.object_type,a.event,a.session_id,s.program,s.machine,s.osuserORDER BY total_wait_time DESC;8.查询当前连接会话数select s.value,s.sid,ernamefromv$sesstat S,v$statname N,v$session Awheren.statistic#=s.statistic# andname='session pga memory'and s.sid=a.sidorder by s.value;9.等待最多的⽤户SELECT s.SID, ername, SUM (a.wait_time + a.time_waited) total_wait_time FROM v$active_session_history a, v$session sWHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE GROUP BY s.SID, ernameORDER BY total_wait_time DESC;10.等待最多的SQLSELECT a.program, a.session_id, er_id, ername, s.sql_text,SUM (a.wait_time + a.time_waited) total_wait_timeFROM v$active_session_history a, v$sqlarea s, dba_users dWHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATEAND a.sql_id = s.sql_idAND er_id = er_idGROUP BY a.program, a.session_id, er_id, s.sql_text, ername;11.查看消耗资源最多的SQLSELECT hash_value, executions, buffer_gets, disk_reads, parse_callsFROM V$SQLAREAWHERE buffer_gets > 10000000 OR disk_reads > 1000000ORDER BY buffer_gets + 100 * disk_reads DESC;12.查看某条SQL语句的资源消耗SELECT hash_value, buffer_gets, disk_reads, executions, parse_callsFROM V$SQLAREAWHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0'); 13.查询会话执⾏的实际SQLSELECT a.SID, ername, s.sql_textFROM v$session a, v$sqltext sWHERE a.sql_address = s.addressAND a.sql_hash_value = s.hash_valueAND a.status = 'ACTIVE'ORDER BY ername, a.SID, s.piece;14.显⽰正在等待锁的所有会话SELECT * FROM DBA_WAITERS;。
oracle 锁详解在 Oracle 数据库中,锁(Lock)用于控制并发访问和确保数据的一致性。
锁是一种机制,它可以限制对特定资源(如表、行、记录等)的访问,以防止并发事务之间的冲突和数据不一致。
Oracle 中的锁可以分为以下几种类型:1. **共享锁(Shared Lock)**:也称为读锁,用于读取数据并确保多个事务可以同时读取相同的数据,而不会相互阻塞。
共享锁可以与其他共享锁共存,但与排他锁互斥。
2. **排他锁(Exclusive Lock)**:也称为写锁,用于对数据进行写入操作,并确保在同一时间只有一个事务可以获取排他锁。
排他锁会阻止其他事务获取共享锁或排他锁。
3. **行级锁 (Row-Level Lock)**:用于锁定表中的特定行,以提供更细粒度的并发控制。
行级锁可以是共享锁或排他锁。
4. **表级锁(Table-Level Lock)**:用于锁定整个表,阻止其他事务对表进行读写操作。
表级锁通常会影响并发性能,因此在 Oracle 中较少使用。
Oracle 数据库自动管理和协调锁的获取和释放。
在执行 DML (数据操作语言)语句时,Oracle 会根据需要自动获取适当类型的锁。
例如,在执行 SELECT 语句时,Oracle 会获取共享锁;而在执行 INSERT、UPDATE 或 DELETE 语句时,Oracle 会获取排他锁。
锁的粒度和类型可以根据事务的隔离级别进行设置。
Oracle 提供了多种隔离级别,如 READ COMMITTED、SERIALIZABLE 等,每个隔离级别都对应不同的锁行为。
了解和管理锁对于确保数据库的并发性能和数据一致性非常重要。
Oracle 数据库提供了一些视图和工具来监控和诊断锁的信息,例如 V$LOCK、V$SESSION 等视图。
如果在应用程序中遇到锁冲突或性能问题,可以使用这些工具来分析和解决锁相关的问题。
请注意,以上是 Oracle 锁的一些基本概念和类型,Oracle 数据库的锁机制非常复杂,并且还有其他更高级的锁类型和特性。
oracle行锁加锁规则Oracle行锁加锁规则是数据库管理中的一个重要概念。
行锁是一种锁定数据库表中某一行数据的机制,用于保证并发操作的数据一致性和正确性。
在使用Oracle数据库时,需要遵循一定的加锁规则,以避免数据错误或死锁的发生。
一、什么是行锁行锁是一种粒度较小的锁,它只锁定数据库表中的某一行数据,而不是整个表或数据库。
当一个事务对某一行数据进行修改时,会将该行数据加上行锁,其他事务在访问该行数据时需要等待行锁释放。
二、行锁加锁规则1. 事务开始时,需要明确要修改的行数据。
可以使用SELECT ... FOR UPDATE语句来获取需要加锁的行数据,并且开启事务。
2. 在事务中修改行数据前,需要使用SELECT ... FOR UPDATE NOWAIT语句对需要修改的行数据加锁。
如果无法获得行锁,则会立即返回错误信息,事务终止。
3. 在事务中修改行数据时,只能修改已加锁的行数据,否则会报错。
修改完成后,需要提交事务来释放行锁。
4. 在事务中获取行数据时,可以使用SELECT ... FOR SHARE语句对需要获取的行数据加锁。
这种锁是共享锁,不阻塞其他事务对该行数据的读取,但会阻塞其他事务对该行数据的修改。
三、行锁加锁规则的应用场景1. 并发事务的数据修改:当多个事务同时对同一行数据进行修改时,需要使用行锁来保证数据一致性。
2. 数据库的查询操作:当某个事务需要对查询结果进行修改时,可以使用行锁来避免其他事务对该行数据的修改。
3. 数据库的插入操作:当多个事务同时插入数据到同一张表中时,需要使用行锁来保证数据的完整性和准确性。
4. 数据库的删除操作:当多个事务同时删除同一行数据时,需要使用行锁来避免数据丢失或冲突。
总结:Oracle行锁加锁规则是数据库管理中的重要概念,它可以保证并发操作的数据一致性和正确性。
在使用行锁时,需要遵循一定的加锁规则,包括明确要修改的行数据、使用SELECT ... FOR UPDATE语句获取行锁、在事务中修改行数据和提交事务释放行锁等。
oracle锁表查询和解锁方法Oracle数据库提供了多种锁表查询和解锁方法,主要包括以下几种:1.查询锁表的方法:-查询数据库中的锁表信息:可以使用`V$LOCKED_OBJECT`视图来查询数据库中当前被锁定的对象和会话信息。
-查看表的锁信息:可以使用`DBA_LOCK`视图来查看指定表被锁定的信息,包括锁定的用户、锁定的模式、锁定的操作等。
-查看表上的锁信息:可以使用`DBA_OBJECTS`视图来查询指定表上的锁信息,包括锁定的用户、锁定的模式、锁定的操作等。
2.解锁表的方法:- 杀死会话:使用`ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;`语句可以立即终止指定会话。
其中,`sid`和`serial#`是要终止会话的标识符。
- 释放表锁:使用`ALTER TABLE table_name ENABLE TABLE LOCK`语句可以释放指定表的锁。
其中,`table_name`是要释放锁的表名。
- 修改会话状态:使用`UPDATE V$SESSION SET STATUS = 'KILLED' WHERE SID = sid AND SERIAL# = serial#;`语句可以将指定会话的状态修改为`KILLED`,从而间接释放表锁。
其中,`sid`和`serial#`是要释放锁的会话的标识符。
3.避免锁表的方法:-尽量使用短事务:短事务可以减少对资源的占用时间,从而降低锁表的风险。
-尽量使用较小的粒度锁:使用较小的粒度锁可以减少锁表的范围,提高并发性能。
-合理调整事务隔离级别:使用合适的事务隔离级别可以在保证数据一致性的前提下减少锁表的发生。
-分表、分区表:将大表进行分表或分区,可以减少锁表的范围,提高并发性能。
4.监控锁表情况:- 监控锁表的工具:可以使用Oracle提供的监控工具,如AWR Report、ASH Report、Enterprise Manager等,来实时监控锁表情况。
oracle行锁加锁规则
Oracle数据库中的行锁是通过使用SELECT ... FOR UPDATE语句或者使用LOCK TABLE语句来实现的。
行锁是用来保护数据行,防止其他事务对其进行修改或删除。
在Oracle中,行锁有一些规则和注意事项,让我们来逐一讨论:
1. SELECT ... FOR UPDATE语句,当你使用SELECT ... FOR UPDATE语句时,它会在查询结果集的行上加上排他锁,这样其他事务就不能修改或删除这些行。
需要注意的是,这种行级锁是在事务提交或回滚时释放的。
2. 锁的粒度,Oracle数据库的行锁是基于行的,也就是说,当你使用行级锁时,只有被查询的行会被锁定,而不是整个表或者整个数据页。
3. 事务隔离级别,行锁的行为还受到数据库事务隔离级别的影响。
在Oracle中,事务隔离级别包括READ COMMITTED、SERIALIZABLE等级别,不同的隔离级别对行锁的行为会有所影响。
4. 死锁,在使用行锁时,需要小心死锁的问题。
如果多个事务
同时尝试锁定相同的行,就有可能发生死锁。
为了避免死锁,需要
合理设计事务逻辑和锁定顺序。
5. 性能影响,行锁可能会对数据库性能产生影响,特别是在高
并发的情况下。
因此,需要在使用行锁时注意性能优化的问题,避
免出现性能瓶颈。
总的来说,Oracle数据库中的行锁是一种重要的并发控制手段,但需要在使用时注意锁的粒度、事务隔离级别、死锁和性能等方面
的问题,以确保数据库的并发访问能够得到有效控制和良好的性能
表现。
oracle排他锁写法在Oracle数据库中,排他锁(Exclusive Lock)用于确保在一个事务中对数据的修改不会被其他事务同时修改。
1.使用SELECT ... FOR UPDATE 语句这是在Oracle中获取排他锁的最常见方法。
通过使用 SELECT FOR UPDATE 语句,你可以锁定选定的行,直到当前事务结束。
这将锁定满足条件的行,防止其他事务对这些行进行修改或删除。
例句:SELECT column_name FROM table_name WHERE condition FOR UPDATE;2.使用事务控制在Oracle中,当你在事务中对表进行更新(如使用 UPDATE 语句)时,Oracle 会自动在被修改的行上设置排他锁。
这个锁会持续到事务结束(提交或回滚)。
例句:BEGINUPDATE table_name SET column_name = value WHERE condition;-- 其他数据库操作COMMIT; -- 或 ROLLBACK;在这个例子中,更新操作后的行会被锁定,直到事务提交或回滚。
3.使用DBMS_LOCK 包Oracle提供了 DBMS_LOCK 包,允许更细粒度的锁控制。
通过这个包,你可以创建自定义的排他锁例子:DECLARElockhandle VARCHAR2(128);result NUMBER;BEGINDBMS_LOCK.ALLOCATE_UNIQUE('my_lock', lockhandle);result := DBMS_LOCK.REQUEST(lockhandle, DBMS_LOCK.X_MODE);-- 执行需要锁定的操作result := DBMS_LOCK.RELEASE(lockhandle);END;在这个例子中,DBMS_LOCK.REQUEST 使用 DBMS_LOCK.X_MODE(排他模式)请求锁。
oracle锁表查询和解锁方法## Oracle 锁表查询和解锁方法Oracle数据库是当今最流行的关系型数据库系统,其中有一种十分重要的特性就是它可以锁定数据库表,防止别人修改该表的内容,又被称为并发控制。
下面我们分别来看看Oracle中查询和解锁表的方法:### 一、Oracle中查询锁表方法1. 使用系统内置函数查询锁表- 以DBA权限登录,使用“select * from v$lock;”查询锁表状态;- 使用“SELECT l.sid, l.type, l.mode, l.id1,ername, s.osuser, s.machine FROM v$lock l,v$session s WHERE l.sid=s.sid;”查询出锁表具体信息,以便确定锁表的具体情况和引起表锁定的原因。
2. 使用dba_dml_locks视图查看锁表- 以DBA账号登录,使用“select * fromdba_dml_locks;”命令查看锁表的状态;- 使用“select * f rom dba_dml_locks where name='表名' and mode_held='锁定模式';”命令查看表名称以及表上锁定的模式。
### 二、Oracle中解锁表方法1. 强制执行表解锁:- 使用“ALTER SYSTEM KILL SESSION'sid,serial#' IMMEDIATE;”命令强制杀死会话占用表的会话,以释放表上的锁定;- 使用“select * from v$lock;”命令查询是否成功释放表的锁定。
2. 将表上锁定的模式转换- 使用Oracle的“alter system 的 kill session 命令”可以将表上的锁定模式转换,将表上的某个类型的锁定模式被另外一种更安全的锁定模式替换; - 使用“Select * from v$lock;” 命令查询是否转换成功。
mysql查询数据库锁表的sql语句要查询数据库中锁定的表,可以使用以下SQL语句:
```sql
SHOW OPEN TABLES WHERE In_use > 0;
```
这个语句会显示当前正在被使用的所有表。
除此之外,我们还可以利用以下的途径来拓展查询数据库锁表的方式:
1.查询表级别的锁定情况:可以通过下面的语句查询具体的表锁定情况。
```sql
SHOW OPEN TABLES WHERE In_use > 0 AND TABLE_NAME =
'your_table_name';
```
2.查询行级别的锁定情况:可以通过以下语句查询正在被锁定的行。
```sql
SELECT * FROM your_table_name WHERE innodb_lock_id =
'your_lock_id';
```
3.查看全部锁定情况:我们可以使用以下命令查看当前数据库中的全部锁定信息。
```sql
SHOW ENGINE INNODB STATUS;
```
这个命令会返回包含了丰富信息的输出,包括锁定情况、死锁情况等。
请注意,在使用以上操作之前,确保你具备足够的权限来执行这些命令,因为这些命令需要访问信息_schema和performance_schema 数据库。
oracle中查找被锁的表到底是哪一行被锁定了2008-07-18 10:13如何查找被锁的表到底是哪一行被锁定了简单的总结一下。
首先v$ses sion中的这几个字段的含义分别为ro w_wai t_row#---被锁定行的r ownum,但是准确的说是对应的于row id的ro wnum,并非是单纯的rown um。
下面再详细的说。
row_wait_obj#---ro w_wai t_row#对应的r owid所在的表的o bject id。
row_w ait_f ile#-- row_wait_row#对应的ro wid所在的数据文件idro w_wai t_blo ck#--row_w ait_r ow#对应的rowi d所在的b lock的id只有一个ses sion等待另一个s essio n的时候,这几个列的值才是有效的。
想要知道某一个表具体被锁定的是哪一行,可以利用上面这几个值,查找出被锁定行的rowi d。
使用dbms_rowid b包的一个子过程(S ubpro grams)rowi d_cre ateD BMS_R OWID.ROWID_CREA TE (ro wid_t ype INNUMBE R, obje ct_nu mberIN NU MBER,r elati ve_fn o INNUMBE R, bloc k_num ber I N NUM BER,ro w_num ber INNUMBE R)RE TURNROWID;其中r owid_type的取值为0表示生成一个res trict ed RO WID(p re-or acle8 form at);取值为1表示生成一个exte ndedROWID.obj ect_n umber取值是db a_obj ects视图中的da ta_ob ject_id,并不是obje ct_id,也就是说不能用ro w_wai t_obj#.re lativ e_fno取值是Re lativ e文件号,在dba_data_files里可以查到bloc k_num ber取值是数据文件的块号,也就是v$s essio n中的ro w_wai t_blo ck#的值row_numbe r通过ro wid对应出来的ro wnum,也就是ro w_wai t_row#的值。
先查看哪些表被锁住了
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id
and object_name ='HDM_COMPLETED_RATE';
OWNER OBJECT_NAME SESSION_ID LOCKED_MODE
------------------------------ --------------------------------------
-------
WSSB SBDA_PSHPFTDT 22
3
WSSB_RTREPOS WB_RT_SERVICE_QUEUE_TAB 24
2
WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB 29
2
WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB 39
2
WSSB SBDA_PSDBDT 47
3
WSSB_RTREPOS WB_RT_AUDIT_DETAIL 47
3
select ername,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid and sid in(
select a.SESSION_ID
from v$locked_object a,dba_objects b
where b.object_id = a.object_id
and object_name ='HDM_COMPLETED_RATE') order by b.logon_time
USERNAME SID SERIAL# LOGON_TIME
------------------------------ ---------- ---------- -----------
WSSB_RTACCESS 39 1178 2006-5-22 1
WSSB_RTACCESS 29 5497 2006-5-22 1
杀会话
alter system kill session 'sid,serial#';
e.g
alter system kill session '231,59331';
如果有ora-00031错误,则在后面加immediate;
alter system kill session '29,5497' immediate;
-------------
1.查哪个过程被锁
查V$DB_OBJECT_CACHE视图:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='fmdb' AND CLOCKS!='0';
2. 查是哪一个SID,通过SID可知道是哪个SESSION.
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';
3. 查出SID和SERIAL#
查V$SESSION视图:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'
查V$PROCESS视图:
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
4. 杀进程
(1).先杀ORACLE进程:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2).再杀操作系统进程:
KILL -9 刚才查出的SPID
或
ORAKILL 刚才查出的SID 刚才查出的SPID
------------------
oracle的死锁
查询数据库死锁
select ername||' '||t2.sid||' '||t2.serial#||' '||t2.logon_time||'
'||t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid
and t2.sql_address=t3.address
order by t2.logon_time;
查询出来的结果就是有死锁的session了,
下面就是杀掉
拿到上面查询出来的SID和SERIAL#,填入到下面的语句中
alter system kill session 'sid,serial#';
一般情况可以解决数据库存在的死锁了,
或通过session id 查到对应的操作系统进程,在unix中杀掉操作系统的进程。
SELECT ername,c.spid AS os_process_id,c.pid AS oracle_process_id FROM v$session a,v$process c
WHERE c.addr=a.paddr and a.sid= and a.serial#= ;
然后采用kill (unix)或 orakill(windows )
在unix中
ps -ef|grep os_process_id
kill -9 os_process_id
ps -ef|grep os_process_id
----
经常在oracle的使用过程中碰到这个问题,所以也总结了一点解决方法:)
1)查找死锁的进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT
ername,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l .PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果还不能解决,
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中sid用死锁的sid替换。
exit
ps -ef|grep spid
其中spid是这个进程的进程号,kill掉这个Oracle进程。