oracle表不能DDL和存储过程不能创建处理方法

在做数据迁移的过程中,我们会面临两种常见的hang住场景:

1.表不能修改加字段,不能增大长度。

2.存储过程不能覆盖。

场景1:为表添加字段hang住的处理

session1:

create table test as select * from dba_objects;

select * from test where object_id = 20 for update;

session2:

alter table test add  aa number;--hang住

session3:

SELECT bs.username "Blocking User",

bs.username "DB User",

bs.SID "SID",

bs.serial# "Serial#",

bs.sql_address "address",

bs.sql_hash_value "Sql hash",

bs.program "Blocking App",

bs.machine "Blocking Machine",

bs.osuser "Blocking OS User",

bs.serial# "Serial#",

ws.username "Waiting User",

ws.SID "WSID",

ws.program "Waiting App",

ws.machine "Waiting Machine",

ws.osuser "Waiting OS User",

ws.serial# "WSerial#",

wk.TYPE lock_type,

hk.lmode mode_held,

wk.request mode_requested,

TO_CHAR(hk.id1) lock_id1,

TO_CHAR(hk.id2) lock_id2,

hk.BLOCK blocking_others

FROM v$lock hk, v$session bs, v$lock wk, v$session ws

WHERE hk.BLOCK = 1

AND hk.lmode != 0

AND hk.lmode != 1

AND wk.request != 0

AND wk.TYPE(+) = hk.TYPE

AND wk.id1(+) = hk.id1

AND wk.id2(+) = hk.id2

AND hk.SID = bs.SID(+)

AND wk.SID = ws.SID(+)

AND (bs.username IS NOT NULL)

AND (bs.username <> ‘SYSTEM‘)

AND (bs.username <> ‘SYS‘)

ORDER BY 1;

Blocking User TEST

DB User TEST

SID 8     --锁持有者sid

Serial# 16603 --锁持有者serial#

address 00

Sql hash 0

Blocking App PlSqlDev.exe

Blocking Machine COMTOP\HLPNT2X

Blocking OS User Administrator

Serial# 16603

Waiting User TEST

WSID 11

Waiting App PlSqlDev.exe

Waiting Machine COMTOP\HLPNT2X

Waiting OS User Administrator

WSerial# 14858

LOCK_TYPE TX

MODE_HELD 6

MODE_REQUESTED 4

LOCK_ID1 589845

LOCK_ID2 5272

BLOCKING_OTHERS 1

alter system kill session ‘8,16603‘;--干掉session,注意的是如果是RAC,视图都要加上G,如v$lock,是GV$lock。

场景2:存储过程不能覆盖

session1 新建并执行:

create or replace procedure p_test_pin

as

begin

dbms_lock.sleep(3000);

end;

call p_test_pin();

session2 覆盖:

create or replace procedure p_test_pin()

begin

dbms_lock.sleep(1000);

end;

方法1,找到所在会话和进程id,如果是RAC则都要查GV:

x$kglpn  library cache pin信息

x$kglob  library cache object信息

SQL> SELECT s.sid,s.SERIAL#, kglpnmod "Mode", kglpnreq "Req", SPID "OS Process"

FROM v$session_wait w, sys.x$kglpn p, v$session s, v$process o

WHERE p.kglpnuse = s.saddr

AND kglpnhdl = w.p1raw

and w.event like ‘%library cache pin%‘

and s.paddr = o.addr;

SID    SERIAL#       Mode        Req OS Process

---------- ---------- ---------- ---------- -------------------

8      17376          2          0 22118

133       4430          0          3 22120

先杀掉会话:alter system kill session ‘8,17376‘;

如果会话杀不掉,则只有从操作系统层面杀进程:kill -9 22118

方法2,找到持有者:    

SQL>  SELECT sid Holder_sid,

SERIAL# hold_SERIAL,

KGLPNUSE Sesion,

KGLPNMOD Held,

KGLPNREQ Req

FROM sys.x$kglpn, v$session

WHERE KGLPNHDL IN (SELECT p1raw

FROM v$session_wait

WHERE event LIKE ‘library cache pin%‘)

AND KGLPNMOD <> 0

AND v$session.saddr = x$kglpn.kglpnuse;

