1. 오라클(Oracle) LOCK 조회 및 해제

평소에는 아무런 문제가 없이 사용이 되다가 특정 기능을 실행 시킬때 처리가 안되고 지연되는 현상이 간혹 발생할 때 가 있습니다.

 

전체적으로 문제가 생긴게 아니라 특정 기능에 대해서 일시적으로 생긴 문제라 생각을 할 수 있겠지만, 혹시 DB 테이블에 LOCK이 걸려 있는게 있나 확인을 하는게 좋습니다.

 

LOCK이 걸린 테이블은 SELECT 조회는 가능합니다. 다만, insert,update,delete과정에서 처리가 안되고 있는거를 볼 수 있습니다.

 

LOCK을 확인을 하기 위해서는 일반 계정으로 오라클에 접속시는 확인이 불가합니다.

 

SYSTEM계정으로 접속 후 확인 및 해제를 하셔야 합니다.

 

2. LOCK 걸린 테이블 확인

select * from v$locked_object

간단한 LOCK이 있는 테이블이 있는지 확인

 

 

SELECT 
	T2.SID, 
	T2.SERIAL#, 
	T2.USERNAME, 
	T2.SADDR, 
	T2.OSUSER, 
	T2.PROGRAM, 
	T3.SQL_TEXT 
FROM 
	V$LOCKED_OBJECT T1 
	LEFT JOIN V$SESSION T2 ON T2.SID = T1.SESSION_ID 
   	LEFT JOIN V$SQLTEXT T3 ON T3.ADDRESS = T2.SADDR 
ORDER BY T2.SID

상세정보를 보기 위해서는 위에 쿼리를 조회 하시면 LOCK이 걸린 테이블 및 쿼리가 나옵니다.

정보를 확인을 하시고 해제를 시켜주면 되겠습니다.

 

3. LOCK 걸린 세션 해제

alter system kill session 'SID, SERIAL#';

LOCK이 걸려있는 세션 SID와 SERIAL값으로 해제를 합니다.

오라클(Oracle) ROLE 및 시스템권한 조회 및 부여

1. 유저 조회

SQL> SELECT * FROM all_users;

 

USERNAME    USER_ID    CREATED
------------------------------------------------
USER4           91            22-JAN-19
USER3           90            22-JAN-19
USER2           89            22-JAN-19
USER1           88            22-JAN-19

 

실행 쿼리 - SELECT * FROM all_users;

 

 

2. 유저 ROLE 조회 및 부여

2-1. 기본적인 ROLE 목록

ROLE

ROLE 설명

CONNECT

접속 세션 생성 및 테이블 생성, 조회 권한

RESOURCE

PL/SQL을 사용 권한

DBA

모든 시스템 권한

EXP_FULL_DATABASE

데이터베이스 익스포트 권한

IMP_FULL_DATABASE

데이터베이스 임포트 권한

 

ROLE에는 이것 말고도 더 많은 ROLE이 존재를 한다.

 

2-2. 계정에 적용중인 ROLE 확인

SQL> SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USER4' ; -- 시스템 관리자 접속일 때 확인

SQL> SELECT * FROM USER_ROLE_PRIVS; -- ROLE을 확인하고자 하는 계정에 접속일 때 확인

 

USERNAME      GRANTED_ROLE      ADM      DEF 
------------------------------------------------------------------------------------
USER4             CONNECT              NO         YES
USER4             RESOURCE             NO         YES 

 

실행쿼리 

 - SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USER4' ;

 - SELECT * FROM USER_ROLE_PRIVS;

 

USER4 사용자에게 적용된 ROLE

 - CONNECT, RESOURCE 

 

2-3. 계정에 ROLE 부여

SQL> GRANT DBA TO USER4;

 

USER4 사용자에게 ROLE 추가

 - DBA

 

 

3. 유저 시스템권한 조회 및 부여

3-1 시스템 권한 목록

