EBS_DBA_查询:锁相关

本文提供了一系列Oracle SQL查询语句,用于诊断和解决Oracle数据库中的锁问题。包括查询锁定对象、锁定会话信息、锁定类型及模式等,帮助DBA快速定位并解决由锁引起的性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select DISTINCT lk.session_id sid,
 se.serial#,
 lk.locked_mode lk_md,
 '|',
  se.CLIENT_IDENTIFIER c_name, --BES系统登录名
  dd.FULL_NAME,
  se.logon_time,
  se.ACTION,
  FV.RESPONSIBILITY_NAME transfer,
  lk.oracle_username || '_' || lk.os_user_name || '_' ||se.machine user_info,
  '|',
  se.MODULE,
  BF.FORM_NAME,
  --substr(se.MODULE, instr(se.MODULE, ':', 1, 3) + 1, length(se.MODULE)),
  FT.USER_FORM_NAME,
  FT.LANGUAGE,
  se.WAIT_CLASS,
  sw.event,
  la.name,
  sa.sql_text,
  '|',
  'alter system kill session ''' || se.sid || ',' || se.serial# || ''';' killsql,
  c.spid AS os_process_id,
  c.pid,
  'ps -ef | grep ' || c.spid as check_os_process_command,
  'kill -9 ' || c.spid as kill_os_process_command
FROM v$locked_object  lk,
 v$session   SE,
 v$sqlarea   sa,
 v$session_wait  sw,
 v$latch    la,
 v$process   c,
 per_people_f   dd,
 FND_USER   FU,
 FND_RESPONSIBILITY_VL fv,
 FND_FORM_TL    FT,
 FND_FORM   BF
WHERE 1 = 1
 AND se.sid = lk.session_id
 AND se.prev_sql_addr = sa.address
 AND se.sid = sw.sid
 AND se.paddr = c.addr
 AND sw.p2 = la.latch#(+)
 AND se.CLIENT_IDENTIFIER = FU.user_name
 AND fu.EMPLOYEE_ID = DD.PERSON_ID
 AND substr(se.ACTION, instr(se.ACTION, '/', 1, 1) + 1, length(se.action))=FV.RESPONSIBILITY_KEY(+)
 AND substr(se.MODULE, instr(se.MODULE, ':', 1, 3) + 1, length(se.MODULE))= BF.FORM_NAME(+)
 AND BF.FORM_ID = FT.FORM_ID(+)
 AND FT.LANGUAGE(+) = USERENV('LANG')
ORDER BY se.LOGON_TIME,sid
应当注意对于sid在100以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以kill. 可以用Spotlight软件对数据库的运行状态进行监控。
oracle会话被锁是经常的。可以使用alter system kill session 'sid,serial#'杀死会话,   如果有长期出现的一列,可能是没有释放的锁。我们可以用下面SQL语句杀掉长期没有释放非正常的锁:如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
--解除锁定 --1.强制:
alter system kill session 'sid,serial#';
--2.当占用锁会话commit时,解除锁定alter system kill session 'sid,serial#';
==============================================
--以下几个为相关表  
 
SELECT * FROM v$lock;  
 
SELECT * FROM v$sqlarea;  
 
SELECT * FROM v$session;  
 
SELECT * FROM v$process ;  
 
SELECT * FROM v$locked_object;  
 
SELECT * FROM all_objects;  
 
SELECT * FROM v$session_wait;  
===================================================
--1.查出锁定object的session的信息以及被锁定的object名,生    
select b.owner,
      b.object_name,
        x.WAIT_CLASS,--引起等待的类
      l.session_id,
      x.SERIAL#,
        l.locked_mode 锁定模式,
        lpad(' ', decode(l.xidusn, 030)) || l.oracle_username DB用户,
      l.os_user_name OS用户,
      x.username,
      x.logon_time,
      x.machine 机器名,
      x.terminal,
      x.client_info,
        x.logon_time,
      'alter system kill session ''' || x.sid || ',' || x.serial# || ''';' killsql,
      c.spid AS os_process_id,
      c.pid,
      'ps -ef | grep ' || c.spid as check_os_process_command,
      'kill -9 ' || c.spid as kill_os_process_command
from v$locked_object l, dba_objects b, v$session x, v$process c
where b.object_id = l.object_id
 and l.SESSION_ID = x.SID
 and c.addr = x.paddr
--and OBJECT_NAME like 'MTL_ITEM_LOCATIONS'
order by b.object_id,l.xidusn DESC;