HOLDER_SID HOLD_SERIAL SESION                 HELD        REQ

---------- ----------- ---------------- ---------- ----------

8       17376 0000000127618FA8          2          0

找到持有者在执行什么SQL

SQL>  SELECT sid, sql_text

FROM v$session, v$sqlarea

WHERE v$session.sql_address = v$sqlarea.address AND sid =8;

SID        SQL_TEXT

------     -----------

8        call p_test_pin()

时间: 2024-10-09 18:02:07

oracle表不能DDL和存储过程不能创建处理方法的相关文章

1.Oracle表的DDL实践

1.Oracle表的DDL实践. 设有如下关系表S_班名座号(如:s_xg140101): s_ xg140101 (SNO, SNAME, SSEX, SAGE, SDEPT),主关键字是SNO. 其中SNO为学号,NUMBER(5),学号不能为空,值是惟一的:SNAME为姓名,VARCHAR2(20):SSEX为性别,char(2):SAGE为年龄,NUMBER(2):SDEPT为所在系名,VARCHAR2(10).写出实现下列功能的SQL语句. 1.1 创建此表并插入数据: Create

oracle表,视图,存储过程,函数,序列.....查询

查询存储过程,函数,序列,表,视图的名字 select object_name from user_objects where object_type = 'PROCEDURE' select object_name from user_objects where object_type = 'FUNCTION' select object_name from user_objects where object_type = 'SEQUENCE' select object_name from

Oracle 表空间不足引起的问题及解决方法

-- 1 向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的: 查询表空间使用情况语句 select a.tablespace_name,a.bytes/1024/1024 total, (a.bytes-b.bytes)/1024/1024 used, b.bytes/1024/1024 free, round((a.bytes-b.bytes)/a.bytes*100,2) used_ratefrom ( sel

Sql Server中判断表、列不存在则创建的方法[转]

一.Sql Server中如何判断表中某列是否存在 首先跟大家分享Sql Server中判断表中某列是否存在的两个方法,方法示例如下: 比如说要判断表A中的字段C是否存在两个方法: 第一种方法  ? 1 2 3 4 5 6 7 8 IF EXISTS (  SELECT 1 FROM SYSOBJECTS T1  INNER JOIN SYSCOLUMNS T2 ON T1.ID=T2.ID  WHERE T1.NAME='A' AND T2.NAME='C'  )  PRINT '存在'  E

查询某个表所涉及的 存储过程Procedure, 视图view , 方法Function

/*查询某个表所涉及的Procedure,Package,Function*/select name,type,referenced_owner,referenced_name,referenced_typefrom user_dependencieswhere referenced_name='Mytable'   -- Mytable 表名 and type='procedure';   -- 储过程Procedure, 视图view , 方法Function 原文地址:https://ww

Oracle 表的创建 及相关参数

1. 创建表完整语法 CREATE TABLE [schema.]table (column datatype [, column datatype] - ) [TABLESPACE tablespace] [PCTFREE integer] [PCTUSED integer] [INITRANS integer] [MAXTRANS integer] [STORAGE storage-clause] [LOGGING | NOLOGGING] [CACHE | NOCACHE] ]; 说明:

SQL创建Oracle表空间、用户以及给用户赋权的方法

//创建表空间 Create tablespace examination//创建表空间examination datafile 'c:\Oracle\zhangwei\examination.dbf'//与表空间关联的文件存放位置(要预先手动建好文件夹) size 100m//文件初始大小,千万不要写成mb(这里以下可略) autoextend on//文件大小可自动拓展 next 30m//每次拓展30m maxsize unlimited//不限制文件大小的上限 logging//生成对于

oracle 表空间的创建

注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要保存文件的路径存在 /*分为四步 */ /*第1步:创建临时表空间  */ create temporary tablespace user_temp   tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'  size 50m autoextend on next

oracle表空间的创建、修改、删除及一些参数解释

创建表空间 方法1:代码创建,如下:PL/SQL 建立表空间(一般建N个存数据的表空间和一个索引空间):      create tablespace 表空间名      datafile ' 路径(要先建好路径)\***.dbf  ' size *M      tempfile ' 路径\***.dbf ' size *M      autoextend on  --自动增长      extent management localSQL> / 表空间已创建.       方法2用sqlplu