시스템 권한명

권한 설명

 SELECT ANY TABLE

모든 유저의 테이블 조회 권한 

 CREATE ANY TABLE

모든 유저의 테이블 생성 권한 

 CREATE USER

유저 생성 권한 

 CREATE SESSION

접속 권한 

 CREATE TABLE

테이블 생성 권한 

 CREATE VIEW

뷰 생성 권한 

 CREATE PROCED USER

프로시저 생성 권한 

 CREATE SEQUENCE

시퀀스 생성 권한 

 SYSDBA

DBA 권한 부여 

 SYSOPER

DB 관리 권한 

 

시스템 권한에는 이 것 말고도 더 많은 권한이 있다.

 

3-2. 계정에 적용중인 시스템 권한 확인

SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USER4'; -- 시스템 관리자 접속일 때 확인

SQL> SELECT * FROM USER_SYS_PRIVS; -- 시스템권한을 확인하고자 하는 계정에 접속일 때 확인

 

GRANTEE      PRIVILEGE                            ADM
----------------------------------------------------------
USER4          CREATE VIEW                       NO
USER4          UNLIMITED TABLESPACE        NO

 

실행쿼리

 - SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USER4';

 - SELECT * FROM USER_SYS_PRIVS;

USER4 적용된 시스템 권한

 - CREATE VIEW, UNLIMITED TABLESPACE

 

3-3. 계정에 시스템 권한 부여

 SQL> GRANT SYSOPER TO USER4;

 

USER4 사용자에게 시스템권한 추가

 - SYSOPER

오라클(Oracle) 테이블 스페이스, 유저 생성

1. 테이블스페이스 물리적 경로 확인

테이블 스페이스를 생성을 할려면 물리적 경로를 먼저 알아야 합니다.

물리적 경로를 확인하는 포스팅이 올라가져 있으니 참고해 주세요 -> 오라클(Oracle) 테이블스페이스 이름 및 물리적 경로 확인 

 

2. 테이블 스페이스 생성

SQL> create tablespace SPACE_NAME4 datafile '/home/server/oracle/oradata/db_sid/spaceNameFile4.dbf‘ size 100m;

 

실행 쿼리 - create tablespace SPACE_NAME4 datafile '/home/server/oracle/oradata/db_sid/spaceNameFile4.dbf‘ size 100m;

테이블 스페이스 이름 - SPACE_NAME4

테이블 스페이스 물리적 경로 - /home/server/oracle/oradata/db_sid/

테이블 스페이스 파일 이름 - spaceNameFile4.dbf

테이블 스페이스 용량 - 100m

 

3. 유저 생성(테이블 스페이스에 추가)

SQL>  create user USER4 identified by USER4PW default tablespace SPACE_NAME4;

 

실행 쿼리 - create user USER4 identified by USER4PW default tablespace SPACE_NAME4;

생성되는 유저 아이디 - USER4

생성되는 유저 패스워드 - USER4PW

생성되는 유저가 들어간 테이블스페이스 - SPACE_NAME4;

 

 

4. 테이블스페이스에 들어있는 유저 목록(생성된 유저 확인)

SQL> SELECT USERNAME, DEFAULT_TABLESPACE FROM dba_users;

 

USERNAME       DEFAULT_TABLESPACE
----------------------------------------------
USER1             SPACE_NAME1
USER2             SPACE_NAME2
USER3             SPACE_NAME3
USER4             SPACE_NAME4

 

실행 쿼리 - SELECT USERNAME, DEFAULT_TABLESPACE FROM dba_users;

유저 목록 - USER1, USER2, USER3 ...

테이블스페이스 목록 - SPACE_NAME1, SPACE_NAME2, SPACE_NAME3 ....

 

오라클(Oracle) 테이블스페이스 이름 및 물리적 경로 확인

1. 테이블스페이스 이름

SQL> SELECT TABLESPACE_NAME FROM dba_tablespaces;

 

