3 Articles, Search for 'lock'

  1. 2009/01/30 오라클 테이블 락 ( Table lock )
  2. 2009/01/30 ORA-28000 발생시 해결법
  3. 2008/07/08 with (nolock) 란?
DATABASE/Oracle2009/01/30 02:32

### Lock 확인 쿼리
SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id,
vo.locked_mode
FROM v$locked_object vo , dba_objects do
WHERE vo.object_id = do.object_id ;

####  어떤 object에 어떤 lock이 걸렸는지 확인
SELECT  T1.object_name, DECODE(locked_mode, 2, 'ROW SHARE', 3, 'ROW EXCLUSIVE',  4, 'SHARE', 5, 'SHARE ROW EXCLUSIVE', 6, 'EXCLUSIVE', 'UNKNOWN') lock_mode
FROM  dba_objects T1, v$locked_object T2
WHERE T1.object_id = T2.object_id;

#### session 확인
select * from v$session where status = 'ACTIVE'

#### cursor 확인
v$open_cursor

#### 테이블의 lock 확인
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID=B.SID
AND B.ID1=C.OBJECT_ID
AND B.TYPE='TM'
AND C.OBJECT_NAME IN ('<테이블이름>');

/*******************************************************************************
* LOCK 관련
*******************************************************************************/
--V$LOCK 을 사용한 잠금 경합 모니터링
SELECT s.username, s.sid, s.serial#, s.logon_time,
  DECODE(l.type, 'TM', 'TABLE LOCK',
         'TX', 'ROW LOCK',
      NULL) "LOCK LEVEL",
  o.owner, o.object_name, o.object_type
FROM v$session s, v$lock l, dba_objects o
WHERE s.sid = l.sid
AND o.object_id = l.id1
AND s.username IS NOT NULL   

--락이 걸린 세션 자세히 알아보기
select a.sid, a.serial#,a.username,a.process,b.object_name,
decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",
decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
from v$session a,dba_objects b, v$lock c
where a.sid=c.sid and b.object_id=c.id1
and c.type='TM'

--락이 걸린 세션 간단히 알아보기
select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,
      a.logon_time, a.process, a.osuser, a.terminal
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
  and b.id1 = c.object_id
  and b.type = 'TM';

select a.sid, a.serial#, a.username, a.process, b.object_name
from v$session a , dba_objects b, v$lock c
where a.sid=c.sid and b.object_id = c.id1
and c.type = 'TM'

--락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우
--아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다
--kill -9 프로세스아이디
select substr(s.username,1,11) "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'

--위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다
ALTER SYSTEM KILL SESSION '11,39061'

/**************************************************************************************/

출처 : http://cocoroworld.com/blog/root/entry/오라클-락lock

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/30 02:32 2009/01/30 02:32
Posted by

Leave your greetings.

DATABASE/Oracle2009/01/30 02:18

ORA-28000에러는 일정 회수이상 로그인 실패시 계정에 lock이 걸리면서
"ORA-28000: the account is locked"
라는 메시지를 뱉어낸다.
(10g일 경우 설치 후 처음 scott계정을 사용할 때도 이런 에러가 뜬단다. 난 본적이 없어 모르겠다^^;)

1. 일단 sysdba로 접속한다.
sqlplus "/ as sysdba"

2. lock걸린 user를 찾아낸다.
SELECT username, account_status, to_char(lock_date,'yy/mm/dd hh24:mi') lock_date
FROM dba_users;

사용자 삽입 이미지


user가 MODELINGWORLD인 놈이 lock이 걸린걸 확인할 수 있다.

3. lock을 해제한다.
ALTER USER MODELINGWORLD account unlock;

4. 패스워드변경(아무래도 찜찜하니 패스워드도 변경해야겠지)
ALTER USER SYSTEM IDENTIFIED BY ****;


- 문
그럼 도대체 몇번 로그인을 실패하면 lock이 걸리는 거냐?

- 답
SQL> SELECT p.profile, p.resource_name, p.limit
  2  FROM dba_users u, dba_profiles p
  3  WHERE p.profile = u.profile
  4  AND username='modelingworld';
위와 같은 쿼리를 날리면
결과 중에 'FAILED_LOGIN_ATTEMPTS' 컬럼이 제한 개수이다.

그럼 제한을 풀 수도 있지않을까? 당근 있다.
ALTER profile default limit FAILED_LOGIN_ATTEMPTS UNLIMITED;
크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/30 02:18 2009/01/30 02:18
Posted by
Tags , ,

Leave your greetings.

DATABASE/SQLServer2008/07/08 18:40
SQL Server의 기본 격리 수준(isolation level)은 read committed 입니다.
그래서 데이터를 읽을 때는 공유 잠금이 유지됩니다.
그러므로, 쉽게 설명하자면 SELECT문이 실행 중인 동안에
같은 row혹은 table에 insert나 update하는 작업은 block됩니다.
거꾸로 같은 row, data page 혹은 테이블에 데이터를 insert, update하는 동안 SELECT문은 block되게 됩니다. 이렇게 되면 데이터베이스 성능이 현저히 떨어지게 됩니다.
그러므로 일반적으로 단순 조회 쿼리에는 with (nolock)문을 추가하여 사용합니다.

- 사용법-
SELECT  * FROM dbo.Jobs with(nolock)
WHERE...
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/07/08 18:40 2008/07/08 18:40
Posted by
Tags ,

Leave your greetings.