SELECT UTC.TABLE_NAME,

       UTC.COLUMN_NAME AS PHYSICAL_NAME,

       (SELECT CASE WHEN UCC.COLUMN_NAME IS NOT NULL THEN 'PK' 

                    ELSE '' 

               END

          FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS CC

         WHERE UC.CONSTRAINT_NAME = CC.CONSTRAINT_NAME

           AND UC.CONSTRAINT_TYPE = 'P'

           AND UTC.TABLE_NAME = UC.TABLE_NAME

           AND UTC.COLUMN_NAME = CC.COLUMN_NAME) AS PK,       

       UTC.DATA_TYPE || 

       CASE

          WHEN UTC.DATA_TYPE = 'NUMBER' THEN '(' || UTC.DATA_PRECISION || ', ' || UTC.DATA_SCALE || ')'

          ELSE CASE WHEN UTC.CHAR_LENGTH != 0 THEN '(' || UTC.CHAR_LENGTH || ')' ELSE NULL END

       END AS DATA_TYPE,

       UCC.COMMENTS AS LOGICAL_NAME,

       --T.DATA_SCALE,

       UTC.NULLABLE,

       UTC.DATA_DEFAULT

  FROM USER_TABLES UT,

       USER_TAB_COLUMNS UTC, 

       USER_COL_COMMENTS UCC              

 WHERE UT.TABLE_NAME = UTC.TABLE_NAME

   AND UTC.TABLE_NAME = UCC.TABLE_NAME

   AND UTC.COLUMN_NAME = UCC.COLUMN_NAME

 ORDER BY UTC.TABLE_NAME, UTC.COLUMN_NAME ASC;

Posted by bluescor

http://www.makina-corpus.org/blog/howto-install-oracle-11g-ubuntu-linux-1204-precise-pangolin-64bits

Posted by bluescor

1. 먼저 lock 확인을 한다.

-- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT
SELECT DISTINCT t1.session_id AS session_id
,t2.serial# AS serial_no
,t1.os_user_name AS os_user_name
,t1.oracle_username AS oracle_username
,t2.status AS status
,t3.object_name
,DECODE( locked_mode
,2, 'ROW SHARE'
,3, 'ROW EXCLUSIVE'
,4, 'SHARE'
,5, 'SHARE ROW EXCLUSIVE'
,6, 'EXCLUSIVE'
,'UNKNOWN'
) lock_mode
FROM v$locked_object t1, v$session t2, dba_objects t3
WHERE t1.session_id = t2.SID
AND t1.object_id = t3.object_id;

2. 위 쿼리에서 확인한 session_id를 *SESSION_ID*에 넣으면 어떤 sql을 사용해서 lock이 걸렸는지 확인 할 수있다.

-- lock 걸린 sql
SELECT b.username username
,c.SID AS session_id
,c.owner object_owner
,c.OBJECT OBJECT
,b.lockwait
,a.sql_text SQL
,piece
FROM v$sqltext a, v$session b, v$access c
WHERE a.address = b.sql_address
AND a.hash_value = b.sql_hash_value
AND b.SID = c.SID
AND c.owner != 'SYS'
and c.SID = '*SESSION_ID*'
ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece;

3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다.

-- lock 걸린 SESSION kill
alter system kill session '*SESSION_ID*,*SERIAL_NO*'

4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESS를 kill한다.
* 주의!!! 실수하기 쉽고 위험한 방법으로 lock걸린 내용을 정확히 알지 못할 경우 kill하지 말것!!!

-- lock 걸린 PROCESS ID 찾기
SELECT DISTINCT s.username "ORACLE USER"
,p.pid "PROCESS ID"
,s.SID "SESSION ID"
,s.serial#
,osuser "OS USER"
,p.spid "PROC SPID"
,s.process "SESS SPID"
,s.lockwait "LOCK WAIT"
FROM v$process p, v$session s, v$access a
WHERE a.SID = s.SID
AND p.addr = s.paddr
AND s.username != 'SYS'

-- unix에 로그인 하여 process kill
kill -9 프로세스아이디

 

Posted by bluescor

블로그 이미지
bluescor

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함