--如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待(左边锁右边等待?????)  
--以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。  
--如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
--还可以根据v$session_wait;查看等待事件
--2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句  
 
 
SELECT lk.session_id sid,
      se.serial#,
       lpad(' ', decode(lk.xidusn, 030)) || lk.oracle_username User_name,
        lk.locked_mode,
      lk.oracle_username,
      se.user#,
      lk.os_user_name,
      se.machine,
      se.terminal,
      a.sql_text,
      a.action
FROM v$sqlarea a, v$session se, v$locked_object lk
WHERE lk.session_id = se.sid
 AND se.prev_sql_addr = a.address
--  and sid= &sid      --利用sid找到相应的sql
ORDER BY sid, se.serial#;
 
--3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode  
--这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,  
--任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
SELECT s.sid, --会话ID
      s.serial#,
      s.username,
      decode(l.type, 'TM''TABLE LOCK''TX''ROW LOCK', l.type) LOCK_LEVEL,
      o.object_name--对象名称
      o.object_type, --对象类型
      l.lmode,
      l.request,
      o.owner, --对象用户
      s.schemaname,
      s.osuser, --操作系统用户
      s.process,
      s.machine, --对象机器名域名
      s.terminal, --对象名称
      s.program, --对象通过程序
      s.logon_time,
      l.block
 FROM v$session s, v$lock l, dba_objects o
WHERE l.sid = s.sid
  AND l.id1 = o.object_id(+)
  AND s.username is NOT Null
  and l.type in ('TX''TM')
-- AND o.OBJECT_NAME='MTL_ITEM_LOCATIONS'
and s.sid=&input_sid
order by s.sid,o.OBJECT_NAME;

--4.这是查找被锁包的SQL
   select B.SID,
   b.USERNAME,
   b.MACHINE,
   a.OBJECT,
   'alter system kill session ' || '''' || b.SID || ',' || b.SERIAL# ||
   ''';' kill_command
   FROM V$ACCESS A, V$SESSION B
   WHERE A.SID = B.SID
   and upper(a.OBJECT) like '%CUX%'
   and a.TYPE = 'PACKAGE'
--根据包名查找锁
select 'alter system kill session ' || '''' || to_char(b.sid) || ',' ||
      to_char(b.serial#) || '''' || ';' kill_statement,      
      b.sid,
      b.serial#,
      b.*
 from dba_ddl_locks a, v$session b
where a.session_id = b.sid
  and a.name = 'DFG_EXP_HOMEPG';
=====================================
5.查看等待事件:

select sid,
      event,
      p1     as "p1 as file_id",
      p2     as "p2 as block_id/latch",
      p3     as "p3 as blocks",
      l.name
 from v$session_wait sw, v$latch l
where event not like '%SQL%'
  and event not like '%rdbms%'
  and event not like '%mon%'
  and sw.p2 = l.latch#(+)
  and sid=&input_sid;
==================================================
查看是谁锁了谁
select s1.username /*|| [ email = '@' ] '@' [ / email ] */|| s1.machine || ' ( SID=' || s1.sid || ' ) is blocking '|| s2.username || /*[ email = '@' ] '@' [ / email ] ||*/ s2.machine || ' ( SID=' || s2.sid || ' ) ' ASblocking_status
 from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid = l1.sid
  and s2.sid = l2.sid
  and l1.BLOCK = 1
  and l2.request > 0
  and l1.id1 = l2.id1
  and l2.id2 = l2.id2;








===============================================
6.通过并发管理器的请求的ID查SQL
a.先查sid
SELECT 'Request id: ' || request_id,
      'Trace id: ' || oracle_Process_id,
      'Trace Flag: ' || req.enable_trace,
      'Trace Name: ' || dest.value || '/' || dbnm.value || '_ora_' || oracle_process_id || '.trc',
      'Prog. Name: ' || prog.user_concurrent_program_name,
      'File Name: ' || execname.execution_file_name || execname.subroutine_name,
      'Status : ' || decode(phase_code, 'R''Running') || '-' || decode(status_code, 'R''Normal'),
      'SID Serial: ' || ses.sid || ',' || ses.serial#,
        ses.sid,
      'Module : ' || ses.module
 from fnd_concurrent_requests    req,
      v$session                  ses,
      v$process                  proc,
      v$parameter                dest,
      v$parameter                dbnm,
      fnd_concurrent_programs_vl prog,
      fnd_executables            execname
where req.request_id = &request id
  and req.oracle_process_id = proc.spid(+)
  and proc.addr = ses.paddr(+)
  and dest.name = 'user_dump_dest'
  and dbnm.name = 'db_name'
  and req.concurrent_program_id = prog.concurrent_program_id
  and req.program_application_id = prog.application_id
     --- and prog.application_id = execname.application_id
  and prog.executable_application_id = execname.application_id
  and prog.executable_id = execname.executable_id;
