/*오라클서버의 메모리에 관한 테이블*/
SELECT * FROM V$SGASTAT

SELECT POOL
,SUM(BYTES) "SIZE"
FROM V$SGASTAT
WHERE POOL = 'SHARED POOL'
GROUP BY POOL

/* cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기*/
SELECT C.SQL_TEXT
,B.SID
,B.SERIAL#
,B.MACHINE
,B.OSUSER
,B.LOGON_TIME --이 쿼리를 호출한 시간
FROM V$PROCESS A
,V$SESSION B
,V$SQLTEXT C
WHERE A.ADDR = B.PADDR
AND B.SQL_HASH_VALUE = C.HASH_VALUE
AND A.SPID = '675958'
ORDER BY C.PIECE


/*cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기*/
SELECT C.SQL_TEXT
FROM V$PROCESS A
,V$SESSION B
,V$SQLTEXT C
WHERE A.ADDR = B.PADDR
AND B.SQL_HASH_VALUE = C.HASH_VALUE
AND A.SPID = '171'
ORDER BY C.PIECE

/*프로세스 아이디를 이용하여 쿼리문 알아내기*/
SELECT C.SQL_TEXT
,B.SID
,B.SERIAL#
,B.MACHINE
,B.OSUSER
,B.LOGON_TIME --이 쿼리를 호출한 시간
FROM V$PROCESS A, V$SESSION B, V$SQLTEXT C
WHERE A.ADDR = B.PADDR
AND B.SQL_HASH_VALUE = C.HASH_VALUE
AND A.SPID = '1708032' --1912870/
ORDER BY C.PIECE

/*세션 죽이기(SID,SERAIL#)*/
ALTER SYSTEM KILL SESSION '8,4093'

/*hash_value 가지고 SQL 문장 찾아내는 쿼리 */
SELECT SQL_TEXT FROM V$SQLTEXT WHERE HASH_VALUE= 317853294


/*오라클 세션과 관련된 테이블*/
SELECT COUNT(*) FROM V$SESSION WHERE MACHINE ='머신이름' AND SCHEMANAME ='스키마이름'

/* 인엑티브 상태의 세션들-로그온타입이 과도하게 지나도록 없어지지 않는것은 세션을 죽이도록 한다
단 machine이 머신이름 에 해당하는 것만 죽이도록 한다
prev_hash_value 로 해쉬밸류를 알아내어 쿼리문을 확인할 수 있다
*/
SELECT SID
,SERIAL#
,USERNAME
,STATUS
,LOGON_TIME
,PREV_HASH_VALUE
,MACHINE
FROM V$SESSION
WHERE MACHINE ='머신이름'
AND SCHEMANAME ='스키마이름'
AND STATUS = 'INACTIVE'

SELECT COUNT(*)
FROM V$SESSION
WHERE MACHINE ='머신이름'
AND SCHEMANAME ='스키마이름'
AND STATUS = 'INACTIVE'

SELECT COUNT(*)
FROM V$SESSION
WHERE MACHINE ='머신이름'
AND SCHEMANAME ='스키마이름'
AND STATUS = 'KILLED'

SELECT COUNT(*)
FROM V$SESSION
WHERE MACHINE ='머신이름'
AND SCHEMANAME ='스키마이름'
AND STATUS = 'ACTIVE'

--현재 스키마이름 스키마로 실행중인(active) 프로세스를 알아내는 쿼리문
SELECT SID
,SERIAL#
,SQL_HASH_VALUE
,PREV_HASH_VALUE
,ROW_WAIT_OBJ#
,LOGON_TIME
,MACHINE
FROM V$SESSION
WHERE SCHEMANAME ='스키마이름'
AND STATUS = 'ACTIVE'

--위에서 알아내 hash_value 값을 이용하여 해당 프로세스가 실행중인 쿼리문 알아내기
SELECT *
FROM V$SQLTEXT
WHERE HASH_VALUE = 2626426688-
ORDER BY PIECE

SELECT *
FROM V$SESSION
WHERE MACHINE ='머신이름'
AND SCHEMANAME ='스키마이름'
AND STATUS = 'ACTIVE'
AND ROW_WAIT_OBJ# > 0

/******************************************************************************************/
현재 커서 수 확인하는 Query
/******************************************************************************************/
SELECT SID,
COUNT(SID) CURSOR
FROM V$OPEN_CURSOR
WHERE USER_NAME = '유저이름'
GROUP BY SID
ORDER BY CURSOR DESC


SELECT SQL_TEXT
,COUNT(SID) CNT
FROM V$OPEN_CURSOR
GROUP BY SQL_TEXT
ORDER BY CNT DESC

SELECT SQL_TEXT
FROM V$SQLTEXT
WHERE HASH_VALUE= 3252988466 --1389452958
ORDER BY PIECE

SELECT * FROM V$SESSION_WAIT