TABLESPACE_NAME
------------------------------
SPACE_NAME1
SPACE_NAME2
SPACE_NAME3

 

실행 쿼리 - SELECT TABLESPACE_NAME FROM dba_tablespaces;

테이블 스페이스 이름 - SPACE_NAME1, SPACE_NAME2 ....

 

2. 테이블스페이스 물리적 경로, 파일이름

 SQL> SELECT FILE_ID,TABLESPACE_NAME,FILE_NAME from dba_data_files;

 

FILE_ID     TABLESPACE_NAME   FILE_NAME
-----------------------------------------------------------------------------------------------------------------
28             SPACE_NAME1           /home/server/oracle/oradata/db_sid/spaceNameFile1.dbf
29             SPACE_NAME2           /home/server/oracle/oradata/db_sid/spaceNameFile2.dbf
30             SPACE_NAME3           /home/server/oracle/oradata/db_sid/spaceNameFile3.dbf

 

실행 쿼리 - SELECT FILE_ID,TABLESPACE_NAME,FILE_NAME from dba_data_files;

테이블 스페이스 물리적 경로 - /home/server/oracle/oradata/db_sid/

테이블 스페이스 파일 이름 - spaceNameFile1.dbf, spaceNameFile2.dbf, spaceNameFile3.dbf ....

오라클(Oracle) ServiceName, SID 확인

1. ServiceName 확인

SQL> SELECT name FROM v$database;

 

NAME
----------------
db_service_name

 

쿼리 실행문 - SELECT name FROM v$database;

ServiceName - db_service_name

 

2. SID 확인

 SQL> SELECT instance FROM v$thread;

 

INSTANCE
-------------
db_sid

 

쿼리 실행문 - SELECT instance FROM v$thread;

SID - db_sid

오라클(Oracle) 쉘 접속

1. 오라클이 실행시키는 계정 확인

 ps -ef | grep oracle

 

oracle    3934     1  0  2018 ?        00:00:00 oracle (LOCAL=NO)
oracle    3936     1  0  2018 ?        00:00:00 oracle (LOCAL=NO)
oracle    3938     1  0  2018 ?        00:00:02 oracle (LOCAL=NO)
oracle   15325     1  0  2018 ?        00:00:00 ora_reco
oracle   15333     1  0  2018 ?        00:00:00 ora_s000
oracle   15341     1  0  2018 ?        00:04:06 ora_cjq0
oracle   15353     1  0  2018 ?        00:00:16 /home/server/oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER -inherit

 

오라클 실행 계정 - oracle 

설치 경로 - /home/server/oracle/product/10.2.0/db_1/

 

2. 오라클 실행 계정 접속

 su - oracle

 

오라클 실행 계정 접속 - su -oracle

 

3. 오라클 접속

 sqlplus '/as sysdba'

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL>

 

오라클 접속 - sqlplus '/as sysdba'

오라클[Oracle] 테이블 이전 데이터 조회 AS OF TIMESTAMP

DB를 잘못 commit를 하거나 잘못된 실행으로 데이터가 변경이 되어서 이전 데이터를 찾는 방법입니다. 


1. 현재시간보다 이전시간 조회 


 SELECT * FROM  TABLE AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTEwhere 1=1 -- 10분 이전 데이터 조회

 SELECT * FROM  TABLE AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '1' HOURwhere 1=1 -- 1시간 이전 데이터 조회 

 SELECT * FROM  TABLE AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '1' DAYwhere 1=1 -- 하루전 데이터 조회


2. 특정 날짜로 조회


 SELECT * FROM  TABLE AS OF TIMESTAMP(TO_DATE('20190101000000', 'YYYYMMDDHH24MISS')) where 1=1 -- 2019년 1월 1일 조회


3. 데이터 복구

FLASHBACK TABLE TABLE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE); -- 10분이전 데이터로 복구 





+ Recent posts