-------------------------
b.
##查引起等待的类
select a.WAIT_CLASS from v$session a where a.sid= xxx;
-------------------------
c.
##查引起等待的SQL
select sql_text, sql_id, hash_value
 from v$sqltext_with_newlines
where hash_value in
      (select SQL_HASH_VALUE
         from v$session
        where paddr in
              (select addr
                 from v$process
                where spid = (select b.oracle_process_id
                                from apps.fnd_concurrent_requests b
                               where b.request_id = 1413621)))
order by piece;
==========================================================
另一个查并发的
SELECT U.USER_NAME,
      APP.APPLICATION_SHORT_NAME,
      FAT.APPLICATION_NAME,
      FR.RESPONSIBILITY_KEY,
      FRT.RESPONSIBILITY_NAME,
      FFF.FUNCTION_NAME,
      FFT.USER_FUNCTION_NAME,
      ICX.FUNCTION_TYPE,
      ICX.FIRST_CONNECT,
      ICX.LAST_CONNECT
 FROM ICX_SESSIONS          ICX,
      FND_USER              U,
      FND_APPLICATION       APP,
      FND_APPLICATION_TL    FAT,
      FND_RESPONSIBILITY    FR,
      FND_RESPONSIBILITY_TL FRT,
      FND_FORM_FUNCTIONS    FFF,
      FND_FORM_FUNCTIONS_TL FFT
WHERE 1 = 1
  AND U.USER_ID = ICX.USER_ID
  AND ICX.RESPONSIBILITY_APPLICATION_ID = APP.APPLICATION_ID
  AND FAT.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID
  AND FAT.LANGUAGE = 'ZHS'
  AND FR.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID
  AND FR.RESPONSIBILITY_ID = ICX.RESPONSIBILITY_ID
  AND FRT.LANGUAGE = 'ZHS'
  AND FRT.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID
  AND FRT.RESPONSIBILITY_ID = ICX.RESPONSIBILITY_ID
  AND FFF.FUNCTION_ID = ICX.FUNCTION_ID
  AND FFT.FUNCTION_ID = ICX.FUNCTION_ID
  AND ICX.DISABLED_FLAG != 'Y'
  AND ICX.PSEUDO_FLAG = 'N'
  AND (ICX.LAST_CONNECT +
      DECODE(FND_PROFILE.VALUE('ICX_SESSION_TIMEOUT'),
              NULL,
              ICX.LIMIT_TIME,
              0,
              ICX.LIMIT_TIME,
              FND_PROFILE.VALUE('ICX_SESSION_TIMEOUT') / 60) / 24) >
      SYSDATE
  AND ICX.COUNTER < ICX.LIMIT_CONNECTS;

 

转载于:https://www.cnblogs.com/hopedba/p/5794574.html

