oracle 锁表查询
oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)

通过搜索摸索,总结了一下 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 1c ¥o k与 v ssin、d ao j cs连 接 , ¥ eso b be t
_ _
可 以查 询 出 当 前 哪 些 用 户 正 锁 住 哪 些 对 象 :
息 表 被 锁 住 了 , al Orce死 锁 了 。” 实 这 话 说 得 并 不 其 准确 , 却 引 出 了一个 有 意义 的话 题 , 个所 有 O. 但 一 r al ce数 据 库 使 用 者 都 可 能 遇 到 的 话 题 :Orce数 据 al
库 的锁 资源 竞争 。
对 象被 锁 住后 , 么 时候 才 解锁 呢 ? 正常情 况 什
US RNAME OB EC _ E J T NAM J C YP OB E T T E
一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一
3 Orce数 据 库 的 锁 资 源 竞 争 的 解 决 . al 有 三 点 建 议 可 以 减 少 Orce数 据 库 锁 资 源 竞 al
以 造 成 Orce数 据 库 的 锁 资 源 竞 争 。 al
2 f m ¥lc 。 r v o ka v¥ ss in b d ao j csc o e s , b _ be t o 3 w e ea sd=b sda d a i h r . i . i n .dl=co jcjd . be t ;
的 是 DBA 常 用 的 第 二 种 方 法 :
为什 么要 有锁 ? 为 的是 保证 数据 的一致 性 , 也 就 是说 , 证 某一 用 户在 其会 话 过程 中看到 的数 据 保 是 保持 不变 的 , 即使 别 的用 户 正 在 改 变 它 。
oracle锁表问题处理

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根据外键名查关联的表

4、查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询):
select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表
查询外键约束的列名:
select * from user_cons_columns cl where cl.constraint_name = 外键名称
2、查找表的主键(包括名称,构成列):
select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查询的表
查询引用表的键的列名:
select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名
5、查询表的所有列及其属性
select t.*,MENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表 ......
பைடு நூலகம்
3、查找表的唯一性约束(包括名称,构成列):
select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table_name = 要查询的表
Oracle死锁的查看以及解决办法

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锁等待处理方法

DECODE (l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL)
LOCK_LEVEL,
o.owner,
o.object_name,
SELECT * FROM v$session_wait;
--1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
总结1:Oracle的锁表与解锁
SELECT ername,
DECODE (l.TYPE, 'tm', 'table lock', 'tx', 'row lock', NULL)
lock_level,
o.owner,
l.os_user_name,
s.machine,
s.terminal,
a.sql_text,
a.action
FROM v$sqlarea a, v$session s, v$locked_object l
6, 'Exclusive', 'Unknown') RequestMode,
ctime, block b
from v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id;
Oracle查询表空间使用情况

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 锁详解在 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 数据库的锁机制非常复杂,并且还有其他更高级的锁类型和特性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先查看哪些表被锁住了
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进程。