SELECT SID
,SERIAL#
,USERNAME
,TADDR
,USED_UBLK
,USED_UREC
FROM V$TRANSACTION T, V$SESSION S
WHERE T.ADDR = S.TADDR;

SELECT * FROM SYS.V_$OPEN_CURSOR

SELECT USER_NAME
,SQL_TEXT
,COUNT(*) CNT
FROM SYS.V_$OPEN_CURSOR
WHERE USER_NAME = '유저이름'
AND SID = 114
GROUP BY USER_NAME
,SQL_TEXT
ORDER BY CNT DESC

ALTER SYSTEM KILL SESSION '27,127'

--ALTER SYSTEM KILL SESSION '45, 3977'
--이런식으로 통계정보를 생성하신 후에

ANALYZE TABLE EMP COMPUTE STATISTICS;

ALTER TABLE CUSTOMERS PCTFREE 5 ;

SELECT *
FROM DBA_TABLES
WHERE TABLE_NAME = 'RP_PART_MST'


/*******************************************************************************
* 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'

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

SELECT *
FROM V$SESSION
WHERE SID IN (80,100)

SELECT L.SESSION_ID
,LPAD(' ', DECODE(L.XIDUSN,0,3,0)) || L.ORACLE_USERNAME "USER NAME"
,O.OWNER
,O.OBJECT_NAME
,O.OBJECT_TYPE
FROM V$LOCKED_OBJECT L
,DBA_OBJECTS O
WHERE L.OBJECT_ID = O.OBJECT_ID
ORDER BY O.OBJECT_ID, 1 DESC


--아래 table 은 존재하지 않네

SELECT SW.USERNAME "WAITING_USER"
,BU.USERNAME "LOCKING_USER"
,DW.LOCK_TYPE
,DW.MODE_HELD
,DW.MODE_REQUESTED
,DW.WAITING_SESSION
,DW.HOLDING_SESSION
FROM DBA_WAITERS DW
,V$SESSION SW
,V$SESSION BU
WHERE DW.WAITING_SESSION = SW.SID
AND DW.HOLDING_SESSION = BU.SID

SELECT S.USERNAME
,S.SID
,S.SERIAL#
FROM DBA_BLOCKERS DB
,V$SESSION S
WHERE DB.HOLDING_SESSION = S.SID

SELECT VO.SESSION_ID
,DO.OBJECT_NAME
,DO.OWNER
,DO.OBJECT_TYPE
,DO.OWNER
,VO.XIDUSN
,VO.LOCKED_MODE
FROM V$LOCKED_OBJECT VO
,DBA_OBJECTS DO
WHERE VO.OBJECT_ID = DO.OBJECT_ID

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


SELECT *
FROM ALL_COL_COMMENTS
WHERE TABLE_NAME = '테이블이름'

/************************************************
ALTER SESSION으로 죽지않는 프로세스 죽이기
1.ORACLE이 설치된 서버에 텔넷으로 ROOT로 접속한다
2.SU -오라클계정
3.SQLPLUS '/AS SYSDBA''
4.CONNECT SYSTEM/SYS
5.ALTER SYSTEM KILL SESSION '137,1723'
**************************************************/

출처 : DATABASE.SARANG.NET

GRANT SELECT ON OBJECT_NAME TO USER_NAME

클라이언트가 될 오라클 서버의 $ORACLD_HOME/network/admin/tnsnames.ora 파일에

서버가 될 DB의 TNSNAME 정보를 추가한다.

DANGJIK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 100.1.26.38)(PORT = 1521))
)
(CONNECT_DATA =
(SID = APPSVR29)
)
)


1. 사용하실 오라클 유저권한으로 DATABASE LINK를 생성합니다.

userid : dangjikuser, userpw : dangjikpw 라고 한다면...

CREATE DATABASE LINKDANGJIK_DB
CONNECT TOdangjikuser
IDENTIFIED BYdangjikpw

USING 'DANGJIK';

2. 사용하실 오라클 유저권한으로 SYNONYM을 생성합니다.

CREATE SYNONYM 사용할이름

FOR DGVORGIF0@DATABASE링크명

이상입니다.

백업

#!/bin/sh

dat=`date +%Y%m%d%H%M`
/app/oracle/product/920/bin/exp userid/passwd file=/user/userid/backup/oracle_$dat.dmp

복구

FULL 백업을 한경우

user와 tablespace정보까지 함께 백업이 되므로

import할때 특별한 방법이 필요하다.

오라클관리자

1. drop user scott cascade;

2. create user scott identified by tiger

default tablespace scott_tablespace

temporary tablespace temp;

3. grant connect , resource to scott

4. imp scott/tiger file=aaa.dmp



19 04 * * * /home/my/bin/oracleback

crontab -e 를 이용하여 위의 내용을 추가
crontab -l 로 확인할수 있다.