<think>嗯,用户这次问的是Oracle EBS 12.1.3的表结构问题。看来ta是个EBS技术人员,可能是开发或DBA,需要具体版本的结构信息。之前已经解释过EBS数据字典的概念,这次要聚焦在12.1.3这个特定版本上。 用户可能正在做版本升级的准备工作,或者遇到了12.1.3特有的表结构问题。ta没提具体模块,所以需要给出通用查询方法,再补充版本注意事项。上次回答里提到过版本差异风险,这次要更具体些。 12.1.3是R12的重要版本,它的表结构和11i差别很大,特别是多组织架构和多币种处理。得强调关键视图ALL_TABLES和FND_TABLES的区别,还有新引入的VPD策略视图。安全方面要再次警告不要直接改基表——上次虽然提过,但看到很多技术人员还是会冒险。 查询示例准备用PO_HEADERS_ALL,这是采购模块核心表,能展示多组织字段ORG_ID的特性。附加问题要覆盖版本对比、多组织查询和安全操作,特别是MOAC特性相关视图,这是12.1.3的重点变化。 对了,还得提醒数据字典版本可能滞后于实际补丁,这个坑很多人在升级时都踩过。最后检查下是否所有建议都符合Oracle支持规范,不能教用户用未公开API。</think>在 Oracle EBS R12.1.3 中,**表结构**指的是构成应用程序模块(如 GL、AP、AR、PO、INV 等)的数据库物理表的设计,包括表名、列名、数据类型、约束、索引等元数据信息。这些信息存储在 Oracle 数据库的数据字典中,并通过特定的 EBS 视图(主要在 `APPS` 模式下)暴露给用户查询。 **查询 EBS R12.1.3 表结构的核心方法:** 1. **`DESCRIBE` 命令 (SQL\*Plus, SQL Developer):** 最快速查看表列定义。 ```sql DESC APPS.PO_HEADERS_ALL; -- 例如查看采购订单头表结构 ``` 2. **标准 Oracle 数据字典视图 (查询 `APPS` 模式下的表):** * `DBA_TABLES` / `ALL_TABLES` / `USER_TABLES`: 查看表的基本信息(表空间、存储参数等)。 * `DBA_TAB_COLUMNS` / `ALL_TAB_COLUMNS` / `USER_TAB_COLUMNS`: **最常用**,查看所有列的定义(列名、数据类型、长度、精度、是否可为空、默认值等)。 ```sql SELECT column_name, data_type, data_length, data_precision, data_scale, nullable FROM all_tab_columns WHERE owner = 'APPS' AND table_name = 'PO_HEADERS_ALL' ORDER BY column_id; ``` * `DBA_CONSTRAINTS` / `DBA_CONS_COLUMNS`: 查看主键、外键、唯一键、检查约束。 * `DBA_INDEXES` / `DBA_IND_COLUMNS`: 查看索引信息。 3. **EBS 特定的数据字典视图 (以 `FND_` 开头):** * `APPS.FND_TABLES`: 存储 EBS 中注册的应用表的信息(表名、应用ID、表类型等)。**注意:** 此视图存储的是 EBS *注册*的表的元数据,不是物理结构。物理结构用 `DBA_TAB_COLUMNS` 查。 * `APPS.FND_COLUMNS`: 存储 EBS 中注册的应用表的列的信息(列名、表应用ID、列序列等)。同样,物理结构用 `DBA_TAB_COLUMNS`。 ```sql -- 查找表在FND_TABLES中的注册信息 SELECT * FROM apps.fnd_tables WHERE table_name = 'PO_HEADERS_ALL'; -- 查找列在FND_COLUMNS中的注册信息 (通常需要结合application_id) SELECT * FROM apps.fnd_columns WHERE table_id = (SELECT table_id FROM apps.fnd_tables WHERE table_name = 'PO_HEADERS_ALL'); ``` * `APPS.FND_APPLICATION`: 注册的应用模块(如“采购”对应 PO)。 4. **EBS 表结构的关键特征 (R12.1.3):** * **`_ALL` 表:** 核心业务表通常以 `_ALL` 结尾(如 `PO_HEADERS_ALL`, `AP_INVOICES_ALL`),表示它们存储**多组织 (Multi-Org)** 数据。关键列是 `ORG_ID`,用于隔离不同业务实体(OU - Operating Unit)的数据。访问控制通过 **MOAC (Multi-Org Access Control)** 和 **VPD (Virtual Private Database)** 策略实现。 * **弹性域列:** 包含描述性弹性域(如 `ATTRIBUTE1`...`ATTRIBUTE15`, `ATTRIBUTE_CATEGORY`)和键弹性域(如 `SEGMENT1`...`SEGMENT30`)的列。 * **“WHO” 列:** 记录数据变更的审计列,如: * `CREATED_BY`, `CREATION_DATE` * `LAST_UPDATED_BY`, `LAST_UPDATE_DATE` * `LAST_UPDATE_LOGIN` * **对象版本号 (`OBJECT_VERSION_NUMBER`):** 用于乐观机制,防止并发更新覆盖。 * **主键:** 通常以 `_ID` 结尾(如 `PO_HEADER_ID`, `INVOICE_ID`),常为序列生成的数字。 * **外键:** 引用其他 `_ALL` 表的主键(如 `PO_HEADERS_ALL.VENDOR_ID` -> `AP_SUPPLIERS.VENDOR_ID`)。 **重要提示:** * **不要直接修改基表!** 永远通过 EBS 提供的标准 API、表单界面或 AD_DD 包(用于注册表/列)来修改数据或元数据。直接 DML 或 DDL 操作会破坏应用逻辑、绕过验证、导致数据不一致,并可能使你的系统失去 Oracle 支持。 * **版本差异:** R12.1.3 的表结构与 R12.2.x 或更早的 11i 版本可能存在差异(如新增列、废弃列、表合并/拆分)。升级时需特别注意。 * **视图 vs 基表:** `FND_TABLES`/`FND_COLUMNS` 存储的是 EBS *应用层注册*的元数据;`DBA_TABLES`/`DBA_TAB_COLUMNS` 存储的是数据库*物理存储*的元数据。两者应保持一致,但修改必须通过 EBS 工具。 * **多组织 (`ORG_ID`):** 查询 `_ALL` 表时,**务必**考虑当前会话的 `ORG_ID` 上下文(通过 `MO_GLOBAL.INIT` 或 `MO_GLOBAL.SET_POLICY_CONTEXT` 设置),或显式在 WHERE 子句中包含 `ORG_ID` 条件,否则可能查不到数据或查错数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值