매일 04:19분에 oracleback을 실행한다.


/home/my/bin/oracleback 화일의 내용

#!/bin/bash

#오라클 환경설정 시작
export ORACLE_HOME=/home/my/app/oracle/product/8.0.5
export LD_LIBRARY_PATH=$LD_lIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=ORCL
export NLS_LANG=KOREAN_KOREA.KO16KSC5601
#오라클 환경설정 끝

#ss = `date +myDB%y%m%d.dmp` #요렇게 하면 오늘 날짜 생성
#echo `date +myDB%y%m%d.dmp` #밑에 있는 화일경로명을 $ss로 하면 된다.

/home/my/app/oracle/product/8.0.5/bin/exp id/passwd file=/home/my/`date +myDB%Y%m%d.dmp` FULL=Y

ss를 주석처리 했는데
위의 exp 실행문에서 file=$ss 라고 해놓으면 ss란 이름으로 오라클 FULL백업화일이 만들어
집니다. id/passwd 는 오라클 DB 관리자 계정/비밀번호 입니다.

'DataBase' 카테고리의 다른 글

[Oracle] Database link, Synonym How to  (0) 2007.01.09
[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09

CREATE OR REPLACE PROCEDURE P_RESET_SEQ( SEQ_NAME IN VARCHAR2 )
IS
L_VAL NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL' INTO L_VAL;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY -' || L_VAL || ' MINVALUE 0';

EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL' INTO L_VAL;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY 1 MINVALUE 0';
END;
/

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09
[Oracle] DB Link How-To  (0) 2007.01.09

옵티마이져를 이해하기 위해서는

실행계획(EXPLAIN PLAN)을 반드시 분석해보는 것이 좋다.

1, TOAD에서 간단히 실행계획을 보기위해서 다음 테이블을 생성한다.

CREATE TABLE PLAN_TABLE
(
STATEMENT_ID VARCHAR2(30) , -- 사용자가 지정한 제목
TIMESTAMP DATE , -- 실행계획이 수립된 날짜와 시간
REMARKS VARCHAR2(80) , -- 사용자가 부여한 주석(COMMENTS)
OPERATION VARCHAR2(30) , -- AND-EQUAL,INDEX, SORT 등과 같은 실행 연산자
OPTIONS VARCHAR2(30) , -- BY ROWID, JOIN, FULL 등과 같은 실행 옵션
OBJECT_NODE VARCHAR2(128), -- 사용한 데이타베이스 링크
OBJECT_OWNER VARCHAR2(30) , -- 객체를 생성한 소유자
OBJECT_NAME VARCHAR2(30) , -- 테이블, 인덱스, 클러스터 등의 객체의 이름
OBJECT_INSTANCE NUMERIC , -- SQL문의 FROM절에 기술된 객체를 좌에서 우로 부여한 번호
OBJECT_TYPE VARCHAR2(30) , -- UNIQUE, NON-UNIQUE INDEX 등의 객체의 종류
OPTIMIZER VARCHAR2(255), -- CHOOSE, FIRST_ROW 등의 현재의 옵티마이져 모드
SEARCH_COLUMNS NUMERIC , -- 현재 사용하지 않음
ID NUMERIC , -- 수립된 각 실행단계에 붙여진 일련번호
PARENT_ID NUMERIC , -- 부모단계의 일련번호
POSITION NUMERIC , -- 부모 ID를 가지고 있는 자식 ID간의 처리순
COST NUMERIC ,
CARDINALITY NUMERIC ,
BYTES NUMERIC ,
OTHER_TAG VARCHAR2(255),
OTHER LONG -- 다른 필요한 텍스트를 저장하기 위한 필드
);

☞ PLAN_TABLE 생성 스크립트는 $ORACLE_HOME/rdbms/admin/utlxplan.sql과 같다

2. TOAD의 메뉴에서 VIEW->OPTION->ORACLE->EXPLAIN PLAN TABLE NAME 란에 위에서 생성한 테이블명

('PLAN_TABLE')과사용할 오라클 USERID를 적는다.

3. 실행계획을 보고 싶은 쿼리문을 실행한후 VIEW->EXPLAIN PLAN

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09
[Oracle] DB Link How-To  (0) 2007.01.09
CREATE SYNONYM (synonym name)
FOR (user neme).(object_name[@dbname]) ;


예제
CREATE SYNONYM POOFCDT4_insa
FOR insauser.POOFCDT4@insa

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] DB Link How-To  (0) 2007.01.09
생성하기
create database link (link_name)
connect to (user_id) identified by (password)
using '(tns_name)';

ex)
tnsname = 'dev'
user = scott
password = tiger

SQL> CREATE DATABASE LINK DEV_DB
2 CONNECT TO scott IDENTIFIED BY tiger
3 USING 'dev';

사용하기
ex)

SQL> SELECT * FROM tab@dev;

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09

+ Recent posts