'02.Oracle'에 해당되는 글 248건

  1. 2009.08.12 오라클 테이블별 현황보기
  2. 2009.08.12 오라클 실행계획(explan table) 보기(분석)
  3. 2009.08.12 오라클 내장함수
  4. 2009.08.12 오라클 한글 자음 검색 2
  5. 2009.08.10 오라클 clob 예제
  6. 2009.07.29 Oracle SQL Developer 전체기능
  7. 2009.07.29 oracle 공백 제거
  8. 2009.07.14 데브피아 컬럼] DB 튜닝 이야기 - (2회) INDEX 과연 달면 빠른가?
  9. 2009.07.14 [데브피아 컬럼] DB 튜닝 이야기 - (1회) INDEX 과연 달면 빠른가?
  10. 2009.07.06 [펌] oracle 10g의 CONNECT BY절
  11. 2009.07.06 오라클 Select 해서 Update 하기 1
  12. 2009.07.04 [oracle] 오라클 인덱스(index) 설명 및 밸런싱,결합인덱스 생성지침
  13. 2009.07.04 redhat 에 oracle 설치
  14. 2009.07.02 오라클 암호화 복호화 초간단 예제(dbms_obfuscation_toolkit 편)
  15. 2009.06.27 oracle em 수동시작/수동정지 만들기 1
  16. 2009.06.27 오라클 어드민 팁
  17. 2009.06.27 오라클 시나리오 : 원인 :INACTIVE한 REDO LOG GROUP 유실
  18. 2009.06.27 오라클9i 데이타베이스 초기화 매개변수(전부) 설명
  19. 2009.06.27 FLASH BACK QUERY
  20. 2009.06.27 PFile과 SPFile
  21. 2009.06.27 오라클 종료
  22. 2009.06.27 오라클 종료
  23. 2009.06.27 오라클 힌트 사용
  24. 2009.06.27 오라클 에러코드 정리
  25. 2009.06.27 오라클 에러코드 한글 번역
  26. 2009.06.27 오라클 팁...!!(시스템테이블)
  27. 2009.06.27 Linux Oracle 설치와 활용(Ⅰ)
  28. 2009.06.27 Oracle Database 10g (10.1.0.2) Installation On Fedora Core 2 (FC2)
  29. 2009.06.27 oracle 에러(상세설명)
  30. 2009.06.27 oracle 에러(상세설명)
02.Oracle/DataBase2009. 8. 12. 15:59
반응형
출처 : http://javaservice.net/
--테이블별 현황보기
create or replace
procedure show_space
( p_segname in varchar2,
p_owner in varchar2 default user,
p_type in varchar2 default 'TABLE' )
as
l_free_blks number;
 
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') || p_num );
end;
begin
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );
 
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );
 
p( 'Free Blocks', l_free_blks );
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );
end;
/
set serveroutput on
exec show_space( 'EMP' );
 
--테이블스페이스 현황보기
column dummy noprint
column pct_used format 999.9 heading "%|Used"
column name format a16 heading "Tablespace Name"
column Kbytes format 999,999,999 heading "KBytes"
column used format 999,999,999 heading "Used"
column free format 999,999,999 heading "Free"
column largest format 999,999,999 heading "Largest"
break on report
compute sum of kbytes on report
compute sum of free on report
compute sum of used on report
 
select nvl(b.tablespace_name,
nvl(a.tablespace_name,'UNKOWN')) name,
kbytes_alloc kbytes,
kbytes_alloc-nvl(kbytes_free,0) used,
nvl(kbytes_free,0) free,
((kbytes_alloc-nvl(kbytes_free,0))/
kbytes_alloc)*100 pct_used,
nvl(largest,0) largest
from ( select sum(bytes)/1024 Kbytes_free,
max(bytes)/1024 largest,
tablespace_name
from sys.dba_free_space
group by tablespace_name ) a,
( select sum(bytes)/1024 Kbytes_alloc,
tablespace_name
from sys.dba_data_files
group by tablespace_name )b
where a.tablespace_name (+) = b.tablespace_name
order by 1
/
 
--테이블스페이스 현황보기(덤으로)
SELECT
sysdate inst_date ,
ddf.tablespace_name tspace ,
ROUND(fst.FRAG_INDEX,2) fragindex ,
allspc.KB totalaloc ,
(ddf.fretot - fst.total_free ) /1024 totalused ,
fst.total_free /1024 totalfree ,
ROUND((fst.total_free /ddf.fretot),2) * 100 frepct ,
fst.max_hole /1024 maxdiv ,
ROUND((fst.avg_hole /1024),2) avgdiv ,
fst.holes num_of_div
FROM dual,
(SELECT
tablespace_name tablespace_name ,
SUM(bytes) fretot
FROM dba_data_files
WHERE tablespace_name != 'TEMP'
group by tablespace_name) ddf,
(
SELECT tablespace_name tablespace_name,
SQRT(MAX(BLOCKS)/SUM(BLOCKS))*(100/SQRT(SQRT(COUNT(BLOCKS)) ))
FRAG_INDEX,
SUM(bytes) total_free,
MAX(bytes) max_hole,
AVG(bytes) avg_hole,
COUNT(*) holes
FROM dba_free_space
WHERE tablespace_name != 'TEMP'
GROUP BY tablespace_name
) fst,
(select table_space tablespace_name , sum(x) KB from
(select tablespace_name table_space,sum(BYTES/1024) x from
dba_data_files
where maxbytes=0 and
tablespace_name != 'TEMP'
group by tablespace_name
union all
select tablespace_name table_space,sum(MAXBYTES/1024) x from
dba_data_files
where tablespace_name != 'TEMP'
group by tablespace_name
)group by table_space) allspc
WHERE ddf.tablespace_name = fst.tablespace_name(+)
and ddf.tablespace_name = allspc.tablespace_name(+);


출처 : http://blog.empas.com/jb0077/21023496
Posted by 1010
02.Oracle/DataBase2009. 8. 12. 15:58
반응형
오라클 실행계획(explan table) 보기.

작성자: 안창선(kabin@kldp.org)

오라클을 사용하면서 느낀것이 plan을 뜨는게 인포믹스보다 번거롭게 느껴지더군요.
그래서그런지 사용하는분을 별로 보지 못했습니다. 이제 아래 내용을 따라 하시면..
아주 쉽게 plan을 떠보고 SQL문을 튜닝하실 수 있을겁니다.

오라클은 실행계획이라는 것을 확인하여 성능을 측정할 수 있습니다.
엄밀히 말해 성능을 측정하는게 아니라 SQL리 인덱스를 적절히 쓰고 있는지
아니면 인덱스가 무시된체 full table scan을 하여 성능을 떨어뜨리게 되는지등을
확인하는 것입니다.(맞나?)

1. 우선 실행계획을 측정 하려면 실행계획을 확인한 자료를 오라클 DB에 저장할 수
있도록 실행계획 테이블을 만들어 줘야 합니다. 실행계획 테이블의 이름은 어떠한
이름을 가지고 있더라도 상관은 없지만 아래의 테이블 필드를 가지고 있어야
합니다. 따라서 실행계획을 확인하기 위한 첫 작업은 실행계획 테이블을 만드는
것이겠지요. 우리는 디폴트 이름은 PLAN_TABLE이라고 이름을 지읍시다.

create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns numeric,
id numeric,
parent_id numeric,
position numeric,
other long);
create unique index PLAN_TABLE_INDEX
on PLAN_TABLE ( statement_id, id)

2. 자 이제 실행계획 자료를 저장할 테이블을 만들었으니 이제 특정 SQL의
실행계획을 확인해 봅시다.

delete plan_table
/
EXPLAIN PLAN SET STATEMENT_ID = 'plan1' --> 해당실행문의 제목
INTO PLAN_TABLE
FOR
SELECT *
FROM test_table a
WHERE a.test like 'hi'||'%'
/

즉 위의 문장은 일단 실행계획테이블(plan_table)의 자료를 일단 모두 지운다음에.
plan1 ID로 문장을 지정하고 아래에 나오는 SQL문장의 결과를 PLAN_TABLE에
저장 하라는 명령입니다.

3. 이제 실행계획의 결과값을 봅시다.

결과값은 실행계획 테이블에 들어가 있습니다. 결과값을 보려면 아래의 SQL을
실행시켜 보십시오. 단 STATEMENT_ID와 PLAN_TABLE은 여러분이 정의한 것을
입력하셔야겠지요.

SELECT lpad(operation,length(operation)+2*(level-1)) ||
decode(id,0,'CostEstimate:'||decode(position,'0','N/A',position),null)||
''||options||
decode(object_name,null,null,':')||rpad(object_owner,length(object_name)+1,',')||
object_name||
decode(object_type,'unique','(U)','NON-UNIQUE',
'(NU)',null)||decode(object_instance,null,null,'('||object_instance||')')
FROM PLAN_TABLE
START with ID = 0 AND STATEMENT_ID = 'plan1'
CONNECT by prior ID = PARENT_ID and STATEMENT_ID = 'plan1'
/

4. 위의 결과값

예를 들어 이런 것이 나올 수 있습니다.

LPAD(OPERATION,LENGTH(OPERATION)+2*(LEVEL-1))||DECODE(ID,0,'COSTESTIMATE:'||DECO
--------------------------------------------------------------------------------
SELECT STATEMENTCostEstimate:
TABLE ACCESSBY INDEX ROWID:HDMF,,,,,,,,W5_CARVAL_T(1)
INDEXRANGE SCAN:HDMF,,,,,,,,,,,,,,,,,,W5_CARVAL_T_CNAME_IDX(NU)

여기 위를 보면 accessby index 어쩌구 나오지요? 즉 인덱스를 사용하고 있다는
겁니다.
그리고 그 인덱스는 W5_CARVAL_T_CNAME_IDX을 쓰고 있다고 하는 것이구요.

만약 내용이

LPAD(OPERATION,LENGTH(OPERATION)+2*(LEVEL-1))||DECODE(ID,0,'COSTESTIMATE:'||DECO
--------------------------------------------------------------------------------
SELECT STATEMENTCostEstimate:
TABLE ACCESSFULL:HDMF,,,,,,,,W5_CARVAL_T(1)

이런 식으로 나오면 인덱스를 전혀 사용하지 못하고 테이블을 일일이 뒤진다는
거지요.
위에 보면 accessfull이라는게 있지요. 즉 테이블을 전체 검색하고 있다는 뜻입니다.
 
Posted by 1010
02.Oracle/DataBase2009. 8. 12. 15:19
반응형

10.명령어


[2008.06.02] 오라클 내장함수#


숫자 함수(number function)#


ABS ACOS ASIN ATAN
ATAN2 BITAND CEIL COS
COSH EXP FLOOR LN
LOG MOD POWER ROUND(number)
SIGN SIN SINH SQRT
TAN TANH TRUNC(number) WIDTH_BUCKET


① ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림한다.
② TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버린다.
③ MOD(1600,300) --> 100 : 1600을 300으로 나누고 나머지를 리턴한다.
* ROUND예제(WHOLE NUMBER:정수)
SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL
==> 45.92 46 50

* TRUNC예제
SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL
==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40

* SYSTEM 날짜를 갖고 오는 방법.
SELECT sysdate FROM dual


/** 함수 - Number Function **/
--무조건 올림
SELECT CEIL(13.11) FROM DUAL;
SELECT CEIL(13.001) FROM DUAL;

--나머지 구함
SELECT MOD(23, 5) FROM DUAL;
SELECT MOD(57, 145) FROM DUAL;

-- 제곱승
SELECT POWER(3, 2), POWER(3, -2) FROM DUAL;
SELECT POWER(2, 10) FROM DUAL;

--자릿수 지정
SELECT ROUND(345.123, 0) FROM DUAL;
SELECT ROUND(345.123, 2), ROUND(345.123, -1) FROM DUAL;

--지정된 자리까지 잘라내기
SELECT TRUNC(345.123, 1), TRUNC(345.123, 0), TRUNC(345.123, -1) FROM DUAL;
SELECT TRUNC( 345.123 + 0.09, 1 ) FROM DUAL;
SELECT TRUNC( 345.123 + 0.9, 0 ) FROM DUAL;
SELECT TRUNC( 345.123 + 9, -1 ) FROM DUAL;

SELECT SIGN(5.989), SIGN(0), SIGN(-999.098) FROM DUAL;


문자 함수(character function)#


CHR CONCAT INITCAP LOWER
LPAD LTRIM NLS_INITCAP NLS_LOWER
NLSSORT NLS_UPPER REPLACE RPAD
RTRIM SOUNDEX SUBSTR TRANSLATE
TREAT TRIM UPPER ASCII
INSTR LENGTH, LENGTHB, LENGTHC, LENGTH2, LENGTH4

select ascii('B') from dual;

=> 66


①LOWER( column|expression )

LOWER('String') --> string : 소문자로 변환

②UPPER( column|expression )
UPPER('String') --> STRING : 대문자로 변환

③INITCAP( column|expression )
INITCAP('string') --> String : 첫글자만 대문자이고 나머지글자는 소문자로 변환


④CONCAT( column1|expression1 ,column2|expression2 )
CONCAT('Good','String') --> GoodString : ||와 같은 역할을 한다.

⑤SUBSTR(column|expression, m [,n]) : m값이 음수면 문자값의 끝부터..)
SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.

⑥LENGTH( column|expression )
LENGTH('String') --> 6 : 문자열의 길이를 리턴한다.

⑦INSTR( column|expression, )
INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치하고 있나를 리턴한다.

⑧LPAD( column|expression,n,'string' ) : n 은 전체 길이
LPAD('String',10,'*') --> ****String
: 10자리수중에 모자란 자리수를 '*'로 왼쪽에 채운다.(문자,숫자 가능!!!)

⑨ RPAD('String',10,'*') --> String****
: 10자리수중에 모자란 자리수를 '*'로 오른쪽에 채운다.(문자,숫자 가능!!!)

⑩ LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버린다.


⑪ RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버린다.
* TRIM(leading/tailing/both, trim_character FROM trim_source )

TRIM( 'S' FROM 'SSMITH') --> MITH


/** 함수 - Character Function **/
--특정Character의 아스키값 구하기
SELECT CHR(65) "CHR", ASCII('A') "ASCII" FROM DUAL;
SELECT ASCII( CHR(65) ) FROM DUAL;

SELECT LOWER('My name is LKM') "LOWER", UPPER('My name is LKM') "UPPER" FROM DUAL;

SELECT LPAD('LKM', 10, '*') "LPAD", RPAD('LKM', 10, '*') "RPAD" FROM DUAL;
SELECT LPAD('1234567890', 20, '+') || RPAD('1234567890', 20, '^') "12345678901234567890"
FROM DUAL;
SELECT LPAD('1,234,567', 30, ' ') "LPAD사용으로 30자리 맞춤",
'1,234,567' "단순문자 사용",
1234567 "단순숫자 사용"
FROM DUAL;

SELECT LTRIM(' AAA ') "LTRIM", RTRIM(' AAA ') "RTRIM" FROM DUAL;
SELECT LTRIM( RTRIM( ' A A A ' ) ) "TRIM" FROM DUAL;

SELECT REPLACE('ORACLE', 'A', 'BBB') "REPLACE" FROM DUAL;
SELECT EMP_NAME, REPLACE(EMP_NAME, '이', '박') "이->박"
FROM PERSONNEL
WHERE EMP_NAME LIKE '이%';

SELECT SUBSTR('ORACLE PROJECT', 1, 3) SUBSTR1,
SUBSTR('ORACLE PROJECT', 4, 5) SUBSTR2,
SUBSTR('ORACLE PROJECT', 10) SUBSTR3 FROM DUAL ;
SELECT SUBSTRB('ORACLE PROJECT', 1, 3) SUBSTRB1,
SUBSTRB('ORACLE PROJECT', 4, 5) SUBSTRB2,
SUBSTRB('ORACLE PROJECT', 10) SUBSTRB3 FROM DUAL ;
SELECT SUBSTR('오라클 PROJECT', 1, 3) SUBSTR1,
SUBSTR('오라클 PROJECT', 4, 5) SUBSTR2,
SUBSTR('오라클 PROJECT', 10) SUBSTR3 FROM DUAL ;
SELECT SUBSTRB('오라클 PROJECT', 1, 3) SUBSTRB1,
SUBSTRB('오라클 PROJECT', 4, 5) SUBSTRB2,
SUBSTRB('오라클 PROJECT', 10) SUBSTRB3 FROM DUAL ;

SELECT LENGTH ('ORACLE PROJECT') "LENGTH",
LENGTHB('ORACLE PROJECT') "LENGTHB",
FROM DUAL;
SELECT EMPNO, LENGTH(EMPNO), LENGTHB(EMPNO),
EMP_NAME, LENGTH(EMP_NAME), LENGTHB(EMP_NAME)
FROM PERSONNEL
WHERE EMPNO > '98102';
SELECT HOBBY, LENGTH(HOBBY), LENGTHB(HOBBY)
FROM PERSONNEL
WHERE EMPNO > '98102';

SELECT INSTR ('ORACLE PROJECT', 'R', 1, 1) INSTR1,
INSTR ('ORACLE PROJECT', 'R', 1, 2) INSTR2,
INSTR ('ORACLE PROJECT', 'R', 1, 3) INSTR3
FROM DUAL;
SELECT INSTR ('CORPORATE FLOOR','OR', 3, 2) INSTR,
INSTRB ('CORPORATE FLOOR','OR', 3, 2) INSTRB
FROM DUAL;
SELECT HOBBY,
INSTR (HOBBY, ')', 1, 1) INSTR,
INSTRB(HOBBY, ')', 1, 1) INSTRB
FROM PERSONNEL

WHERE EMPNO > '98102';



날짜와 날짜 처리함수(date, datetime function)#


ADD_MONTHS CURRENT_DATE CURRENT_TIMESTAMP DBTIMEZONE
EXTRACT(datetime) FROM_TZ LAST_DAY LOCALTIMESTAMP
MONTHS_BETWEEN NEW_TIME NEXT_DAY NUMTODSINTERVAL
NUMTOYMINTERVAL ROUND(date) SESSIONTIMEZONE SYS_EXTRACT_UTC
SYSDATE SYSTIMESTAMP TO_DSINTERVAL TO_TIMESTAMP
TO_TIMESTAMP_TZ TO_YMINTERVAL TRUNC(date) TZ_OFFS


date + number : date에 number만큼 후의 날자를 보여준다.
date - number : date에 number만큼 전의 날자를 보여준다.
date1 - date2 : date1에서 date2 까지의 총 일수를 보여준다.( date1+date2는 X )
date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여준다.


NUMTODSINTERVAL

NUMTODSINTERVAL(n,'char_expr') 함수는 n을 interval day to second로 변환하여 출력한다.
 char_expr은 다음 중의 하나이다.
  ‘DAY’
  ‘HOUR’
  ‘MINUTE’
  ‘SECOND’


MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194
; 두날짜 사이의 달수를 보여준다.

ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94
; 날짜에 6개월을 더한 날자를 보여준다.

NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'
; 해당일 다음에 오는 FRIDAY의 일자를 보여준다.
('SUNDAY'는 1, 'MONDAY'는 2...이런식으로 숫자를 써줘도 된다.)

LAST_DAY('01-SEP-95') --> '30-SEP-95'
; 해당월의 마지막날자를 보여준다.

ROUND('25-JUL-95','MONTH')--> 01-AUG-95 ROUND('25-JUL-95','YEAR')--> 01-JAN-96
TRUNC('25-JUL-95','MONTH') --> 01-JUL-95 TRUNC('25-JUL-95','YEAR') --> 01-JAN-95


/** 함수 - Date Function **/
SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') "SYSDATE" FROM DUAL;

SELECT LAST_DAY(SYSDATE) FROM DUAL;
SELECT TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD HH24:MI:SS') "LAST_DAY" FROM DUAL;

SELECT MONTHS_BETWEEN( '2002/01/13', '2002/05/13' ) "MONTHS_BETWEEN (-)",
MONTHS_BETWEEN( '2002/01/13', '2001/11/13' ) "MONTHS_BETWEEN (+)"
FROM DUAL ;
SELECT MONTHS_BETWEEN( '2002/01/13', '2002/01/30' ) "MONTHS_BETWEEN (-)",
MONTHS_BETWEEN( '2002/01/13', '2002/01/01' ) "MONTHS_BETWEEN (+)"
FROM DUAL ;

SELECT ADD_MONTHS(SYSDATE, 1) "ADD_MONTHS (+)",
ADD_MONTHS(SYSDATE, -1) "ADD_MONTHS (-)"
FROM DUAL ;

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
SELECT ADD_MONTHS( '2002/02/28', 12 ) "1년후",
ADD_MONTHS( '2002/02/28', 24 ) "2년후",
ADD_MONTHS( '2002/02/28', 36 ) "3년후"
FROM DUAL ;

SELECT SYSDATE,
NEXT_DAY(SYSDATE, '일요일') "NEXT_DAY 1",
NEXT_DAY(SYSDATE, 1 ) "NEXT_DAY 2"
FROM DUAL;
SELECT SYSDATE,
NEXT_DAY(SYSDATE, '수요일') "NEXT_DAY 1",
NEXT_DAY(SYSDATE, 4 ) "NEXT_DAY 2"
FROM DUAL;


데이터 형변환 함수(conversion function)#


ASCIISTR BIN_TO_NUM CAST CHARTOROWID
COMPOSE CONVERT DECOMPOSE HEXTORAW
NUMTODSINTERVAL NUMTOYMINTERVAL RAWTOHEX RAWTONHEX
ROWIDTOCHAR ROWIDTONCHAR TO_CHAR(character) TO_CHAR(datetime)
TO_CHAR(number) TO_CLOB TO_DATE TO_DSINTERVAL
TO_LOB TO_MULTI_BYTE TO_NCHAR(character) TO_NCHAR(datetime)
TO_NCHAR(number) TO_NCLOB TO_NUMBER TO_SINGLE_BYTE
TO_YMINTERVAL TRANSLATE ... USING UNISTR


nlsparams : 십진수, 그룹구분자, 지역 통화 기호, 국제 통화 기호

TO_CHAR(date,['format'],[nlsparams]) : date를 format에 맞게 문자열로 변환한다.

- Date Format Elements
YYYY --> 1999 (년출력) , YEAR --> nineteen ninety-nine (년출력)
MM --> 12 (월출력) , MONTH --> DECEMBER (월출력), MON --> DEC
D --> 요일을 숫자로 리턴한다.(일요일은 1, 월요일은 2...)
DD --> 07 (달의 일출력)
DDD --> 200 (연의 일출력)그 해의 총 몇 일째인가를 리턴한다.
DAY --> MONDAY (요일출력) DY-->MON
CC --> 20 (몇 세기인지를 보여준다.)
WW --> 그 해의 몇 번째 주인가를 리턴한다.
W --> 그 달의 몇 번째 주인가를 리턴한다.

=>  흔히 사용하는 위의 형태는 일상 생활에서 사용되는 몇주 개념적용이 아닌


7일 단위로 끊은 주 개념입니다.


예를 들어 2005년 1월 2일의 경우 일요일로서 일상 생활에서는 2005년의 2주차 입니다.


하지만 to_char('20050102','ww') 의 경우 '2005'년도의 2일째 이기에 1주 로 계산 합니다.


(2006년의 경우 '20060101'이 정확히 일요일이기 때문에 to_char(sysdate,'ww')의 값을 오해 할 수 있습니다. 2005년 또는 2007년 경우를 확인 해 보시면 이해에 도움이 될 것입니다.)



* Element들을 소문자로 쓰면 소문자로 나오고 대문자로 쓰면 대문자로 출력된다.
HH or HH12 or HH24 / MI(0-59분) / SS(0-59초)


* 문자열은 " " 묶어 추가한다 DD " of " MONTH --> 12 of DECEMBER

*숫자 접미어는 숫자를 문자로 표기. TH(4->4TH)/ SP(4->FOUR)/ SPTH or THSP(4->FOURTH)

ddspth : 14-> fothteenth

* / . , : 구두점은 결과에 그대로 출력한다. * 공백, 선행제로를 제거하는 fm요소가 있다.

TO_CHAR(number,'format',[nlsparams]) : number를 format에 맞게 문자열로 변환한다.

- Number Format Elements
9 : 999,999 --> 1,234 $: 부동 달러 기호 $99999 -> $1234
0 : 099999 --> 001234 99.999EEEE -> 1.234E+03 B: 0값을 공백으로
L : L99,999 --> FF1,234 (NLS_CURRENCY에 설정되어있는 값이 L로 보여진다.)

TO_NUMBER(char,['format'],[nlsparams]) : 숫자형태의 문자열을 숫자로 변한한다.
TO_DATE(char,['format'],[nlsparams]):날자형태의 문자열을 format에 맞게 날자형식으로 변환 한다.


/** 함수 - Conversion Function **/
SELECT TO_CHAR(1234567.891) "TO_CHAR1",
TO_CHAR(1234567.891, '999') "TO_CHAR2",
TO_CHAR(1234567.891, '9,999,999') "TO_CHAR3",
TO_CHAR(1234567.891, '0.0000') "TO_CHAR5",
TO_CHAR(1234567.891, '9,999,999.0000') "TO_CHAR6",
TO_CHAR(123, '9,999.00') "TO_CHAR7",
TO_CHAR(123, '9,999.99') "TO_CHAR8"
FROM DUAL ;
SELECT TO_CHAR(1234567.891, '9G999G999') "TO_CHAR3",
TO_CHAR(1234567.891, '0D0000') "TO_CHAR5",
TO_CHAR(1234567.891, '9G999G999D0000') "TO_CHAR6",
TO_CHAR(123, '9G999D00') "TO_CHAR7",
TO_CHAR(123, '9G999D99') "TO_CHAR8"
FROM DUAL ;

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') "TO_CHAR1",
TO_CHAR(SYSDATE, 'YYYY/MM') "TO_CHAR2",
TO_CHAR(SYSDATE, 'YYYY') "TO_CHAR3",
TO_CHAR(SYSDATE, 'DD') "TO_CHAR4",
TO_CHAR(SYSDATE, 'DAY') "TO_CHAR5",
TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') "TO_CHAR6",
TO_CHAR(TO_DATE('20020101','YYYYMMDD'), 'YYYY-MM-DD') "TO_CHAR7",
TO_CHAR(TO_DATE('20020101','YYYYMMDD'), 'YYYYMMDD HHMISS') "TO_CHAR8"
FROM DUAL ;

SELECT TO_NUMBER('123456.9') "TO_NUMBER1",
TO_NUMBER('1234567') "TO_NUMBER2"
FROM DUAL ;
SELECT TO_NUMBER('123,456.9', '999,999.9') "TO_NUMBER1",
TO_NUMBER('1,234,567', '9G999G999') "TO_NUMBER2"
FROM DUAL ;

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TO_DATE('20020824') "TO_DATE1",
TO_DATE('2002-08-24') "TO_DATE2",
TO_DATE('200208') "TO_DATE3"
FROM DUAL ;
SELECT TO_DATE('20020824', 'YYYYMMDD') "TO_DATE1",
TO_DATE('2002-08-24', 'YYYY-MM-DD') "TO_DATE2",
TO_DATE('200208', 'YYYYMM') "TO_DATE3"
FROM DUAL ;
SELECT TO_DATE('2002/08/24 08:14:06', 'YYYY/MM/DD HH24:MI:SS') "TO_DATE1",
TO_DATE('2002/08/24 08:14:06 오후', 'YYYY/MM/DD HH:MI:SS AM') "TO_DATE2"
FROM DUAL ;


기타함수(miscellaneous single row function)#


BFILENAME COALESCE DECODE DEPTH
DUMP EMPTY_BLOB EXISTSNODE EXTRACT(XML)
EMPTY_CLOB
EXTRACTVALUE GREATEST LEAST NLS_CHARSET_DECL_LEN
NLS_CHARSET_ID NLS_CHARSET_NAME NULLIF NVL
NVL2 PATH SYS_CONNECT_BY_PATH SYS_CONTEXT
SYS_DBURIGEN SYS_EXTRACT_UTC SYS_GUID SYS_TYPEID
SYS_XMLAGG SYS_XMLGEN UID UPDATEXML
USER USERENV VSIZE XMLAGG
XMLCOLATTVAL XMLCONCAT XMLFOREST XMLSEQUENCE
XMLTRANSFORM XMLELEMENT CASE


NVL Funcion : 값이 null일 때 설정값을 보여준다.
NVL(number_column, 0) : null일 때 0을 보여준다.
NVL(date_column, '01-JAN-95') : null일 때 '01-JAN-95'를 보여준다.
NVL(character_column, 'Empty') : null일 때 'Empty'를 보여준다.
* column Type과 표현식의 type이 반드시 일치해야 한다.

DECODE Function : CASE or IF-THEN-ELSE 형식과 비슷하다.
*DECODE(col/expression, search1, result1 [,search2,result2,…] [,default])
F1 (F2 (F3 (col,arg1),arg2),arg3)

이중 Decode나 Nvl 그리고, To_데이터형은 너무나도 많이 쓰여서 잘 안 까먹지만....
숫자나 문자관련 함수 잘 안쓰면 찾기가 너무 힘들다는..... '그 뭐시기냐 문자열의 위치 찾아내는거
그 함수 뭐냐?' 라면 '그게 뭔데?'라는 반문이-_- 차라리 instr이 뭐하는거지가 더 쉬운 질문이다-_-
대전 있을때 자료전환건이 있어서... 처리를 하려고 보니 특정칼럼 하나에 잘 쓰이지 않는
두개의 필드값을 탭구분자로 나눠서 때려넣어논 꼴을 본적이 있다. instr, chr, replace로 간단히 해결가능할걸 instr과 chr를 잘 몰라 통째로 엑셀로 받아 수작업을 했다라는....

/** 함수 - ETC **/
SELECT EMPNO, EMP_NAME, HOBBY 취미, WELL 특기
FROM PERSONNEL
WHERE EMPNO BETWEEN '98001' AND '98005';
SELECT EMPNO, EMP_NAME, HOBBY 취미, NVL(WELL, '(없다)') 특기
FROM PERSONNEL
WHERE EMPNO BETWEEN '98001' AND '98005';

SELECT DECODE( '나', '나', '맞다', '아니다' ) "나가 나면 맞다, 아니면 아니다"
FROM DUAL ;
SELECT DECODE( '나', '대명', '아니다',
'너' , '아니다',
'그' , '아니다',
'나' , '맞다',
'모르겠다' ) FROM DUAL ;
SELECT EMPNO,
EMP_NAME,
DECODE (HT_CODE, '1', '현재원', '2', '휴직', '퇴사') HT_CODE
FROM PERSONNEL
WHERE EMPNO BETWEEN '98071' AND '98080';

SELECT GREATEST (132, 33, 45, 90, 60.77) GREATEST,
LEAST (132, 33, 45, 90, 60.77) LEAST
FROM DUAL;
SELECT GREATEST ('이공명', '이대명', '최수미') GREATEST,
LEAST ('이공명', '이대명', '최수미') LEAST
FROM DUAL;

SELECT USERENV('LANGUAGE') "LANGUAGE",
USERENV('TERMINAL') "TERMINAL",
USERENV('SESSIONID') "SESSIONID"
FROM DUAL;

SELECT UID, USER FROM DUAL;


그룹함수 - 집계(Aggregate) 함수#


AVG CORR COUNT COVAR_POP
COVAR_SAMP CUME_DIST DENSE_RANK FIRST
GROUP_ID GROUPING GROUPING_ID LAST
MAX MIN PERCENTILE_CONT PERCENTILE_DISC
PERCENT_RANK RANK REGR function STDDEV
STDDEV_POP STDDEV_SAMP SUM VAR_POP
VAR_SAMP VARIANCE GROUPING SETS


/** 함수 - Group Function **/
SELECT AVG(HEIGHT), AVG(WEIGHT) FROM PERSONNEL;

SELECT MAX(EMPNO), MAX(EMP_NAME), MIN(EMPNO), MIN(EMP_NAME) FROM PERSONNEL;
SELECT MAX(HEIGHT), MIN(HEIGHT) FROM PERSONNEL;

SELECT SUM(WEIGHT) FROM PERSONNEL;

SELECT COUNT(*), COUNT(EMPNO), COUNT(JIKCH_CODE) FROM PERSONNEL;


그룹함수 -  분석(Analytic) 함수#


AVG CORR COUNT COVAR_POP
COVAR_SAMP CUME_DIST DENSE_RANK FIRST
FIRST_VALUE LAG LAST LAST_VALUE
LEAD MAX MIN NTILE
PERCENT_RANK PERCENTILE_CONT PERCENTILE_DISC RANK
RATIO_TO_REPORT REGR_(linear regression) function ROW_NUMBER STDDEV
STDDEV_POP STDDEV_SAMP SUM VAR_POP
VAR_SAMP VARIANCE TOP_N 분석


윈도우(windowing) 분석 함수#

윈도우 분석함수는 전체 결과 집합 중에서 연속선상에 있는 부분 집합을 대상으로 적용하는 함수의 집합을 말한다.
윈도우 분석함수의 종류는 AVG, COUNT, MAX, MIN,STDDEV,SUM,VARIANCE,FIRST_VALUE,LAST_VALUE 등이 있다.
부분 집합을 결정하기 위한 범위는 CURRENTROW, UNBOUNDED PRECEDING, UNBOUNDED FOLLOWING 등을 지정할 수 있다.

【형식】
   (SUM | AVG | MAX | MIN | COUNT | STDDEV | VARIANCE | FIRST_VALUE | LAST_VALUE)
   ({ | * }) OVER
   ([PARTITION BY [,...]]
   ORDER BY  [collate clause]
   [ASC | DESC] [NULLS FIRST | NULLS LAST] [,...]
   ROWS | RANGE
   {{UNBOUNDED PRECEDING |  PRECEDING} | BETWEEN
   {UNBOUNDED PRECEDING |  PRECEDING}
   AND {CURRENT ROW |  FOLLOWING}}


OVER FROM, WHERE, GROUP BY, HAVING 절이 처리된 후에 적용되며, 함수를 적용하기 위한
행의 정렬 기준 또는 대상 행 집합에 대한 윈도우 정의
ROWS | RANGE 윈도우의 크기를 결정하기 위한 행 집합을 정의
• ROWS는 물리적인 단위에 의해 윈도우 크기 지정
• RANGE는 논리적인 상대 번지에 의해 윈도우 크기 지정
BETWEEN...AND 윈도우의 시작 위치와 마지막 위치 지정
UNBOUNDED PRECEDING 윈도우의 시작 위치는 각 분할의 첫 번째 행
UNBOUNDED FOLLOWING 윈도우의 마지막 위치는 각 분할의 마지막 행


PseudoColumn을 의미하는 것#


ROWID Each row in the database has an address
ROWNUM 테이블에서 select 되어진 행의 순서번호
LEVEL 테이블에서 행(row)의 계층관계를 가리키는 일련번호 순서


LPAD, RPAD : 문자열 채우기#

문법 :

lpad ('string', n [, 'string_pad')
rpad ('string', n [, 'string_pad')


예제 :

select lpad('*', 5, '%') lpad, rpad('%', 5, '*') rpad from dual


결과 :


LPAD RPAD
%%%%* %****


설명 :


VSIZE : 문자의 길이를 구한다.#

예제 :

select vsize('가나다'), '가나다' from dual


결과 :


VSIZE(가나다) 가나다
6 가나다


출처 : http://ebizdocs.springnote.com/pages/1250050?print=1


Posted by 1010
02.Oracle/DataBase2009. 8. 12. 14:39
반응형
select *
FROM BIZ_MASTER
where case when ceo_name < 'ㄱ' then substr(ceo_name, 1, 1)
            when ascii('ㄱ') <= ascii(ceo_name) and
                 ascii(ceo_name)<= ascii('ㅎ') then ceo_name
            when ceo_name < '나' then 'ㄱ'
            when ceo_name < '다' then 'ㄴ'
            when ceo_name < '라' then 'ㄷ'
            when ceo_name < '마' then 'ㄹ'
            when ceo_name < '바' then 'ㅁ'
            when ceo_name < '사' then 'ㅂ'
            when ceo_name < '아' then 'ㅅ'
            when ceo_name < '자' then 'ㅇ'
            when ceo_name < '차' then 'ㅈ'
            when ceo_name < '카' then 'ㅊ'
            when ceo_name < '타' then 'ㅋ'
            when ceo_name < '파' then 'ㅌ'
            when ceo_name < '하' then 'ㅍ'
            else                  'ㅎ'
       end = 'ㄱ';



출처 : http://blog.naver.com/pro20cm/150021994738



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


1.Sample Data 입력


create table t_first (col1 varchar2(100));


insert into t_first values('토플');
insert into t_first values('깡다구');
insert into t_first values('거울');
insert into t_first values('땅끝마을');
insert into t_first values('success');
insert into t_first values('듀오백');
insert into t_first values('사랑');
insert into t_first values('나오미');
insert into t_first values('미국');
insert into t_first values('naver');
insert into t_first values('뻥이야');
insert into t_first values('토마토');
insert into t_first values('새해');
insert into t_first values('premature');
insert into t_first values('찜질방');
insert into t_first values('사진');
insert into t_first values('fallen');
insert into t_first values('energy');
insert into t_first values('햄버거');
insert into t_first values('ㄱ');
insert into t_first values('ㄴ');
insert into t_first values('ㄷ');
insert into t_first values('가');
insert into t_first values('나');
insert into t_first values('다');


select * from t_first;


2.Data가 소량이라면 다음처럼 하면 됩니다.


select *
from t_first
where case when col1 < 'ㄱ' then substr(col1, 1, 1)
            when ascii('ㄱ') <= ascii(col1) and
                 ascii(col1)<= ascii('ㅎ') then col1
            when col1 < '나' then 'ㄱ'
            when col1 < '다' then 'ㄴ'
            when col1 < '라' then 'ㄷ'
            when col1 < '마' then 'ㄹ'
            when col1 < '바' then 'ㅁ'
            when col1 < '사' then 'ㅂ'
            when col1 < '아' then 'ㅅ'
            when col1 < '자' then 'ㅇ'
            when col1 < '차' then 'ㅈ'
            when col1 < '카' then 'ㅊ'
            when col1 < '타' then 'ㅋ'
            when col1 < '파' then 'ㅌ'
            when col1 < '하' then 'ㅍ'
            else                  'ㅎ'
       end = 'ㄱ';                    <== 이 부분을 바꿔가면서 테스트해 보면 됩니다.


select * from t_first
order by col1;


COL1
깡다구
거울


3.그러나 Data의 양이 많고 검색할 때 반드시 인덱스를 이용해야 한다면 다음처럼

  해야 합니다. 8i이후부터 가능한 FBI(function-based index)를 활용하는 예제입니다.

  이 예제는 dba 권한을  가진 유저로 테스트한 것입니다.


-- 함수 생성

create or replace function sf_ganada
  (p_name varchar2)
  return varchar2
  deterministic
is
  v_ret varchar2(10);
begin

  v_ret := case when p_name < 'ㄱ' then substr(p_name, 1, 1)
                when ascii('ㄱ') <= ascii(p_name) and
                     ascii(p_name)<= ascii('ㅎ') then p_name
                when p_name < '나' then 'ㄱ'
                when p_name < '다' then 'ㄴ'
                when p_name < '라' then 'ㄷ'
                when p_name < '마' then 'ㄹ'
                when p_name < '바' then 'ㅁ'
                when p_name < '사' then 'ㅂ'
                when p_name < '아' then 'ㅅ'
                when p_name < '자' then 'ㅇ'
                when p_name < '차' then 'ㅈ'
                when p_name < '카' then 'ㅊ'
                when p_name < '타' then 'ㅋ'
                when p_name < '파' then 'ㅌ'
                when p_name < '하' then 'ㅍ'
                else                  'ㅎ'
           end;

  return v_ret;
end sf_ganada;
/


-- 인덱스 생성
create index t_first_col1_fbi_idx
on t_first(sf_ganada(col1));


-- 통계 생성

analyze table t_first compute statistics
  for table
  for all indexed columns
  for all indexes;


-- 세션 환경 설정
alter session set QUERY_REWRITE_ENABLED=TRUE;
alter session set QUERY_REWRITE_INTEGRITY=TRUSTED;


-- 테스트 및 실행계획

select col1, sf_ganada(col1)
from t_first
where sf_ganada(col1) = 'ㄱ';


Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=4 Bytes=36)  
1 0     TABLE ACCESS (BY INDEX ROWID) OF 'T_FIRST' (Cost=2 Card=4 Bytes=36)  
2 1         INDEX (RANGE SCAN) OF 'T_FIRST_COL1_FBI_IDX' (NON-UNIQUE) (Cost=1 Card=4)

참고 1 : FBI(function-based index, 함수기반 인덱스)를 사용하려면...


# You must have the following initialization parameters defined

   to create a function-based index:

   -- QUERY_REWRITE_INTEGRITY set to TRUSTED
   -- QUERY_REWRITE_ENABLED set to TRUE
   -- COMPATIBLE set to 8.1.0.0.0 or a greater value


# The table must be analyzed after the index is created.


# The query must be guaranteed not to need any NULL values
   from the indexed expression, since NULL values are not stored in indexes.



참고 2 : 비슷한 문제 => http://blog.naver.com/orapybubu/40021815464

=================================================================================

자음까지는 잘 모르겠고...


select *

from table

where 한글 >= "가"

and     한글 < "나"


이렇게 하면 "가"부터 "깋" 까지는 가지고 옵니다.

   where decompose(mycolumn) like substr(decompose('가'),0,1)||'%'

================================================================

bulls1223 님 말 맞긴한대요 DECOMPOSE 는 유니코드 아니면 안됩니다.

한글로 테스트는 안해봐서 모르겠는대요... 그리고 9i 이상만 되는거 같내요

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/functions34a.htm#1000002


다른방법으론... 테이블 일일이 만들어서 검색하는방법이 있습니다.

 도서관리 프로그램 같은대서 주로 사용하는대요

도서관가면 ㄱ 210.0 ㄴ   이런거 있잔아요 이게 도서명 하고 저자명 각각 쓰는건대요

테이블보면

ㄱ  가 각 간 ~~~ 이런식으로  ㄱ 들어가는건 모두 들어있더군요.. 이걸가지고 검색하더군요... 받침은 안들어갑니다. ... 악 이런거...


다 만들어진건 찾기 힘들겁니다.  정해야된다면 직접만드시는게...

Posted by 1010
02.Oracle/DataBase2009. 8. 10. 18:08
반응형



오라클 clob 예제

by kkaok
2003-06-27


Lob type이란?

lob(Large Object) 타입은 대용량 데이터를 저장하기위한 데이터 타입으로 오라클 8버전부터 지원된다.


Lob 타입의 특징

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.


Lob type의 종류

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.

BLob (Binary Large Object), 이진 바이너리 데이터의 저장시 사용된다.
CLob (Character Large Object), 문서 데이터의 저장시 사용된다.
BFILE 외부 파일에 저장된 이진 데이터가 있는 경로의 저장시 사용된다.

Clob에 저장하기

  1: import java.sql.*;
  2: import java.io.*;
  3: import oracle.sql.*;
  4: import oracle.jdbc.driver.*;
  5: ...
  6: 
  7: public void insertQuery(UploadBoard up,int re_step,int re_level) 
         throws Exception  
  8: {
  9:   ResultSet rs   = null;
 10:   PreparedStatement pstmt = null;
 11:   Connection conn = null;
 12:   String query = "insert into "+up.getTableName()+" (seq,re_step,
           re_level,name,title,pwd,email,readnum,writeday,ip,relativeCnt,
               homepage,imgInfo,content,tag) 
                   values(?,?,?,?,?,?,?,0,sysdate,?,0,?,?,empty_clob(),?)";
오라클 명령어 empty_clob()을 이용해 공간을 확보한다.
13: try{ 14: conn = DBManager.getClobConnection(); 15: conn.setAutoCommit(false);
CLOB column을 업데이트 하는동안 다른 process의 접근을 막기위해
setAutoCommit(false)를 반드시 설정해야 한다. 이부분이 가장 중요하다.
16: pstmt = conn.prepareStatement(query); 17: pstmt.setInt(1,up.getSeq()); 18: pstmt.setInt(2,re_step); 19: pstmt.setInt(3,re_level); 20: pstmt.setString(4,up.getName()); 21: pstmt.setString(5,up.getTitle()); 22: pstmt.setString(6,up.getPwd()); 23: pstmt.setString(7,up.getEmail()); 24: pstmt.setString(8,up.getIp()); 25: pstmt.setString(9,up.getHomepage()); 26: pstmt.setString(10,up.getImgInfo()); 27: pstmt.setString(11,up.getTag()); 28: pstmt.executeUpdate(); 29: pstmt.close(); 30: String query2 = " select /*+ index_desc("+up.getTableName()+ " "+up.getTableName()+"_indx) */ content from "+ up.getTableName()+" where seq = ? for update ";
for update를 이용해 CLOB column을 lock한다.
31: pstmt = conn.prepareStatement(query2); 32: pstmt.setInt(1,up.getSeq()); 33: rs = pstmt.executeQuery(); 34: if(rs.next()) { 35: CLOB clob = ((OracleResultSet)rs).getCLOB(1); 36: Writer writer = clob.getCharacterOutputStream(); 37: Reader src = new CharArrayReader(up.getContent().toCharArray()); 38: char[] buffer = new char[1024]; 39: int read = 0; 40: while ( (read = src.read(buffer,0,1024)) != -1) { 41: writer.write(buffer, 0, read); // write clob. 42: } 43: src.close(); 44: writer.close(); 45: } 46: conn.commit(); 47: conn.setAutoCommit(true);
CLOB column에 데이터을 저장하였다면 commit()을 실행시키고
conn.setAutoCommit(true)로 다시 설정한다.
48: }finally{ 49: DBManager.close(rs,pstmt,conn); 50: } 51: }


Clob 불러오기

     ...
  1: public BoardTable getViewData(String tableName,int seq) throws Exception
  2: {
  3:   BoardTable bTable = new BoardTable();
  4:   String query = " select * from "+tableName+" where seq = ? ";
  5:   ResultSet rs = null;
  6:   PreparedStatement pstmt = null;
  7:   Connection conn = null;
  8:   try{
  9:     conn = DBManager.getConnection();
 10:     pstmt = conn.prepareStatement(query);
 11:     pstmt.setInt(1,seq);
 12:     rs = pstmt.executeQuery();
 13:     if (rs.next()) {
 14:       ...
 15:       ...      
 16:       StringBuffer output = new StringBuffer();
 17:       Reader input = rs.getCharacterStream("content");
 18:       char[] buffer = new char[1024];
 19:       int byteRead;
 20:       while((byteRead=input.read(buffer,0,1024))!=-1){
 21:         output.append(buffer,0,byteRead);
 22:       }
 23:       input.close();
 24:       bTable.setContent(output.toString()); 
CLOB 데이터를 불러오기 위해서는 위에서처럼
rs.getCharacterStream("content")로 불러서 StringBuffer에 담아야 한다.
25: ... 26: ... 27: } 28: } finally { 29: DBManager.close(rs,pstmt,conn); 30: } 31: return bTable; 32: }


================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================
Posted by 1010
02.Oracle/DataBase2009. 7. 29. 16:30
반응형
OTN Logo


Oracle SQL Developer 1.5: Feature List

게시일: 2008년 4월

이 문서는 Oracle SQL Developer 1.5의 전체 기능 목록을 제공합니다. (별도의 Oracle SQL Developer 1.5 신기능) 문서도 있습니다)

목록

  1. 개요
  2. 아키텍처
  3. 데이터베이스 커넥션
  4. 커넥션 네비게이터
  5. SQL 워크시트
  6. SQL 및 PL/SQL 편집
  7. 내보내기 및 들여오기
  8. 보고
  9. SQL*Plus 지원
  10. 타사 데이터베이스 지원
  11. 마이그레이션 워크벤치
  12. Oracle Application Express 3.0.1
  13. Preferences
  14. 버전 통제

1.  개요

다운로드 사이트 OTN
비용 무료
오라클 지원 데이터베이스 지원 계약 고객을 위한 메타링크를 통해 지원 가능
릴리스

최초 릴리스: SQL Developer 1.0 (2006년 3월)

  Release SQL Developer 1.1 (2006년 12월)
  Release SQL Developer 1.2 (2007년 6월)
  Release SQL Developer 1.2.1 (2007년 8월)
  Release SQL Developer 1.5 (2008년 4월)

2.  아키텍처 및 일반 구조

아키텍처 Java IDE
  커넥션 네비게이터
  다중 접속
  DB 지원 (non-Oracle)
  Microsoft SQL Server, Microsoft Access, MySQL 및 Sybase를 위한 읽기 전용 지원
글로벌화 변환 UI (1.5.1에서 9개국 언어 번환 기능 지원 예정)
  아시아 / 멀티 바이트
  서유럽
GUI 현대식 IDE 인프라
  온라인 지원
  HTML
  단축 키
설치 (Release 1.5) 풋프린트 (38.4MB)
  Dependencies JRE (27MB)
  전체 다운로드 크기 (77 MB)
  Oracle Home 불필요
플랫폼 지원 Windows (with Windows Installer )
  Linux (with RPM install)
  Mac OS/X
데이터베이스객체 스키마 및 객체 유형 전반을 검색
  DB 객체 검색 및 확장 검색 다이얼로그. 파라미터, 선언 및 사용법 같은 코드의 객체 검색 가능.
고급 필터링 확장 필터링:
  - 다양한 필터 옵션 및 기준
  - AND or OR 필터링 구현 (All or Any 선택)
  - 기타 사용자 필터링은 가시적 객체를 갖고 있지 않는 사용자를 걸러 내기 위한 OBJECT_COUNT 포함
엔진 검색 Ask Tom
  Oracle doc
  Search Doc 10.2
  Search Doc 9.2
  Search Forums
  Search Google
  Search 메타링크
메뉴

외부 툴 지원

  DDL 및 데이터 내보내기
  데이터베이스 객체 검색
  쿼리 빌더
확장자

SQL Developer는 확장성 있는 IDE 기반으로 구현됨
  - Build 완전한 Java 확장자 구현
  - XML을 위한 확장 후크 사용

커넥션 네비게이터 데이터베이스 기록 관리 실행 (SYS 혹은 SYSTEM 등 모든 권한 접속에 대한 컨텍스트 메뉴를 마우스 오른쪽 클릭)
  데이터베이스 기록 관리 실행 (SYS로)하여 데이터베이스 종료 및 재시작
  스키마의 모든 객체를 위한 DB Doc 생성 (커넥션에 대한 컨텍스트 메뉴를 마우스 오른쪽 클릭). 브라우저에 생성된 index.html 파일을 열고 객체 점검.
스키마 복사

하나의 스키마 컨텐츠를 다른 스키마로 복사

  객체를 드롭, 절단 혹은 복사
  실행할 액션 보고 사전 점검
  결과 보고 로깅
Schema Diff

2 스키마 사이의 SQL Difference 구문을 비교, 생성

  객체 선택 후 비교
  비교 객체 보고
  차이 및 실행할 SQL 코드 목록화
  스크립트 아웃풋을 선택 커넥션에 실행할 SQL 워크시트에 실행

3.  데이터베이스 커넥션

커넥션 커넥션 생성, 저장, 업데이트 및 명칭 변경
  기본 Thin JDBC
  사용자 정의 JDBC URL
  TNS 커넥션
  Connection Manager를 통한 커넥션
  암호화된 비밀번호
  LDAP 커넥션
  외부 인증
  프록시 커넥션
  비밀번호 만료 시, 새로운 접속을 하도록 사용자 프롬프팅
타사 접근

읽기 전용 접속으로 객체 및 데이터 검색:
  - MySQL
  - SQL Server
  - MS Access
  - Sybase

TimesTen TimesTen 지원 통합

4.  커넥션 네비게이터

객체 검색 칼럼 헤딩을 통한 분류 허용
 

DDL 뷰

  종속성, 상세 정보, 통계 등 객체 정의 뷰
테이블

생성
  -표준 테이블
  -파티셔닝
  -인덱스 정렬
  -Global Temporary External
  -테이블 간편 생성
  -고급 생성
  -PK 트리거 및 시퀀스 생성
  -Lob 파라미터

 

수정
  -테이블 복사
  -칼럼 정상화
  -조건 생성, 활성화 및 활성 해제
  -관련 FK 조건 활성화 및 활성 해제

 

테이블 데이터
  -테이블 데이터 그리드 편집
  -열 복제
  -데이터 분류
  -SQL Where 절을 통한 필터링
  -단일 기록 뷰
  -열 카운트
  -내보내기
  -데이터 검색 (XMLType 칼럼)
  -CLOB 데이터 뷰

생성
  속성 뷰
  수정
  컴파일링 무효화
  업데이트 뷰의 데이터 업데이트
동의어

생성  
   - 객체 기반
   - 명칭 기반

  속성 뷰
  수정
시퀀스 생성
  속성 뷰
  수정
  컨텍스트 메뉴를 마우스 오른쪽 클릭해 시퀀스 변경
패키지, 절차, 기능 생성
  속성 뷰
  실행
  PL/SQL 아큐먼트 뷰
  컴파일 (개별 선택, All or Invalid)
  Debug로 컴파일
  "Create Body" 사양으로부터 디폴트 골조 실행
  파일 기반 PL/SQL 지원
  - pl/sql 파일 열기, 편집 및 저장
  - 데이터베이스 업데이트 위해 스키마에 pl/sql 파일 컴파일링
유형 생성
  속성 뷰
  실행
트리거 생성
  트리거 소스 편집
  수정
  마스터/디테일 포맷 트리거 탭. 디테일로 트리거 코드 표시
데이터베이스링크 생성
  속성 뷰
  수정
  테스트
인덱스

생성
  -Non-unique
  -Unique
  -텍스트 인덱스
  -비트맵

  속성 뷰
도메인 인덱스 모든 접근 가능 스키마의 기존 인덱스 유형에 인덱스 생성
메시지 오류 디스플레이 업데이트로 오라클 오류에 대한 자세한 정보 표시
  컴파일링 관련, 상태 바에 성공 메시지 표시
디렉토리 속성 뷰
종합 뷰 생성
  속성 뷰
  실행
  고급 체크박스
  - 객체 등의 선택 항목을 선택하여 Select 구문을 선언적으로 정의
  - 인덱스 추가
  - 파티션 추가
  "New Index"를 사용하여 종합 뷰에 인덱스 추가
종합 뷰 로그 종합 뷰 로그 생성 및 편집을 위한 새로운 인터페이스
큐 및 큐 테이블 검색 및 뷰
Java 검색
  로딩
기타 사용자스키마 검색  
휴지통 비우기
  객체 드롭 취소
XML 스키마 생성
  속성 뷰
객체 네비게이터 통제 필터/찾기
  새로 표시
  그리드 데이터를 파일로 다운로드
사용자 승인 및 역할 등으로 사용자 생성
  사용자 역할, 승인 및 권한 편집
Schema Diff 소스 스키마 및 객체를 데스티네이션 스키마와 비교해 DDL 생성
  SQL을 SQL 워크시트로 전송
DBA 유틸리티 데이터 관리
 

데이터베이스 사용자 관리
  -사용자 생성
  -사용자 변경
  -사용자 드롭

 

DDL 생성
  -객체 기준 DDL
  -스키마 기준 DDL

Application Express 3.0.1 데이터베이스 스키마와 관련된 모든 Oracle APEX 애플리케이션에 접속 및 검색 (애플리케이션 및 페이지 레벨)
  컨텍스트 메뉴를 사용하여 Oracle APEX 애플리케이션 내보내기 및 들여오기

5.  SQL 워크시트

데이터 그리드 기록 버튼 복제
  한 번에 하나의 기록을 보기 위한 단일 기록 "피봇"
  SQL 워크시트에 칼럼 기록 및 이전 순서 취소 허용
  테이블 데이터 편집기의 날짜 필드용 캘린더 프롬프트
  그리드에 대한 컨텍스트 메뉴
  필터로 열 카운트
  데이터 그리드 검색
  칼럼 크기 자동 조정 (데이터 그리드 및 칼럼 헤더 컨텍스트 메뉴에서)
  그리드 이외 모든 곳에서 모든 선택 사항 복사 및 붙여 넣기
  선택 사항을 복사 Excel에 붙여 넣기
  Excel에서 선택 사항 복사해 데이터 그리드로 붙여 넣기
쿼리 빌더 기본 쿼리 생성
  쿼리 실행하여 데이터 테스트
  SQL을 SQL 워크시트로 전송
스닙펫 스닙펫을 SQL 워크시트로 드래그 앤 드롭
  스닙펫 관리
  - 새로운 캐터고리 생성
  - 새로운 스닙펫 생성
SQL 워크시트 구문 실행
  스크립트 실행
  워크시트 커넥션 변경
 

파일 지원
  - 검색
  - 커넥션 변경
  - 실행
  - 편집
  - 저장

  SQL 구문 포맷
  괄호 매칭
  ref 커저 출력 표시 지원
  BLOB, CLOB, xml, 커저 지원
  Code insight on
  - 테이블 별칭
  - 스키마
  - 부분 테이블 + ctrl +[space] (예정)
  - ctrl +[space] (예정)
  테이블 설명 (F4)
  탭 명 개선: 워크시트 명을 'MyTab Name' 으로 설정
  SQL*Plus 지원 (아래 목록 참조)
  장기 실행 스크립트 일시 정지
  일시 정지 스크립트 재개
  rownum을 선택해 전체 열 선택
  SQL 워크시트의 X쿼리
  SQL 이력
  DBMS 아웃풋
  OWA 아웃풋
  변수 결합
  옵션 실행
  모드를 preference로 자동 실행 (디폴트로는 활성화 안됨)
  코드 포맷
  파일로 내보내기
  쿼리 취소
  Code Insight 개선. 다양한 객체 유형을 위한 코드 완성 기능 사용 가능
  SQL Formatting 대체. 여백, 탭, 코마 적용, 활자 케이스, 신규 라인 등을 통제하는 SQL Formatter preferences 참조.
  자주 사용하는 코드를 위한 코드 템플릿. Preferences에서 이들을 생성한 후, 키 조작을 통해, 코드 편집기 및 SQL 워크시트에서 코드 템플릿 들여오기. ctrl+shift+T)
  코드 템플릿 공유 가능: /Application Data/Sql Developer/CodeTemplate.xml
  플래시백. 10g 및 11g에서, 데이터 플래시백 가능. 테이블 플래시백 참조.
  활자 케이스 변화를 위한 키 조작. (컨텍스트 메뉴에서도 가능.) 조작 키는 ctrl-quote
  Refactor 코드, SQL 워크시트 혹은 코드 편집기의 컨텍스트 메뉴 참조
  장기 실행 쿼리 커넥션을 위한 별도의 공유 워크시트. 조작 키는 ctrl+shift+N. 이는 별도의 공유 워크시트를 생성. 공유 워크시트는 다음과 같이 표시: HR_ _1
  SQL History는 스크립트 실행 혹은 구문 실행을 위한 F5 및 F9 키 조작으로 커맨드 저장. @filename을 실행하면, 파일의 모든 커맨드가 아니라, 이것이 History에 저장됨. ctrl-up 및 ctrl-down 키는 SQL 워크시트에서 이전에 실행된 커맨드를 추가하고 스크롤링.
  구문 삽입, 수정, 삭제, 병합 및 선택을 위해 네비게이터에서 워크시트로 드래그 앤 드롭. Preference 설정.
 

테이블의 데이터 그리드가 Sort 보존.

  데이터 그리드 필터가 이전 필터 옵션의 드롭 목록을 보존
튜닝 Autotrace 지원
  Explain plan 지원
  *.trc 파일을 SQL Developer에서 열어 포맷된 추적 파일 생성

6. SQL 및 PL/SQL 편집

편집 OS 파일 북마크
  PL/SQL DB 객체 북마크
  코드 폴딩
  코드 포맷
  Code Insight (코드 완성)
  코드 스닙펫 뷰어
  편집기로 객체 드래깅
  파일 운영 (저장, 열기)
  인라인 컴파일링 오류
  표준 편집기 운영
  Leading Remarks로 파일 열기 지원
  구문 하이라이팅
PL/SQL 디버거 열 형식 검사
  구분점 설정
튜닝 계층적 프로파일러(Oracle 11g R1 이상의 커넥션용)

7. 내보내기 및 들여오기

데이터 들여오기 SQL Developer를 사용하여 스프레드시트 (XLS 포맷) 데이터를  테이블로 들여오기
  xls 스프레드시트의 테이블 들여오기 생성
  CSV로부터 들여오기
데이터 내보내기 한 번에 한 개 이상의 테이블 내보내기 (with or without DDL)
  다음으로 내보내기  
  -CSV
  - XML
  - Text
  - HTML
  - XLS
  - SQL 삽입 구문
  - SQL*Loader Syntax
DDL 내보내기 Export DDL 내보내기는 드롭 객체 포함을 허용
  다중 테이블을 위한 데이터 구문 삽입
  스키마 명칭 공표 금지 옵션
  한 번 클릭으로 전체 스키마 내보내기
  컨텍스트 메뉴에서 파일, 워크시트 혹은 클립보드로 내보내기

8.  리포팅

리포팅 제공 마스터/상세 보고를 통한 데이터베이스 세션 검색
  전체 보고서 내보내기
  모든 보고서 들여오기
  마우스 오른쪽 클릭 기능 강화
  세션 종료
  SQL 리포팅
  추적 세션
  보고서 결과를 텍스트, CSV, XLS, XML, HTML, INSERT, Loader로 내보내기
  ASH 및 AWR 보고서 (Oracle 11g R1 이상의 커넥션 및  Oracle Diagnostic pack 라이센스 사용자용)
사용자 정의 보고 차트화 (테이블에서 그룹, 시리즈, 데이터 선택)
  선적 보고서 복사해 사용자 정의 보고로 붙여 넣기
  차트 보고서 생성 및 실행
  마스터 상세 보고 생성 및 실행
  스크립트 사용한 보고서 생성
  Create a report with plsql-dbms_output
예를 들면,  begin dbms_output.put_line('<h1>hello</h1>'); end;로 보고서 생성
  포맷 코드 (예를 들면, select text from user_source where rownum < 100)으로 보고서 생성
  게이지로 보고서 생성
  보고서 Id를 사용해 사용자 정의 보고서를 클릭
  변수 결합을 위한 프롬프트 정의
  드릴다운 링크
  사용자 정의 보고서 생성, SQL 입력 위한 파일 검색 및 제출 허용
  사용자 정의 보고서 들여보기 및 내보내기
  사용자 정의 보고서 공유
  1.0에 생성된 사용자 정의 보고서 열기
Oracle Application Express Report 워크스페이스, 애플리케이션, 페이지 및 스키마 검색 지원
기타 보고서 메인 툴 메뉴의 세션 모니터링 보고서
  네비게이터의 커넥션 컨텍스트 메뉴의 데이터베이스 관리 보고서
마이그레이션 보고서 타사 데이터베이스 마이그레이션 지원을 위한 일련의 보고서

9. SQL*Plus 지원

모든 SQL 및 PL/SQL 커맨드는 SQL 워크시트에서 직접 Oracle Database로 넘겨져 지원됩니다. SQL Developer에서 사용되는 SQL*Plus 커맨드는 데이터베이스로 넘겨지기 전에 SQL 워크시트에 의해 해석되어야 됩니다.

SQL 워크시트는 현재 수 많은 SQL*Plus 커맨드를 지원합니다. SQL 워크시트에 의해 지원되지 않는 커맨드는 무시되어 Oracle Database로 넘겨지지 않습니다. Oracle SQL Developer SQL 워크시트에 의해 지원되는 SQL*Plus 커맨드는 아래 목록과 같습니다.

커맨드

참고

@


@@


acc[ept]


autotrace  
clear screen  

conn[ect]

스크립트 실행 컨텍스트에서만 유효. CONNECT 뒤의 스크립트로 되어 있는 커맨드는 대체 스키마에서 운영되지만 스크립트 완성 후에는 , SQL 워크시트가 선택된 커넥션의 컨텍스트 내부에 남게 됩니다.

def[ine]


desc[ribe]


doc[ument]


echo  
errors  
esc[ape]  

exec[ute]


exit

실행 중단 및 콤보 상자의 커넥션 원상 회복

feed[back]  
ho[st]  
pau[se]  

pro[mpt]


print  

quit

실행 중단 및 콤보 상자의 커넥션 원상 회복

rem[ark]


sta[rt]


term[out]  
timi[ng]  

undef[ine]


user  
var[iable]  
ver[ify]  

whenever


xquery  

10.  타사 데이터베이스 지원

타사 검색 Microsoft Access
  Microsoft SQL Server
  MySQL Database
  Sybase Adaptive Server
마이그레이션 서비스 Microsoft SQL Server에서 Oracle로
  Microsoft Access에서 Oracle로
  MySQL에서 Oracle로
  T-SQL을 PL/SQL로 변환
  Access를 PL/SQL로 변환
  Sybase Adaptive Server to Oracle

11. 마이그레이션 워크벤치

타사 데이터베이스 지원 Microsoft Access
  Microsoft SQL Server
  MySQL Database
  Sybase Adaptive Server
커넥션 타사 데이터베이스 검색
마이그레이션 옵션 Quick Migration Wizard는 최소 권한 마이그레이션 지원으로 DBA 권한 불필요
  단계적 마이그레이션으로 마이그레이션 프로세스의 모든 단계 통제.
  정밀 마이그레이션 지원으로 마이그레이션을 위한 특정 객체 선택 가능.
  복잡한 객체 마이그레이션은 저장된 절차, 트리거 및 뷰 지원.
변환 변환 스크래치 편집기는 단일 구문 마이그레이션 지원
  Translation Difference Viewer는 구문 및 블록 매칭을 통해 일대일 비교 제공.

12.  Oracle Application Express (APEX) 지원

커넥션 네비게이터 데이터베이스 커넥션 Oracle APEX 데이터베이스 스키마 생성
  애플리케이션 및 페이지 레벨에서 데이터베이스 스키마와 관련된 모든 Oracle APEX 애플리케이션 검색
  컨텍스트 메뉴를 사용하여 Oracle APEX 애플리케이션 내보내기 및 들여오기
리포팅 워크스페이스
  애플리케이션
  페이지
  스키마

13.  Preferences

데이터베이스 Autotrace
  NLS
  타사 JDBC Driver
환경 워크시트
  Object Viewer
  연결된 SQL 워크시트 열기
  Auto-freeze/pin 탭
  5000 이상의 Fetch 사이즈 허용
  SQL Array Fetch 사이즈
코드 편집기 북마크
  Insight
  라인 거터
  디스플레이 설정
PL/SQL 디버거 PL/SQL 디버깅을 위해 프로브 디버거 사용
  구분점 속성
  Watches
  Inspector
사용자 정의 확장 사용자 정의 보고서 공유
  새로운 컨텍스트 메뉴 추가
  새로운 탭 생성

14.  버전 통제

버전 통제 CVS 및 서브버전과로 통합
 

버저닝 네비게이터

  서브버전 레포지터리 생성
  파일 검사 및 실행
  브랜치/태그
  비교 및 병합
  충돌 해결
파일

파일 시스템 파일 검색을 위한 파일 네비게이터

  파일 이력 뷰
Posted by 1010
02.Oracle/DataBase2009. 7. 29. 13:53
반응형

oracle 공백 제거

홍 길 동  -> 홍길동

홍   길동 -> 홍길동

SELECT RTRIM(REPLACE(필드명' ','')) FROM 테이블명;

Posted by 1010
02.Oracle/DataBase2009. 7. 14. 10:22
반응형
출처: http://www.devpia.com/DevStudy/Lecture/OffLineDetail.aspx?nSemiID=1431&lectype=evt

데브피아에 DB 튜닝관련 컬럼 연재가 2회차가 올라왔습니다. ^^

 지난회에는 인덱스를 생성했으나 컬럼의 가공, 내부적 변형, null과의 비교, 부정형 조건등으로 인하여 인덱스를 사용하지 못하는 경우를 보았다.
그럼 과연 인덱스를 타기만 하면 무조건 빠를까?
불행하게도 그렇지 않다. 대부분의 경우는 빠르겠지만 경우에 따라서는 인덱스를 타기 때문에 느려지는 경우가 많이 발생한다.

EMPLOYEE에 성별 컬럼을 추가하고 절반정도 되게 남성과 여성을아래와 같은 분포도로 넣었다.

SELECT GENDER , COUNT(*) CNT, ROUND(COUNT(*) / 15132,3)*100 RATIO FROM EMPLOYEES
GROUP BY GENDER;

G
----
F
M
CNT
--------
7590
7542
RATIO
---------
50.2
49.8
 
그리고 아래와 같은 INDEX를 생성하였다.
CREATE INDEX IDX_GENDER ON EMPLOYEES(GENDER);
그러면 이제 2개의 SQL의 수행 결과를 보자.
첫번째 경우는 INDEX를 탄경우다.
아래와 같이 HINT를 주어서 OPTIMIZER의 PLAN을 고정하였다.
/*+ INDEX(E IDX_GENDER) */ 는 E라는 별명의 테이블에 IDX_GENDER이라는 INDEX를 이용하여 테이블에 데이터를 가져오라는 뜻이다.
SELECT /*+ INDEX( E IDX_GENDER) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE GENDER = 'M'
GROUP BY GENDER

Call
----------
Parse
Execute
Fetch
----------
Total

Count
----------
1
1
2
----------
4
CPU Time
----------
0.000
0.000
0.030
----------
0.030
Elapsed Time
-------------
0.000
0.000
0.026
-------------
0.026
Disk
----------
0
0
0
----------
0
Query
----------
0
0
127
----------
127
Current
----------
0
0
0
----------
0
Rows
----------
0
0
1
----------
1
Misses in library cache during parse: 0
Optimizer goal: RULE
Parsing user: SCOTT (ID=54)

Rows
----------
0
1
7542
7542
Row Source Operation
---------------------------------------------------
STATEMENT
SORT GROUP BY NOSORT (cr=127 pr=0 pw=0 time=25567 us)
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=127 pr=0 pw=0 time=15176 us)
INDEX RANGE SCAN IDX_GENDER (cr=16 pr=0 pw=0 time=61 us)OF IDX_GENDER (NONUNIQUE)
두번째 경우는 INDEX를 타지 않은 경우다.
아래와 같이 HINT를 주어서 OPTIMIZER의 PLAN을 고정하였다.
/*+ FULL(E) */ 는 E라는 별명의 테이블을 할 때 테이블 전체를 다 읽어서 처리(FULL TABLE SCAN)하라는 뜻이다.
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE GENDER = 'M'
GROUP BY GENDER

Call
----------
Parse
Execute
Fetch
----------
Total

Count
----------
1
1
2
----------
4
CPU Time
----------
0.000
0.000
0.010
----------
0.010
Elapsed Time
-------------
0.000
0.000
0.014
-------------
0.015
Disk
----------
0
0
0
----------
0
Query
----------
0
0
115
----------
115
Current
----------
0
0
0
----------
0
Rows
----------
0
0
1
----------
1
Misses in library cache during parse: 0
Optimizer goal: RULE
Parsing user: SCOTT (ID=54)

Rows
----------
0
1
7542
Row Source Operation
---------------------------------------------------
STATEMENT
SORT GROUP BY NOSORT (cr=115 pr=0 pw=0 time=14410 us)
TABLE ACCESS FULL EMPLOYEES (cr=115 pr=0 pw=0 time=181 us)
인덱스를 탄 경우는 0.03초가 걸렸고 인덱스를 타지 않은경우는 0.01초가 걸렸다.
인덱스를 타서 3배나 더 느려졌다!. 이것이 가능한가? 그러면 왜 인덱스를 탔는데도 시간이 더 걸리는 것인가?
이유는 Disk io에 있다. 일반적으로 Full table scan을 할때는 한번에 1개의 block씩 i/o를 하지 않고 muti block를 한번에 요구한다. 그 이유는 읽을 양이 많다고 미리 가정하기 때문이다. 따라서 Oracle의 경우 db_file_multiblock_read_count라는 파라미터가 있고 일반적으로 8또는 16을 설정한다. 만약 16이라면 한번 I/O에 16개의 BLOCK을 읽어오게 되는것이다.
따라서 EMPLOYEE 115BLOCK을 한번에 16개씩 읽으면 약 8번의 IO 요청으로 완료가 된다.
그러나 Index를 사용할 경우 index를 사용하면 기본적으로 대량의 io가 발생할 것이라고 가정하지 않기 때문에 1개의 block씩 i/o를 하게 된다.
따라서 16개의 index block과 115개의 block의 물리적 i/o가 발생한다 16+115를 하면 총 131번의 물리적 io가 발생하게 되는것이다. 논리적으로는 인덱스 1개보고 테이블 1개 블락을 읽고를 7542번+1번을 하게되는 것이다. 마지막 1번은 다음에 더 이상 ‘M’이 없는지 확인하기위해서 1번 더 읽는다. 어째든 인덱스를 사용되는 것이 더욱 느리다는 것이다. 현지 EMPLOYEES 테이블은 15132건이다. 만약 이 데이터가 많아진다면 차이는 점점 더 많이 날것이다.

그러면 어느정도은 INDEX를 타고 어느 정도는 Full Table Scan이 오히려 더 좋은가?
시스템의 성능또는 데이터의 양에 따라 차이가 조금씩있으나 일반적인 기준은 있다.
아래 TYPE이라는 컬럼에 A-F까지 값을 가지고 있으며 가각 49.8%부터 0.9%까지의 분포를 가지는 값들을 가지고 있다.
SELECT TYPE , COUNT(*) CNT, ROUND(COUNT(*) / 15132,3)*100 RATIO FROM EMPLOYEES
GROUP BY TYPE;

T
--------
A
B
C
D
E
F
CNT
--------
7542
4533
1515
799
603
140
RATIO
---------
49.8
30
10
5.3
4
0.9
아래는 예제로 사용되었던 SQL과 그에 따른 응답시간을 비교한 표이다.

FTS(Full Table Scan) SQL
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
GROUP BY GENDER;

Rows
--------
0
1
140
Row Source Operation
---------------------------------------------------
STATEMENT
1 HASH GROUP BY (cr=115 pr=0 pw=0 time=6925 us)
140 TABLE ACCESS FULL EMPLOYEES (cr=115 pr=0 pw=0 time=10323 us)
INDEX(Index Scan) SQL
SELECT /*+ INDEX(E IDX_TYPE) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
GROUP BY GENDER;

Rows
--------
0
1
140
140
Row Source Operation
---------------------------------------------------
STATEMENT
HASH GROUP BY (cr=87 pr=0 pw=0 time=3227 us) 140
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=87 pr=0 pw=0 time=2956 us)
INDEX RANGE SCAN IDX_TYPE (cr=2 pr=0 pw=0 time=539 us)OF IDX_TYPE (NONUNIQUE)
 
결과를 보자 약 15132건의 테이블을 ACCESS하는데 10%이상이 되는 경우는 FTS이 더빠르고 10%이하인 경우는 INDEX를 타는 경우가 더 빠르다.
10% 미만일때는 INDEX를 타고 10%가 넘으면 인덱스를 안타게 할수 있는가?
결론적으로 가능하다.
아래 SQL을 보자 2개의 SQL을 UNION ALL로 결합하고 비교조건을(굵은색)을 줌으로서 논리적 비교를 통해서 실제로 FTS의 조건은 타지 않고 INDEX쪽만 수행하도록 하였다.
아래 수행결과를 보면 INDEX를 타는 곳에서만 ROWS가 나온 것을 알수있다.
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
   AND TYPE IN ( 'A','B','C')
GROUP BY GENDER
UNION ALL
SELECT /*+ INDEX(E IDX_TYPE) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
   AND TYPE IN ( 'D','E','F')
GROUP BY GENDER;

Rows
--------
0
1
0
0
0
1
140
140
Row Source Operation
---------------------------------------------------
STATEMENT
UNION-ALL (cr=87 pr=0 pw=0 time=2743 us)
HASH GROUP BY (cr=0 pr=0 pw=0 time=235 us)
FILTER (cr=0 pr=0 pw=0 time=8 us)
TABLE ACCESS FULL EMPLOYEES (cr=0 pr=0 pw=0 time=0 us)
HASH GROUP BY (cr=87 pr=0 pw=0 time=2477 us)
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=87 pr=0 pw=0 time=2328 us)
INDEX RANGE SCAN IDX_TYPE (cr=2 pr=0 pw=0 time=205 us)OF IDX_TYPE (NONUNIQUE)
그렇나 이렇게 프로그램을 한다면 프로그램이 힘들어 질것이다. 따라서 현재 Optimizer들은 실제 값에 따라서 FTS이 유리한지 아니면 INDEX SCAN이 유지한지 값을 보고 PLAN이 바뀌도록 되어있다. 물론 이를 위해서는 컬럼에 대한 분포도 정보를 DB가 가지고 있어야 한다. 이는 ANALYZER를 통해서 DB가 취득하게 된다.

그럼 이제 간단하다 10%이상에 데이터를 INDEX를 타면 속도가 오히려 느려지므로 10%이하의 데이터를 찾고자 할 때만 INDEX를 생성하면 간단하게 해결될것이다!
그러나 과연 그럴까?
INDEX를 생성하면 일반적으로 SELECT의 속도는 향상을 보지만 반대로 INSERT,UPDATE,DELETE는 저하되게 된다.
위에 도표를 보면 INDEX의 숫자가 증가함에 따라서 속도가 느려지는 것을 알수 있다. 즉, 인덱스의 생성으로 SELECT는 빨라질수도 있고 느려질수도 있다. 그러나 DML(INSERT,UPDATE,DELETE)는 항상 느려진다. 따라서 INDEX를 무작정 다는 것은 DML 성능을 느리게 한다.
그럼 어떤 기준으로 인덱스를 생성할지 말지를 결정할 것인가?
아래 2가지 시간을 고령하자.
이익시간 = INDEX생성으로 빨라진시간 * 수행 QUERY수
비용시간 = INDEX생성으로 느려진 INSERT시간 * INSERT수행횟수
                + INDEX생성으로 느려진 UPDATE시간 * UPDATE수행횟수
                + INDEX생성으로 느려진 DELETE시간 * DELETE수행횟수

이익시간이 비용시간 보다 크다면 인덱스를 생성하는 것이 좋을 것이다. 반대로 이익시간 < 비용시간 보다 작다면 인덱스를 만드는 것이 손해보는 경우다.
이런 경우라면 인덱스를 만들면 안되는 것이 유리하다 할수 있다. 그러나 반드시 그런 것은 아니다. 그것은 수행 시간을 고려해야한다. 낮에일반적으로 QUERY가 빠르게 수행되고 주로 밤에 BATCH에서 DML이 수행되고 있다고 가정할 때 DML이 더 느려지는 것이 그렇게 문제가 되지 않는다면 INDEX를 생성할 수도 있는것이다. 어디까지나 Application 사용의 관점에서 효율적인 것을 찾는 것이 중요하다.
인덱스를 사용하여 손해보는 경우는 아래와 같다.

  • 같은 값이 많은 컬럼
    • INDEX를 타면 10%이상 선택하는 경우
    • 예) 남녀성별등..
  • 조회보다 DML의 부담이 큰 경우
    • 이익시간 < 비용시간 경우
    • 그러나 이때도 사용환경을 고려하여 인덱스를 생성할 수 있다.
  • 데이터가 적은 테이블
    • 일반적으로 db_file_multiblock_read_count보다 적은 수의 BLOCK을 가진테이블은 INDEX를 타지 않는 것이 빠르다.
    • 그러나 integrity를 위해서 PK와 FK는 달아야 한다.

이번 회에는 INDEX를 타서 오히려 손해를 보는 경우와 그를 방지하는 방법을 보았다.
인덱스를 생성한다고 인덱스를 반드시 타는 것도 아니며 또한 인덱스를 탄다고 반드시 빠른 것도 아니다. 따라서 INDEX의 생성과사용 전략은 그렇게 쉬운 문제가 아니다. 빠른 시스템을 위해서는 고려할 점이 많다는 것이다. 물론 필자가 다룬 것은 테이블중에 일반테이블과 일반 INDEX에 대해서만 다루었기때문에 PARTITION이나 BITMAP같은 다른 구조의 인덱스에서는 다른 특성을 가진다. 그러나 이러한 것은 대용량이나 DW의 특수한 용도에 사용되므로 대부분의 경우에는 고려하지 않아도 크게 문제되지 않을 것이다.

못조록 필자의 글이 독자들에게 도움이되는 길이기를 바라면서 이글을 마무리하고자 한다.
마지막으로 당부 드리고 싶은 말은 SQL을 작성하시고 항상 PLAN을 확인하시기 바랍니다.
PLAN에 익숙해지고 OPTIMIZER를 이해할 때 비로소 OPTIMIZER가 여러분의 심부름꾼이 될수 있기때문이다.


Posted by 1010
02.Oracle/DataBase2009. 7. 14. 10:21
반응형
출처: http://www.devpia.com/DevStudy/Lecture/OffLineDetail.aspx?nSemiID=1429&lectype=evt

데브피아에 DB 튜닝관련 컬럼 연재가 올라왔네요. 내용이 괜찮아서 퍼왔습니다.

  필자가 처음에 SQL을 배울 때 SQL이 상당히 이상했다. 원하는 것만 요구할 뿐 어떻게 가져오라는 정보가 SQL에는 없었기 때문이다. FILE레벨의 I/O까지 코딩에 익숙한 필자에게 절차가 없다는 것이 오희려 더 이상했던 것이다.
물론 상세한 과정이 필요하지 않으므로 편리하고 좋았다 그러나 어떻게 가져오는지는 알지못하고 단지 사용할 뿐이었다.
그러나 SQL이 PLAN이라는 실행 계획을 만들고 그에 따라 가져오게 된다는 사실은 안것은 한참 뒤에 일이었다.
결국은 내가 하지않은 일을 Optimizer라는 프로그램이 대신 해주고 있는 것이 아닌가? 그래서 정말 고마운 놈이라고 생각했었다. 그러나 밑는 도끼에 발등을 찍힌다는 말이 있지 않은가?
Plan에 index를 달아주어도 Index를 사용하지 않고 full table scan만 하고 있으니 당체 속도가 나지를 않았다.
이래저래 해서 나중에 알게되었지만 결국 컬럼의 변형을 가하면 index를 사용하지 못한다는 것이다. 우리가 직접 사용하지는 않지만 결국 우리가 SQL을 사용한다는 것은 Optimizer라는 놈에게 SQL의 수행을 부탁하는 것이다. 따라서 우리가 Optimizer에 대해서 잘 안다면 SQL을 좀더 효율적으로 수행하도록 할 수 있지 않은가!
그러면 인덱스를 달았을 때 Optimizer가 index를 사용하지 못하는 경우를 통해서 우리가 애써(?)생성한 인덱시가 무용지물이 되지 않도록 해보자.
아래예제에 사용할 TABLE LAYOUT이다.
EMPLOYEES
---------
Rows=15,132
Empty Blocks=7
Chain Count=0
Avg Space Freelist Blocks=0
Sample Size=15,132
Partitioned=NO

Blocks=121
Avg Space=885
Avg Row Length=51
Freelist Blocks=0
Last Analyze=2009/05/04
Column Name
---------------
EMP_ID
MGR_ID
LAST_NAME
FIRST_NAME
HIREDATE
JOB
SALARY

Nullable
-----------------


NOT NULL
Column Type
-----------------
VARCHAR2(40)
VARCHAR2(40)
VARCHAR2(24)
VARCHAR2(14)
DATE
VARCHAR2(24)
NUMBER(7,2)
Distinct
-----------------
15,132
679
9,443
3,579
3,903
53
3,267
Buckets
------------------
75
75
75
75
75
53
75
INDEX
--------------------------------------------------------------------------------------
IDX_GENDER : GENDER
      Type=NORMAL, Uniq=No, Distinct=2, Rows=15,132, Last Analyze=2009/05/04
IDX_HIREDAT : HIREDATE
      Type=NORMAL, Uniq=No, Distinct=3,903, Rows=15,132, Last Analyze=2009/05/04
IDX_JOB : JOB
      Type=NORMAL, Uniq=No, Distinct=53, Rows=15,129, Last Analyze=2009/05/04
IDX_SALARY : SALARY
      Type=NORMAL, Uniq=No, Distinct=3,267, Rows=15,132, Last Analyze=2009/05/04
IDX_TYPE2 : TYPE
      Type=NORMAL, Uniq=No, Distinct=6, Rows=15,132, Last Analyze=2009/05/04
PK_EMP_ID : EMP_ID
      Type=NORMAL, Uniq=No, Distinct=15,132, Rows=15,132, Last Analyze=2009/05/04
필자가 여러군데 튜닝을 하면서 가장 많이 본것중에 하나는 INDEX를 달았으나 쓰지 못하게 되는 경우이다. 대표적인 경우가 아래와 같이 날짜타입(HIREDATE)에 TO_CHAR를 씌운 경우이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE TO_CHAR(HIREDATE,'YYYYMMDD') = '19980518';
물론 INDEX는 아래와 같이 생성되어있다.
CREATE INDEX IDX_HIREDATE ON EMPLOYEES(HIREDATE);
우리가 원하는 것은 INDEX를 타고 테이블을 가져오기를 바란것이었다.

그러나 실제 PLAN은 아래와 같이 나온다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=28 Card=151 Bytes=3K)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=28 Card=151 Bytes=3K)
TABLE ACCESS (FULL) 이란 뜻은 INDEX를 타지 않고 테이블을 처음부터 끝까지 읽어서 찾는다는 뜻이다. 한마디로 10건이며 10건읽고 100만건이면 100만건을 다 읽어야 결과가 나온다는 말이다.

OPEN시에는 빠르던 시스템이 시간이 지날수록 느려지는 결정적인 역할을 하는 것이 바로 위와 같은 경우이다. 그럼 어떻게 해야 제대로 인덱스를 사용할 수 있을가?
일단 간단히 SQL의 수정으로 해결할수 있다. HIREDATE는 날짜 타입이다.
따라서 인덱스를 HIREDATE로 했을 때 인덱스를 타기위해서는 INDEX를 생성한것에 변형을 주어서는 안된다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE HIREDATE = TO_DATE('19980518')
따라서 간단하게 위와 같이 고치면 INDEX를 사용하게된다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=4 Bytes=92)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=3 Card=4 Bytes=92)
2 1 INDEX (RANGE SCAN) OF 'IDX_HIREDATE' (INDEX) (Cost=1 Card=4)
물론 결과도 빠르게 나온다 그러나 중요한 점이 있다 결과가 같을까?
운이 좋으면 결과가 같을 것이고 대부분의 경우는 결과가 틀리다.
왜 그럴까?
날짜 타입은 날짜와 시분초의 정보도 가지고 있다. 따라서 TO_DATE(‘19980518’)라는 말은 정확히 1998년5월18일 0시0분0초라는 뜻이다. 그래서 우리가 원하는 1998년5월18일자와는 차이가 있다.
따라서 1998년5월18일 0시0분1초 ~ 23시59분59초까지의 데이터는 나오지 않게되는것이다.
이것은 튜닝할 때 유의할 점이다. 결과를 같게 유지해야하는것이다. 이 상황을 알고있다면 방법은 간단하다.
아래아 같이 고치면 빠른시간에 원하는 결과를 얻을 수 있을 것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE HIREDATE BETWEEN TO_DATE('19980518'||'00:00:00','YYYYMMDD HH24:MI:SS')
AND TO_DATE('19980518'||'23:59:59','YYYYMMDD HH24:MI:SS')
비슷하지만 함수의한 변형이 아닌 간단한 연산에의한 변형의 경우도 마찬가지이다.
$1000의 인센티브를 더주면 $10000이 넘는 사람을 찾는 SQL을 만들어보자.
아마 아래와 같을 것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE SALARY + 1000 > 100000;
물론 INDEX는 아래와 같이 만들었다.
CREATE INDEX IDX_SALARY ON EMPLOYEES(SALARY);
그러나 PLAN을 보자
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=757 Bytes=13K)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=757 Bytes=13K)
인데스를 타지 못한다. 왜일까. 간단한 연산이지만 SALARY컬럼에 가공을 했기 때문에 OPTIMIZER는 인덱스를 타는 것을 포기해버린다.
따라서 우리가 기초적인 수학 실력을 발휘해서 이항을 해준다면 아래와 같은 조건이 될것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE SALARY > 100000 - 1000;
이경우에 PLAN을 보자.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=17)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=3 Card=1 Bytes=17)
2 1 INDEX (RANGE SCAN) OF 'IDX_SALARY' (INDEX) (Cost=2 Card=1)
재미 있게도 이번에 제대로 된 인덱스를 탄다. Optimizer가 바보 같다는 생각이 들지 않는가?
물론 바보같다. 그러나 OPTIMIZER나름대로 깊은 고민이 있다. 아주 잛은 시간내에 OPTIMIZER는 많은 경우의 수를 타진해야한다. 따라서 이항연산과 같은 것 까지 검토하면 너무 많은 시간을 소모하게 된다 따라서 그런부분은 포기한것이다.

또다른 경우중에 하나가 DB의 내부적인 변형이다. 이는 개발자가 의도하지 않게 문제를 야기하는 경우이다.
여기 PK 조건으로 검색하는 SQL이 있다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE EMP_ID = 200383;
그러나 PLAN은 아래와 같이 나왔다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=1 Bytes=19)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=1 Bytes=19)
분명히 아래와 같은 INDEX를 생성하였다.
CREATE INDEX PK_EMP_ID ON EMPLOYEES(EMP_ID);
왜 인덱스를 안타는 것일까?
그 이유은 OPTIMIZER의 내부 변형 규칙에 있다.
일반적으로 비교를 하려면 두개의 데이터 형이 같아야 한다.
그런데 EMP_ID는 VARCHAR2(40)이다 그리고 비교하려는 것은 200383이라는 숫자이다.
따라서 숫자와 문자는 비교할수 없기 때문에 내부적으로 변형이 이루어진다.
문자보다 숫자가 우선순위가 높아서 문자와 숫자를 비교하게되면 문자쪽이 숫자로 변형되어 비교하게 되는 것이다.
따라서 위의 SQL은 OPTIMIZER는 아래와 같은 SQL로 수행하게된다.
EMP_ID를 TO_NUMBER(EMP_ID) = 2000393과 같이 처리하게 된다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE TO_NUMBER(EMP_ID) = 200383;
이는 처음 예제에서 날짜 컬럼에 TO_CHAR를 씌원것과 같은 효과이다. 따라서 이문제를 해결하기위해서는 반대쪽, 즉 2000293을 문자로 변환해주면 문자대 문자의 비교이므로 내부적 변형이 발생하지 않게된다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE EMP_ID = ‘200383’;
 
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=19)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=2 Card=1 Bytes=19)
2 1 INDEX (RANGE SCAN) OF 'PK_EMP_ID' (INDEX) (Cost=1 Card=1)
아래 SQL을 보자 JOB에 NULL인 조건을 검색하는 것이다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB IS NULL
아래 SQL을 보자 JOB이 NULL인 조건을 검색하는 것이다.
물론 아래와 같은 JOB INDEX를 생성하였다.
CREATE INDEX IDX_JOB ON EMPLOYEES (JOB);
아래 PLAN을 보자 왜 IDX_JOB INDEX를 타지 못하는가?
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=3 Bytes=63)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=3 Bytes=63)
이경우에는 Oracle의 경우 일반적으로 index를 생성할 때 null값은 index항목에 넣지 않는다. 따라서 null은 index에 없기 때문에 null조건을 준다면 그것은 index를 탈수 없다.
따라서 위와 같은 경우 반드시 index를 타려거든 job컬럼을 NOT NULL로 설정하고 NUL대신 특정값 (예를 들면 : ‘NOT ASSIGN’ ) 으로 설정하고 QUERY를 아래와 같이 수정한다면 인덱스를 탈수 있을 것이다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB = ‘NOT ASSIGN’;
아래 SQL를 하나 더 보자
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB NOT IN ( 'INSTRUCTOR','STAFF');
이번의 NULL을 비교한것도 아닌데 INDEX를 사용하지 못한다. 이것은 일반적인 INDEX가 =이나 <, > , BETWEEN조건에 만 인덱스를 탈수 있고 부정형으로 비교했을때는 인덱스를 탈수 없기때문이다.
생각해보자 어떤 것을 순서대로 정리해 놓았는데 그것이 아닌 것을 찾으려고 한다면 전체를 다 읽어봐야지만 아니것을 알수 있지 않은가?
따라서 가급적 프로그램 구성에서 부정형 조건이 들어가게 한다는 것은 성능을 저하시킬 가능성이 매우 높기 때문에 이런 조건이 되지 않도록 설계단설계부터 고려해야한다.

이상은 간단하게 INDEX를 주었을 때 일반적으로 INDEX를 타지 못하는 경우를 든것이다. 사실 위예 예처럼 실제 프로젝트에서 많은 부분이 INDEX를 생성하고도 OPTIMIZER의 특성을 몰라서 INDEX를 쓰지 못한채 APPLICATION이 돌고 있다. 이는 곧바로 자원의 과도 사용으로 나타나고 느린 응답시간으로 나타나게 된다. 항상 시스템을 OPEN하고 마음을 조리지 않으려면 내가 생성된 INDEX를 잘 탈수 있게 내가 SQL을 잘 작성했는지 검토해 보기 바란다.
아래 4개의 항목은 반드시 기억해 두기 바란다.
인덱스를 사용하지 못하는 경우는 아래와 같다.
  • 인덱스 컬럼에 변형이 일어난 경우
    • WHERE TO_CHAR(HIREDATE,'YYYYMMDD') = '19980518';
    • WHERE SALARY + 1000 > 100000;
  • 내부적인 변형이 일어난 경우
    • WHERE EMP_ID = 200383;
  • NULL을 비교하였을 경우
    • WHERE JOB IS NULL;
  • 부정형으로 조건을 기술한 경우
    • WHERE JOB NOT IN ( 'INSTRUCTOR','STAFF');

물론 이 경우 이외에 Optimizer의 판단에 따라서 인덱스를 사용하지 못하는 경우도 있다. 그러나 대부분의 경우에는 위에 항목을 만족한다면 원하는 index를 타는 효율적인 sql작성에 좋은 기준이 될것이다. 마지막으로 sql을 작성한후 반드시 plan을 확인해 보기 바란다.
실제 plan이 어떻게 되는냐를 확인해보지 않으면 무심코 과거의 실수를 답습할 수 있기때문이다

Posted by 1010
02.Oracle/DataBase2009. 7. 6. 17:46
반응형
 

Oracle10g 부터  CONNECT BY 절에서 제공하는

CONNECT_BY_ROOT, SYS_CONNECT_BY_PATH, CONNECT_BY_ISLEAF  기능에 대해서 알아보겠습니다.


CONNECT_BY_ROOT

 - 상관관계 쿼리에서 LEVEL이 0인 최상위 로우의 정보를 얻어 올 수 있습니다.
 
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   CONNECT_BY_ROOT  empno "Root empno", level
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY PRIOR empno=mgr;
 
ENAME                       EMPNO  Root empno    LEVEL
-------------------- ---------- ----------- ----------
KING                            7839           7839            1
    JONES                     7566           7839            2
        SCOTT                 7788           7839            3
            ADAMS            7876           7839            4
        FORD                   7902           7839            3
            SMITH              7369           7839            4
  
 

SYS_CONNECT_BY_PATH

 - 상관관계 쿼리에서 현재 로우 까지의 PATH 정보를 쉽게 얻어 올 수 있습니다.
 
SQL>COL path FORMAT A40
 
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   SYS_CONNECT_BY_PATH(ename, '/') "Path"
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY PRIOR empno=mgr;
 
 
 
ENAME                     EMPNO Path
-------------------- ---------- -------------------------------
KING                          7839       /KING
    JONES                   7566       /KING/JONES
        SCOTT               7788       /KING/JONES/SCOTT
            ADAMS          7876       /KING/JONES/SCOTT/ADAMS
        FORD                 7902       /KING/JONES/FORD
            SMITH            7369       /KING/JONES/FORD/SMITH
 
 

CONNECT_BY_ISLEAF

 - 상관관계 쿼리에서 로우의 최하위 레벨 여부를 반환 합니다.
 
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   CONNECT_BY_ISLEAF "leaf", level
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY NOCYCLE  PRIOR empno=mgr;
 
ENAME                     EMPNO     leaf      LEVEL
-------------------- ---------- ---------- ----------
KING                           7839          0          1
    JONES                    7566          0          2
        SCOTT                7788          0          3
            ADAMS           7876          1          4
        FORD                  7902          0          3
            SMITH             7369          1          4



출처 : http://cafe.naver.com/scorpionkim.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=610

Posted by 1010
02.Oracle/DataBase2009. 7. 6. 10:52
반응형
UPDATE book a1
SET ( name, date ) = ( SELECT name, date FROM a2 WHERE a1.bookid = a2.bookid )
WHERE a1.bookid IS NOT NULL
Posted by 1010
02.Oracle/DataBase2009. 7. 4. 14:28
반응형

디비는 SQL문의 응답을 빠른 시간안에 내야하죠...

대부분의 SQL문은 select입니다.
검색이 가장 빨라야 하는 거죠.

인덱스라고 하는 것은 검색시의 빠른 응답을 위해서 마련해 놓은 자료구조입니다.
정확히는 B+트리라는 자료구조를 이용하는데요.

테이블의 데이터들은 데이터파일내에 위치하게 되고, 이를 검색하기 위해서는 많은 수의 레코드들을 비교해야 합니다.
그래서 특정 필드들을 이용해서 B+트리를 구성해 놓는 것을 인덱스하고 보시면 되겠습니다.
자료구조에서 트리의 경우는 검색이 빠르다는 장점을 가지고 있죠.

결국 테이블의 데이터를 가지고 인덱스를 만들어서 검색속도를 향상시키는 것입니다.

대부분의 DB에서 기본적으로 primary key는 인덱스를 자동으로 생성하는 경우가 많습니다.

물론 이 인덱스의 종류는 다양합니다. 데이터의 종류나 성향에 따라서 검색속도를 향상시키는 몇가지의 방법이 존재하는 것이죠.

이 인덱스는 검색 쿼리문의 조건절에 명시된 조건절을 따르게 됩니다.
조건이 많은 경우는 디비내의 옵티마이져가 선택한 인덱스를 이용해서 검색을 하게 됩니다.(이는 디비마다의 알고리즘이 다릅니다.)
그래서 오라클의 경우는 옵티마이져가 정한 인덱스가 아닌, 개발자/DBA가 정한 인덱스를 타도록 지정하는 힌트라는 옵션도 있습니다.

결론적으로 인덱스는
1. 검색속도 향상을 위한 것이다.
2. 내부적으로 B+ 트리를 이용한다.
3. 데이터의 성향에 따라서 다양한 인덱스가 존재한다.
4. INSERT/UPDATE/DELETE시는 인덱스가 성능을 약화시킨다.
5. 인덱스가 다수 존재하는 경우 조건절에 따라서 타는 인덱스가 달라진다.

이정도의 특성이 있겠습니다.

[출처] 오라클 index|작성자 디오

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


CREATE [ UNIQUE | BITMAP ] INDEX index_name ON table_name(column_name)

[TABLESPACE tablespace_name];


UNIQUE : UNIQUE Index를 생성한다.

BITMAP : BITMAP Index를 생성한다.

index_name : 생성하고자 하는 인덱스 이름

table_name : 인덱스를 생성하고자 하는 테이블 이름

column_name : 인덱스로 생성하고자 하는 컬럼 이름

tablespace_name : 인덱스가 위치할(생성될) 테이블 스페이스 이름


예) CREATE INDEX idx_emp ON tb_emp (empno);

tb_emp 테이블에 empno 컬럼을 이용하여 idx_emp를 생성한다.


범례)

대문자 : Reserved Word

소문자 : User Define

[ ] : Option, 지정하지 않아도 되거나 생략시 기본 설정값으로 대체됨.

[출처] [오라클]인덱스 생성 [CREATE INDEX]|작성자 이지

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

-----INDEX

CREATE UNIQUE INDEX "I_ANSWER_ANS" ON "ANSWER"("ANS_CODE", "MEM_CODE", "QST_CODE", "CATE_CODE")
TABLESPACE SPACENAME
INITRANS 2
STORAGE (
  INITIAL 65536
  MINEXTENTS 1
  MAXEXTENTS UNLIMITED
);
-------------------------

SELECT /*+ INDEX_DESC(ANSWER I_ANSWER_ANS) */

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


결합인덱스의 생성지침


- 단 하나의 테이블에서 컬럼들을 참조해야 한다
- 최대 16개 컬럼을 생성할 수 있다
- 결합 인덱스의 전체 컬럼 길이는 db_block_size 파라미터의 값을 1/2을 초과하면 안된다.
- 결합 인덱스를 생성할 때는 선택도가 좋은 컬럼을 선행컬럼으로 결정해야한다(즉 앞에 둔다)
- 선행 컬럼을 결정하기 힘든 경우에는 자주 사용되는 컬럼을 선행 컬럼으로 결정한다.
- 결합인덱스의 수가 많으면 많을수록 데이터의 검색속도는 향상될 수 있으나 오히려
  DML문의 수행성능은 저하될 수 있다


index의 분석
-최초로 인덱스를 생성한 이후 테이블에 DML문이 자주 발생하게 되면 밸런스 구조는 깨지고
 좌,우의 구조도 달라지게 된다


 이러한 현상이 발생하면 좋은 성능을 보장해 줄 수 없기 때문에 데이터 베이스 관리자는
 주기적으로 또는 비 주기적으로 밸런싱이 깨진 인덱스를 분석하고 인덱스를 재구성하는 작업을
 해야만 성능을 기대할 수 있다. 인덱스의 각 블록에 저장되어 있는 인덱스 키의 개수가 블록
 마다 틀리게 되면 밸런싱이 깨지게 된다.


SQL> create table big_emp_cp
  2  as
  3  select * from big_emp;

테이블이 생성되었습니다.


SQL> create index i_big_emp_cp_empno
  2  on big_emp_cp(empno);

인덱스가 생성되었습니다.


*인덱스의 밸런싱 구조상태를 확인하는 방법-------------------

SQL> analyze index i_big_emp_cp_empno validate structure;

인덱스가 분석되었습니다.


SQL> select (del_lf_rows_len/ lf_rows_len) * 100 as "Balancing"
  2  from index_stats;

 Balancing
----------
         0   <--완벽한 밸런싱을 유지함


-------------------------------------------------------------
-밸런싱을 깨기위해 행 삭제

SQL> delete big_emp_cp
  2  where empno > 1 and empno < 3000;

2879 행이 삭제되었습니다.


SQL> analyze index i_big_emp_cp_empno validate structure;

인덱스가 분석되었습니다.


SQL> select (del_lf_rows_len/ lf_rows_len) * 100 as "Balancing"
  2  from index_stats;

 Balancing
----------
9.49721286 <--인덱스의 밸런스 정도가 9.49%정도 깨짐


*인덱스의 재구성


-일반적으로 인덱스 밸런싱이 20%정도를 초과하면 성능이 저하될 수 있다고 본다
 좋은 성능을 기대하기 위해서는 반드시 인덱스를 재구성해야 한다.


SQL> alter index i_big_emp_cp_empno rebuild nologging;

인덱스가 변경되었습니다.


SQL> analyze index i_big_emp_cp_empno validate structure;

인덱스가 분석되었습니다.


SQL>  select (del_lf_rows_len/ lf_rows_len) * 100 as "Balancing"
  2   from index_stats;


 Balancing
----------
         0

SQL>


* 불필요한 인덱스 제거


SQL> create index i_big_emp_cp_ename
  2  on big_emp_cp(ename);

인덱스가 생성되었습니다.


SQL> alter index i_big_emp_cp_ename monitoring usage;

인덱스가 변경되었습니다.


SQL> select index_name,used from v$object_usage;

INDEX_NAME                     USE
------------------------------ ---
I_BIG_EMP_CP_ENAME             NO

SQL> alter index i_big_emp_cp_ename nomonitoring usage;

인덱스가 변경되었습니다.

SQL> drop index i_big_emp_cp_ename;

인덱스가 삭제되었습니다.


* v$object_usage 자료사전의 컬럼에 대한 설명


index_name       : 인덱스명
table_name        : 관련 테이블명
monitoring          : 모니터링 기능 설정 여부(on/off)
used                 : 인덱스의 사용 여부
start_monitoring  : 모니터링 설정 시작 시간
end_monitoring   : 모니터링 해체 시간


SQL> desc v$object_usage;


 이름                                                           널?      유형
 -------------------------------------------------------------------------------------
 INDEX_NAME                                                     NOT NULL VARCHAR2(30)
 TABLE_NAME                                                     NOT NULL VARCHAR2(30)
 MONITORING                                                     VARCHAR2(3)
 USED                                                           VARCHAR2(3)
 START_MONITORING                                               VARCHAR2(19)
 END_MONITORING                                                 VARCHAR2(19)


* primary key에 의해 만들어지는 인덱스는 테이블이 위치하는 테이블스페이스와 분리한다.


SQL> create table empcp
  2  (empno number(3)
  3  ,ename varchar2(10)
  4  ,sal number
  5  ,constraint empcp_empno_pk primary key(empno) using index tablespace indx
  6  )tablespace users;

테이블이 생성되었습니다.


SQL> select index_name,index_type,tablespace_name
  2  from user_indexes
  3  where table_name = 'EMPCP';


INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME
------------------------------ --------------------------- ------------------------------
EMPCP_EMPNO_PK                 NORMAL                      INDX

Posted by 1010
02.Oracle/DataBase2009. 7. 4. 11:18
반응형

1.       oracle 다운로드 및 압축해제

2.       oracle 유저생성 및 권한부여

3.       pre-install RPM

4.       jdk 설치

5.       공유메모리 및 세마포 설정

6.       오라클 사용자 초기화 파일 구성

7.       오라클 셋업

8.       Database 시작과 종료 TIP & TECH

 

1. oracle 다운로드 및 압축해제

오라클을 설치하시려면 오라클 파일 혹은 시디가 있어야 겠죠

시디면 상관없지만 파일을 받아서 설치 할 경우 아래를 따라하세요

 

zcat ship_lnx_920_disk1.cpio.gz | cpio idmv

zcat ship_lnx_920_disk2.cpio.gz | cpio -idmv

zcat ship_lnx_920_disk3.cpio.gz | cpio -idmv

disk1, disk2, disk3이 생기고 생긴 파일들은 폴더를 하나 생성해서 이동시킨다

여기서는 /home/oracle로 이동

 

시디의 경우에는 바탕화면에 아이콘이 생성됩니다.

 

2. oracle 유저생성 및 권한부여

아래의 명령어로 oracle 유저생성 및 권한부여를 하셔야 됩니다

groupadd dba

useradd oracle g dba

chown R oracle.dba /home/oracle

chmod 777 / home

chmod 777 /home/oracle

 

3. pre-install RPM

 

오라클 설치시에 반드시 필요한 패키지들로 보통 레드햇 9.0을 기준으로

풀패키지 설치시 대부분 설치가 되어있습니다.

 

그러나 빨간 글씨의 패키지는 오라클 메타링크에서 다운을 받으셔야 되는데

메타링크 계정을 만드는 방법이 어렵습니다.

문의주시면 파일을 보내드릴께요

 

* Required OS Components

            - compat-db-4.1.25-9

            - compat-gcc-32-3.2.3-47.3

            - compat-gcc-32-c++-3.2.3-47.3

            - compat-oracle-rhel4-1.0-3

            - compat-libcwait-2.0-1

            - compat-libgcc-296-2.96-132.7.2

            - compat-libstdc++-296-2.96-132.7.2

            - compat-libstdc++-33-3.2.3-47.3

            - gcc-3.4.3-9.EL4

            - gcc-c++-3.4.3-9.EL4

            - gnome-libs-1.4.1.2.90-44

            - gnome-libs-devel-1.4.1.2.90-44

            - libaio-devel-0.3.102-1

            - libaio-0.3.102-1

            - make-3.80-5

            - openmotif21-2.1.30-11

            - xorg-x11-deprecated-libs-devel-6.8.1-23.EL

            - xorg-x11-deprecated-libs-6.8.1-23.EL

 

The compat-oracle-rhel4-1.0-3 and compat-libcwait-2.0-1 packages are available

from Oracle Metalink

While installing the patch you might receive the warning. It is a normal behaviour.

 

. 의존성이 있는 RPM들은 같이 설치하여야 합니다.

보통 풀패키지로 설치 했을 때 대부분의 패키지들이 깔리지만 오라클의 메타링크에서 제공하는 패키지는 다운을 받아서 설치해야 합니다.

 

레드햇 9에서는

xorg-x11-deprecated-libs-devel-6.8.1-23.EL

compat-libgcc-296-2.96-132.7.2

openmotif21-2.1.30-11
위 패키지를 설치 안해도 잘 깔린다고 합니다.

 

4. jdk설치

 

오라클 설치시 반드시는 아니지만 여러 오류를 피해가시고 싶으면 jdk를 설치하시면 됩니다

다운로드 :

RPM in self-extracting file(j2sdk-1_4_2_08-linux-i586-rpm.bin, 33.64M)

chmod +x를 주고 설치

rpm Uvh로 설치

/usr/java/j2sdk-1_4_2_08에서 /usr/local/j2sdk-1_4_2_08로 이동후

$/usr/local/에서 ln s j2sdk-1_4_2_08 java

/etc/profile에서 다음 내용을 설정

# For java

export JAVA_HOME=/usr/local/java

export PATH=$JAVA_HOME/bin:.:$PATH

 

5. 공유메모리 및 세마포 설정

오라클사가 제공한 커널 파라미터 값에 대한 권고값

파라미터

권장값

설명

SEMMNI

100

시스템 내 세마포어 셋의 최대 개수, 동시에 사용될 수 있는 세마포어의 최대 개수를 결정한다.

SEMMNS

256

시스템 내 세마포어 전체 개수

SEMMSL

100

한 개의 세마포어 셋에 존재할 수 있는 세마포어의 최대개수.

오라클 프로세스의 최대개수에 10개정도를 더한 값으로 설정한다. (오라클 initSID.ora 파일 내의 processes 파라미터)

SEMOPM

100

시스템 내 semop를 호출할 때마다 operation의 최대 개수

SEMVMX

32767

세마포어의 최대값을 결정한다.

SHMMAX

2147483648

한 개의 공유 메모리 세그먼트의 최대 크기 (단위: 바이트)

SHMMIN

1

한 개의 공유 메모리 세그먼트의 최소 크기 (단위: 바이트)

SHMMNI

100

공유 메모리 세그먼트의 최대 개수

SHMSEG

4096

한 개의 프로세스에 연결될 수 있는 공유 메모리 세그먼트의 최대값

** 공유 메모리와 세마포어의 개수 알아보기**

원래 공유메모리와 세마포어를 변경한 값을 적용하여 커널을 재컴파일 해야하지만

여건이 되지 않는 경우 소프트웨어적으로 공유메모리와 세마포어를 변경할 수 있다.

[root@ora9 kernel]# vi /etc/sysctl.conf

가장 마지막에 다음을 추가합니다.

kernel.shmmax = 2147483648

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range=1024 65000

시스템 리소스를 제한하는 설정파일에 다음을 추가한다.

[root@ora9 kernel]# vi /etc/security/limits.conf

가장 마지막에 다음을 추가합니다.

oracle soft nofile 65536

oracle hard nofile 65536

oracle soft nproc 16384

oracle hard nproc 16384

이 후 재부팅을 권장합니다.

 

6. 오라클 사용자 초기화 파일구성

oracle$ vi .bash_profile

 

# for ORACLE

 

export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_OWNER=oracle

export ORACLE_SID=ORA92
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export LD_ASSUME_KERNEL=2.4.1

export THREADS_FLAG=native

export TEMPDIR=/tmp

export EDITOR=vi
export PATH=$PATH:$ORACLE_HOME/bin
umask 022

 

# for DBA/User

 

alias oh='cd $ORACLE_HOME'

alias ob='cd $ORACLE_BASE'

alias cls='clear'

alias ls=’ls -F’

alias rm=’rm –i’

umask 022

 

# for java

 

export JAVA_HOME="/usr/jdk"

CLASSPATH=".:$JAVA_HOME/lib/tools.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/jdbc/lib/classes12.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME jdbc/lib/nls_charset12.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/rdbms/jlib/xsu12.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/lib/xmlparserv2.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/lib/classgen.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/lib/oraclexsql.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/lib/xmlplsql.jar"

CLASSPATH="$CLASSPATH:$ORACLE_HOME/lib/xschema.jar"

export CLASSPATH

 

오라클 환경 설정 항목과 그에 대한 설명

설정 이름

설정 설명

ORACLE_BASE

오라클 설치 프로그램인 OUI를 저장하고 오라클 트레이스 파일 및 데이터 파일을 저장하는 디렉토리의 이름을 기록하는 오라클 환경변수 명이다.

ORACLE_HOME

현재 설치하고자 하는 오라클 데이터베이스 서버를 저장할 디렉토리명을 기록한다.

ORACLE_OWNER

오라클 제품을 컨트롤할 OS 시스템 레벨의 유저가 누구인가를 설정하는 오라클 환경변수로, 앞 단락에서 생성한 oracle 사용자를 지정한다.

LD_LIBRARY_PATH

오라클 제품을 사용할 때 사용되는 오라클 공유 라이브러리들의 경로를 나타낸다. 반드시 $ORACLE_HOME/lib를 포함하여 설정한다./

ORACLE_SID

오라클 서버 인스턴스의 이름인 Oracle System Identifier(SID)를 설정한다. 하나의 하드웨어에 여러 개의 데이터베이스 인스턴스가 존재할 수 있지만, SID는 개별 인스턴스에 대해 유일한 이름으로 명명되어야 한다.

PATH

$ORACLE_HOME/bin을 포함하여 설정한다.

NLS_LANG

오라클 데이터베이스의 문자 셋을 설정한다. 여러분이 생성하게 될 데이터베이스의 문자셋과 일치해야 한다.

TNS_ADMIN

Oracle Network를 구성할 때 필요한 설정파일의 위치를 지정하는 것으로, insterner.ora, tnsnames.ora, sqlnet.ora 파일들이 위치하고 있다.

ORA_NLS33

NLS_LANG 항목에 설정된 문자 셋대로 오라클 데이터베이스에서 각국의 언어 및 도량형을 제공하는 데 필요한 정보를 갖고 있는 파일들의 위치를 지정한다.

TEMPDIR

오라클 데이터베이스가 운영 중에 임시 파일들을 위치시킬 장소를 지정한다.

EDITOR

SQL *Plus 상에서 edit명령어를 사용했을 때 실행할 수 있는 OS 레벨의 에디터를 지칭하는 것으로, 여러분에게 익숙할 만한 pico, vi를 설정한다.

LANG

데이터베이스의 문자 셋을 결정하는 NLS_LANG과 달리, 현재 사용자의 세션에서의 문자 셋을 결정하는 시스템 환경변수이다. 필자와 같이 ko_KR.eucKR를 설정하면 한글화된 시스템 메시지를 볼 수 있으며, 오라클에서 제공하는 모든 자바 툴에서 한글화 메시지를 바로 볼 수 있다.

DISPLAY

Oracle Universal Installer 등 오라클에서 제공하는 자바로 만들어진 여러 가지 툴이 구동하기 위한 X윈도우 환경을 설정하기 위한 것으로, 사용자의 서버 명이나 IP를 설정한다.

LD_ASSUME_KERNEL

KERNEL 버전을 다른것으로 보이게 하기 위한 환경 변수다.

THREADS_FLAG

JAVA Thread 실행과 관련이 있는 값이다.

 

7. 오라클 셋업

x-windows oracle계정으로 로그인

oracle에서 ./runinstaller

언어가 깨지거나 실행이 안될 경우에는 다음명령을 실행

unset LANG

Unix Group Name-> oinstall 또는 dba

sid-> 일반적으로 ora9 혹은 ora92

Global Database Name -> ora9.도메인

문자셋은 [6] 사용자 초기화파일에서 설정한 것과 같아야 한다.

export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

설치 중간에 orainstRoot.sh 팝업이 나올시

새창에서

su root

cd /tmp

./orainstRoot.sh실행

완료 후 진행

설치 진행 100% 후에

*/oracle/ora92/root.sh 실행 대화상자 팝업

$su root

#cd / oracle/ora92

#./root.sh

시스템 기본 디렉토리를 물으면

/usr/bin으로 설정

 

 

8. Database 시작과 종료

                    glibc 관련 rpm 패키지 원상복구하기

[root@ora9 /]# cd /usr/local/src/

[root@ora9 src]# rpm -Uvh --nodeps glibc-common-2.3.2-11.9.i386.rpm

[root@ora9 src]# rpm -Uvh --nodeps glibc-devel-2.3.2-11.9.i386.rpm

[root@ora9 src]# rpm -Uvh --nodeps glibc-2.3.2-11.9.i386.rpm

 

                    오라클 데이터베이스 시작하기

Database 의 시작과 종료는 반드시!! Oracle 계정으로 수행해야 합니다.

[root@ora9 src]# su oracle

[oracle@ora9 src]$ sqlplus /nolog

SQL> connect / as sysdba

SQL> startup

오라클 데이터베이스를 시작하고 종료하기 위해서는 OS에서의 인증과 암호 파일을 생성하는

툴인 orapwd를 통해야 한다. 그리고 sys 스키마의 권한인 sysdba 권한과 public 스키마

권한인 sysoper 권한의 특별한 시스템 권한을 소유한 사용자이어야 한다.

· sysdba : 데이터베이스 시작/종료, 아카이브 및 복구 작업, ALTER DATABASE OPEN,

MOUNT, BACKUP, CHANGE, CHARACHER SET 절의 명령어 실행

· sysoper : 데이터베이스 시작/종료, 아카이브 및 복구 작업, ALTER DATABASE OPEN,

MOUNT, BACKUP 절의 명령어 실행

SQL> SELECT * FROM v$version;

현재의 오라클 데이터베이스 인스턴스의 버전 확인하기

 

                    오라클 데이터베이스 종료하기

[oracle@ora9 src]$ sqlplus /nolog

SQL> connect / as sysdba

SQL> shutdown immediate

SQL> exit

 

                    oratab 파일 편집하기

오라클 데이터베이스를 /etc/rc.d/ini.d에 스크립트로 설정하여 자동으로 실행하게 하여봅시다.

[root@ora9 src]# vi /etc/oratab

다음 부분을 수정 ([SID], [ORACLE_HOME], [자동실행/종료 플래그]로 구성되어 있습니다.)

ora9:/opt/oracle/product/9.2.0.1.0:N è ora9:/opt/oracle/product/9.2.0.1.0:Y

 

                    Parameter 파일 링크

xxxxxxxxxxxx은 일정치 않은 숫자 입니다.

[root @ora9 /]# cp /opt/oracle/admin/ora9/pfile/initora9.ora.xxxxxxxxxxxx \

/opt/oracle/product/9.2.0.1.0/dbs/initora9.ora

 

                    s/etc/rc.d/init.d 에 등록하기

oracle9i 스크립트를 /etc/rc.d/init.d 에 복사합니다.

[root@ora9 src]# cp /usr/local/src/oracle-9.2.0.1.0 /etc/rc.d/init.d/oracle9i

oracle9i에 실행권한을 부여합니다.

[root@ora9 src]# chmod 755 /etc/rc.d/init.d/oracle9i

시스템에 oarcle9i 데몬을 등록한다.

[root@ora9 src]# chkconfig --add oracle9i

[root@ora9 src]# chkconfig --level 2345 oracle9i on

Oracle Database를 재시작 시켜본 후, LISTENER 데몬이 띄워져 잇는지 확인합니다.

[root@ora9 src]# /etc/rc.d/init.d/oracle9i start

[root@ora9 src]# ps ax | grep LISTENER

 

 

설치 로그보기

tail f $ORA_HOME/app/oracle/product/orainventory/logs/installactions.log

 

Oracle 삭제

$ORACLE_HOME 디렉토리에 있는 설치파일들 전부삭제

/etc 밑에 orainst.loc, oratab 삭제

/usr/local/bin/oraenv 파일 삭제

/tmp 디렉토리에서 관련파일 삭제

# rm /etc/oratab /etc/emtab

이후 다시 재설치 하시면 됩니다.

 

출처가 어디인지는 잊어버렸습니다...

원작자분께 죄송하단 말씀을..^^;;

 

기존 내용에 제가 이해하기 쉽도록 내용을 추가하였습니다.

 

그리고 초보가 한번에 따라하기는 어렵습니다.

나름대로의 시행착오를 겪어보셔야 될 것입니다.

^^ 잘되시길 바랍니다.

Posted by 1010
02.Oracle/DataBase2009. 7. 2. 10:44
반응형
암호화 복호화는 테스트 하고 설명하자면 끝도 없지만.
간단한 샘플 package 를 만들어서 직접 테스트 해 보면 그렇게 어렵지는 않다.

아래 관련자료 첨부하였으니
일단 한 번 수행 시켜서 수행해보고 이해해 보면 되겠다.

[by sinu] dbms_obfuscation_toolkit.txt 는 설명없이 스크립트만 들어 있으니 그냥 복사해서 붙이면 되고
(user 생성 및 clean 까지 되어 있다.)

[spool] dbms_obfuscation_toolkit.log 는 위 스크립트의 spool 결과이다.
수행여건이 안되거나 귀찮으신 분들을 위해;;


세세한 사항은 스크립트를 보면 되고
중요한 부분만 간략하게 설명하도록 하겠다.
8i, 9i 와 같은 경우 dbms_obfuscation_toolkit 만 사용이 가능한데
아래처럼 실행 권한만 부여해 주면 된다.
 
grant execute on dbms_obfuscation_toolkit to sinu;

패키지 생성 소스를 살펴 보자

CREATE OR REPLACE PACKAGE pkg_obfus
IS
    FUNCTION encrypt (
        input_string        IN  VARCHAR2 ,
        key_data IN VARCHAR2 := '1122334455667788'
    ) RETURN RAW;
    
    FUNCTION decrypt (
        input_string        IN  VARCHAR2 ,
        key_data IN VARCHAR2 := '1122334455667788'
    ) RETURN VARCHAR2;

END pkg_obfus;
/

이 부분 부터가 패키지 바디 소스이다.
CREATE OR REPLACE PACKAGE BODY pkg_obfus
IS
-- 에러 발생시에 error code 와 message 를 받기 위한 변수 지정.
    SQLERRMSG   VARCHAR2(255);
    SQLERRCDE   NUMBER;

-- 암호화 함수 선언 key_data 는 입력하지 않을 시에 default 로 1122334455667788 로 지정됨.
    FUNCTION encrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '1122334455667788')
     RETURN RAW
    IS
        key_data_raw RAW(128);
        input_string_raw RAW(128);
        encrypted_raw RAW(2048);

    BEGIN
-- 들어온 data 와 암호키를 각각 RAW 로 변환한다.
        input_string_raw := UTL_RAW.CAST_TO_RAW(input_string);
        key_data_raw  := UTL_RAW.CAST_TO_RAW(key_data);

-- DES 방식으로 암호화 한다.
        dbms_obfuscation_toolkit.DESEncrypt(
input => input_string_raw,
key => key_data_raw,
encrypted_data => encrypted_raw );
-- dbms_obfuscation_toolkit 를 수행하면 encrypted_raw 에 암호화된 data 가 raw 형태로 저장된다.

-- 암호화된 data 를 return (생각보다 간단하지 않은가?)
RETURN encrypted_raw;
    END encrypt;
    
    FUNCTION decrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '1122334455667788')
     RETURN VARCHAR2
    IS
        converted_string VARCHAR2(48);
        key_data_raw RAW(128);
        decrypted_raw VARCHAR2(2048);

    BEGIN
        key_data_raw  := UTL_RAW.CAST_TO_RAW(key_data);
        
-- 복호화 역시 간단하다. input_string 자체가 RAW 이므로 convert 하지 않아도 된다.
        dbms_obfuscation_toolkit.DESDecrypt(
input => input_string,
key => key_data_raw,
decrypted_data => decrypted_raw);

-- return 형태는 RAW 이므로 이를 다시 varchar2 로 변환하여 리턴한다.
        converted_string := UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw);
        RETURN converted_string;
    END decrypt ;

END pkg_obfus;
/

-- 암호화된 컬럼에 index 생성이 가능하다!!
create table card_info ( id number, card_number varchar(32) primary key) ;

insert into card_info values ( 1 , pkg_obfus.encrypt('1234567812345678'));

-- 2nd argument 에 원하는 key 값을 넣을 수도 있다.
insert into card_info values ( 2 , pkg_obfus.encrypt('1234567812345678', '0000111122223333'));
commit;

-- 같은 데이터 1234567812345678 을 넣었으나 key 값이 다르기 때문에 값이 전혀 다르다.
select * from card_info;
        ID CARD_NUMBER
---------- --------------------------------
         1 365C80EABBC8859E91C4BDE4B3C52A4B
         1 858B176DA8B125034356364E8179CD61

-- 2 번째 data 의 경우 key 값이 틀리기 때문에 복호화 되지 않고 에러를 뿌려준다.
select id, pkg_obfus.decrypt(card_number) card_number from card_info;

        ID CARD_NUMBER
---------- --------------------------------------------------
         1 1234567812345678
SP2-0784: Invalid or incomplete character beginning 0xF1 returned

-- 2 번째 row 의 key 값을 제대로 넣어주자 정상적으로 보인다.
select id, pkg_obfus.decrypt(card_number, '0000111122223333') card_number from card_info;

SP2-0784: Invalid or incomplete character beginning 0xEB returned
        ID CARD_NUMBER                    
---------- --------------------------------------------------
         2 1234567812345678                

-- [퀴즈] 특정 data 를 select 하려면 where 절에 어떤 형식으로 값을 주어야 할까?

1. select * from card_info where card_number = '1234567812345678';
2. select * from card_info where card_number = utl_raw.cast_to_raw('1234567812345678');

3. select * from card_info where card_number = '365C80EABBC8859E91C4BDE4B3C52A4B';
4. select * from card_info where card_number = pkg_obfus.encrypt('1234567812345678');

정답은 : 3 , 4 번 (드래그 하세요~)

소스는 길고 복잡해도

포인트는
dbms_obfuscation_toolkit.DESEncrypt
dbms_obfuscation_toolkit.DESDecrypt
요 2가지 이고 나머지는 그냥 varchar2 와 raw 의 converting 작업이다.

나머지 세세한 사항은 메뉴얼을 참고하자!

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 16:09
반응형
바탕화면에서 텍스트 문서로 만들어서
내용을 삽입

오라클 서비스 시작 배치파일 orastart.bat

net start OracleDBConsoleorcl
net start OracleOraDb10g_home1iSQL*Plus
net start OracleOraDb10g_home1TNSListener
net start OracleServiceORCL

오라클 서비스 종료 배치파일 orastop.bat

net stop OracleDBConsoleorcl
net stop OracleOraDb10g_home1iSQL*Plus
net stop OracleOraDb10g_home1TNSListener
net stop OracleServiceORCL



-- xe 기준

@echo on
net start OracleXETNSListener
net start OracleServiceXE
pause

@echo on
net stop OracleXETNSListener
net stop OracleServiceXE
pause

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 12:19
반응형
[Oracle]오라클 어드민 팁  

Oracle Administration을 정리하다가 간단히 찾아고 조금이나마 도움이 되시라고 정리해서 올립니다.
너무 단시간에 두서없이 써서 보기도 좋지 않지만 필요하신 분들 심심할때 하나씩  
해보세요.(다들 아시는거지만~~)
아래 tips 는 하나의 database에서 작성한 것이 아니므로 각종 정보들(file들의 위치등)이  
tip마다 다를 수 있습니다. 각 tip은 개개의 것으로 생각하시고 응용하시기 바랍니다.
혹시 틀린 내용 발견되면 mail주세요. 바로 수정하겠습니다.
편집 이쁘게 못해서 죄송합니다.
나름대로 사연있는 글입니다.
정리하다가 날려먹어서 한 몇일 더 고생해서 작성한겁니다.^^;

님들도 좋은 정보 있으시면 공유하시죠.


================================================================================================  
1. DBMS = database(data file & control file & redo log file) +  
                                                   instance(memory & background processes)
================================================================================================  


2. Oracle Architecture Component

================================================================================================  

* Oracle Instance 확인 : v$instance

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
IBM

================================================================================================  

* datafile들의 경로 및 정보 : v$datafile
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/oracle/ora_data/system/system01.dbf
/oracle/ora_data/data/tools01.dbf
/oracle/ora_data/data/rbs01.dbf
/oracle/ora_data/data/temp01.dbf
/oracle/ora_data/data/users01.dbf

================================================================================================  

* control file의 경로 및 정보 : v$controlfile;

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/oracle/ora_data/contr1/ora_control1
/oracle/ora_data/contr2/ora_control2

================================================================================================  

* logfile의 경로 및 정보 : v$logfile

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/oracle/ora_data/redolog_a/redo1a.log
/oracle/ora_data/redolog_b/redo1b.log
/oracle/ora_data/redolog_a/redo2a.log
/oracle/ora_data/redolog_b/redo2b.log
/oracle/ora_data/redolog_a/redo3a.log
/oracle/ora_data/redolog_b/redo3b.log

================================================================================================  

* System Global Area 내용을 조회

SQL> select * from v$sga;

NAME                      VALUE
-------------------- ----------
Fixed Size               108588
Variable Size          27631616
Database Buffers        2252800
Redo Buffers              77824

SQL> show sga

Total System Global Area   30070828 bytes
Fixed Size                   108588 bytes
Variable Size              27631616 bytes
Database Buffers            2252800 bytes
Redo Buffers                  77824 bytes

================================================================================================  

* 현재 수행중인 background process들을 확인

SQL> select paddr,name,description from v$bgprocess where paddr>'00';

PADDR            NAME  DESCRIPTION
---------------- ----- ----------------------------------------------------------------
070000000139ABC0 PMON  process cleanup
070000000139AFD0 DBW0  db writer process 0
070000000139B3E0 LGWR  Redo etc.
070000000139B7F0 CKPT  checkpoint
070000000139BC00 SMON  System Monitor Process
070000000139C010 RECO  distributed recovery

SQL> !ps -ef|grep ora|grep

 oracle 25148     1   0  19:25:34      -  0:00 ora_reco_IBM
 oracle 60576     1   0  19:25:34      -  0:00 ora_smon_IBM
 oracle 60782     1   0  19:25:34      -  0:00 ora_pmon_IBM
 oracle 70166     1   0  19:25:34      -  0:00 ora_lgwr_IBM
 oracle 72248     1   0  19:25:34      -  0:00 ora_ckpt_IBM
 oracle 84918     1   0  19:25:34      -  0:00 ora_dbw0_IBM
 
================================================================================================  

* 초기화 파라미터 파일 : init.ora

================================================================================================  

* database log 모드 확인

SQL> connect internal
Connected.

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /oracle/app/oracle/product/8.1.6/dbs/arch
Oldest online log sequence     20
Current log sequence           22

SQL> select log_mode from v$database;

LOG_MODE
------------
NOARCHIVELOG

================================================================================================  


3. Managing an Oracle Instance

================================================================================================  

단계별 :
shutdown : oracle이 내려가 있는 상태
nomount : instance started(SGA, B.G process를 시작 init.ora에서 읽어서)
alert, trace file open
- 이 단계에서 할 수 있는 것은  
 a. db creation
- 이 상태에서도 볼수있는 view
 v$parameter
 v$dga
 v$option
 v$process
 v$session
 v$version
 v$instance

mount : control file opened for this instance
- 이 단계에서 할 수 있는 것은 control file의 내용을 변경하는것
 a. archivelog mode로 변환
 b. data file/redo log file rename시
 c. recovery시

- SQL>alter database open read only;
 로 하게되면 data file에 writing을 허용 안함.

open : control file에 기술된 모든 files open

================================================================================================  

* parameter 변경 종류

a. init.ora 에서 변경
b. alter session set ~
c. alter system set ~    => shutdown 될때까지 변경된것 유효
  alter system deffered set ~ => 현재 session에서만 변경된것 유효

================================================================================================  

* 특정 session 죽이기

SQL> select sid, serial#,username,status from v$session; => (특정 user는 where username='SCOTT'로)
      SID    SERIAL# USERNAME                       STATUS
---------- ---------- ------------------------------ --------
        1          1                                ACTIVE
        2          1                                ACTIVE
        3          1                                ACTIVE
        4          1                                ACTIVE
        5          1                                ACTIVE
        6          1                                ACTIVE
        7          1 SYS                            ACTIVE

SQL> alter system kill session '7,3'    -- 7은 sid, 3은 serial#

================================================================================================  

* alert file 과 trace file
- alert file은 꼭 1개, 중요한사건,시간순으로 (startup,shutdown,recovery)
- trace file은 여러개 가능, background process는 background_dump_dest에 생기고 server process는
 user_dump_dest에 생성된다.

================================================================================================  


4. Creating a Database

================================================================================================  

* Create a Database Manually

a. OS Environment setting

.profile에 ORACLE_HOME,ORACLE_SID,ORA_NLS33,PATH,(ORACLE_BASE) 등을 편집한다.

ex)
DISPLAY=swsvrctr:0.0
ORACLE_HOME=/oracle/app/oracle/product/8.1.7
PATH=$ORACLE_PATH/bin:/usr/ccs/bin:$PATH
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
ORACLE_SID=IBM

b. init.ora file을 copy하고 편집한다.
file
db_name=KYS
control_files = (/home/oracle/data02/control/control01.ctl,/home/oracle/data02/control/control02.ctl)
db_block_size = 8192

기본적으로 위 두개 parameter외에
rollback_segments=(rbs1,rbs2,..)  =>나중에 rollback segment생성후 DB start시 Online되는 rbs지정
background_dump_dest=/home/oracle/data02/bdump
user_dump_dest=/home/oracle/data02/udump
core_dump_dest=/home/oracle/data02/cdump

c. Starting the Instance

SQL> startup nomount
SQL> startup nomount pfile=initKYS.ora

SQL> create database KYS
 2     maxlogfiles 5
 3     maxlogmembers 5
 4     maxdatafiles 100
 5     maxloghistory 100
 6  logfile
 7     group 1 ('/home/oracle/data02/redolog/log1a.rdo','/home/oracle/data02/redolog2/log1b.rdo') size 1m,
 8     group 2 ('/home/oracle/data02/redolog/log2a.rdo','/home/oracle/data02/redolog2/log2b.rdo') size 1m
 9  datafile
10     '/home/oracle/data02/data/system01.dbf' size 50m autoextend on
11  character set "KO16KSC5601";

일단 여기까지 database는 생성이 되었다.
이후부터는 추가적인 작업이다.

d. 추가 system rollback segment 생성

SQL> create rollback segment r0 tablespace system
 2  storage (initial 16k next 16k minextents 2 maxextents 10);

 
e. rollback sement online

SQL> alter rollback segment r0 online;


f. rollback segment tablespace 생성 & datafile 저장위치, 크기 및 초기값 지정

SQL> create tablespace rbs
 2  datafile '/home/oracle/data02/data/rbs01.dbf' size 300m
 3  default storage(
 4  initial            4M
 5  next               4M
 6  pctincrease        0
 7  minextents         10
 8  maxextents         unlimited);

g. rollback segment 생성

SQL> create rollback segment r01 tablespace rbs
 2  storage (minextents 10 optimal 40M);
SQL> create rollback segment r02 tablespace rbs
 2  storage (minextents 10 optimal 40M);
SQL> create rollback segment r03 tablespace rbs
 2  storage (minextents 10 optimal 40M);
SQL> create rollback segment r04 tablespace rbs
 2  storage (minextents 10 optimal 40M);


h. rollback segment online

SQL> alter rollback segment r01 online;
SQL> alter rollback segment r02 online;
SQL> alter rollback segment r03 online;
SQL> alter rollback segment r04 online;


i. 추가 system rollback segment off-line 및 삭제  

SQL> alter rollback segment r0 offline;
SQL> drop rollback segment r0;

j. sorting 작업시 필요한 temporary tablespace 생성 & datafile 저장 위치, 크기 및 초기값 지정

SQL> create tablespace temp
 2  datafile '/home/oracle/data02/data/temp01.dbf' size 300 temporary
 3  default storage(
 4  initial            4M
 5  next               4M
 6  maxextents         unlimited
 7  pctincrease        0);
 
 
k. 추가 tablespace 생성 & data file 저장 위치 및 크기 지정

SQL> create tablespace tools
 2  datafile '/home/oracle/data02/data/tools.dbf' size 50m
 3  default storage(
 4  maxextents 505
 5  pctincrease 0);
 
SQL> create tablespace users
 2  datafile '/home/oracle/data02/data/user01.dbf' size 30M
 3  default storage(
 4  maxextents 505
 5  pctincrease 0);
 
l. 작업 환경에서 추가적으로 필요한 tablespace는 위의 방법으로 생성한다.


================================================================================================  


5. Data Dictionary and Standard Package

================================================================================================  

* database 생성후 돌려줘야 할 script

$ORACLE_HOME/rdbms/admin/catalog.sql ==> dictionary views, export utility views 생성
$ORACLE_HOME/rdbms/admin/catproc.sql ==> procedures, functions 생성
$ORACLE_HOME/rdbms/admin/catdbsyn.sql ==> synonyms 생성

================================================================================================  

* Dictionary list 확인

SQL> col table_name format a30
SQL> col comments format a45
SQL> set pages 800
SQL> spool dictionary.lst
SQL> select * from dictionary order by 1 ==> 전체 dictionary의 list를 볼 수 있다.
SQL> spool off
SQL> ed sictionary.lst
SQL> select * from dictionary where table_name like '%TABLE%'; ==> table 관련 dictionary  
SQL> select * from dictionary where table_name like '%INDEX%';  ==> index 관련 dictionary

================================================================================================  

* 유용한 dictionary  

TABLE_NAME                     COMMENTS
------------------------------ ---------------------------------------------
DBA_USERS                      Information about all users of the database
DBA_TABLESPACES                Description of all tablespaces
DBA_DATA_FILES                 Information about database data files
DBA_FREE_SPACE                 Free extents in all tablespaces
DBA_OBJECTS                    All objects in the database
DBA_SEGMENTS                   Storage allocated for all database segments
DBA_ROLLBACK_SEGS              Description of rollback segments
DBA_EXTENTS                    Extents comprising all segments in the database
DBA_TABLES                     Description of all relational tables in the d
                              atabase
DBA_INDEXES                    Description for all indexes in the database
DBA_VIEWS                      Description of all views in the database
DBA_TRIGGERS                   All triggers in the database
DBA_SOURCE                     Source of all stored objects in the database

================================================================================================  

* sample Query

SQL> select username,default_tablespace,temporary_tablespace from dba_users;
SQL> select tablespace_name,bytes,file_name from dba_data_files;
SQL> select tablespace_name,count(*),sum(bytes) from dba_free_space
 2  group by tablespace_name;
 
================================================================================================  


6. Maintiaining the Contorol File

================================================================================================  

* Control File 리스트 조회

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/home/oracle/data01/oradata/IBM/control01.ctl
/home/oracle/data01/oradata/IBM/control02.ctl
/home/oracle/data01/oradata/IBM/control03.ctl

================================================================================================  

* Control File 을 하나 추가해보자

a. database shutdown
SQL> shutdown immediate

b. control file 복사(os상 물리적인 복사)
/home/oracle/data01/oradata/IBM> cp control03.ctl control04.ctl ==> 실제는 다른 disk로 복사해야함
   문제발생을 대비해 분리하는것임.

c. Parameter File 편집
control_files = ("/home/oracle/data01/oradata/IBM/control01.ctl",  
"/home/oracle/data01/oradata/IBM/control02.ctl",  
"/home/oracle/data01/oradata/IBM/control03.ctl",  
"/home/oracle/data01/oradata/IBM/control04,ctl")

d. database startup & 확인
SQL> startup
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/home/oracle/data01/oradata/IBM/control01.ctl
/home/oracle/data01/oradata/IBM/control02.ctl
/home/oracle/data01/oradata/IBM/control03.ctl
/home/oracle/data01/oradata/IBM/control04.ctl ==> 하나 더 추가되었지요...(실제는 다른disk로)

================================================================================================  


7. Multiplexing Redo Log Files

================================================================================================  

* Redo Log File 리스트 조회

SQL> select group#,sequence#,bytes,members,status from v$log;

   GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
---------- ---------- ---------- ---------- --------------------------------
        1        862     512000          1 CURRENT
        2        860     512000          1 INACTIVE
        3        861     512000          1 INACTIVE

SQL> select * from v$logfile;

   GROUP# STATUS         MEMBER
---------- -------------- --------------------------------------------------
        1                /home/oracle/data01/oradata/IBM/redo03.log
        2                /home/oracle/data01/oradata/IBM/redo02.log
        3                /home/oracle/data01/oradata/IBM/redo01.log          

================================================================================================  

* Log Group 추가(기존 로그 파일과 동일한 사이즈로)

SQL> alter database add logfile
 2  '/home/oracle/data01/oradata/IBM/redo04.log' size 200k;

SQL> select group#,sequence#,bytes,members,status from v$log;

   GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
---------- ---------- ---------- ---------- --------------------------------
        1        862     512000          1 CURRENT
        2        860     512000          1 INACTIVE
        3        861     512000          1 INACTIVE
        4          0     204800          1 UNUSED

SQL> select * from v$logfile;

   GROUP# STATUS         MEMBER
---------- -------------- --------------------------------------------------
        1                /home/oracle/data01/oradata/IBM/redo03.log
        2                /home/oracle/data01/oradata/IBM/redo02.log
        3                /home/oracle/data01/oradata/IBM/redo01.log
        4                /home/oracle/data01/oradata/IBM/redo04.log

================================================================================================  

* Log Group 별 멤버 파일 추가    ==> backup 시 risk줄이기 위해 실제는 다른 disk에 해야함.

SQL> alter database add logfile member
 2  '/home/oracle/data01/oradata/IBM/redo01b.log' to group 1,
 3  '/home/oracle/data01/oradata/IBM/redo02b.log' to group 2,
 4  '/home/oracle/data01/oradata/IBM/redo03b.log' to group 3,
 5  '/home/oracle/data01/oradata/IBM/redo04b.log' to group 4;

================================================================================================  

* 확인

SQL> !ls /home/oracle/data01/oradata/IBM/*.log
/home/oracle/data01/oradata/IBM/redo01.log   /home/oracle/data01/oradata/IBM/redo03.log
/home/oracle/data01/oradata/IBM/redo01b.log  /home/oracle/data01/oradata/IBM/redo03b.log
/home/oracle/data01/oradata/IBM/redo02.log   /home/oracle/data01/oradata/IBM/redo04.log
/home/oracle/data01/oradata/IBM/redo02b.log  /home/oracle/data01/oradata/IBM/redo04b.log

SQL> select group#,sequence#,bytes,members,status from v$log;

   GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
---------- ---------- ---------- ---------- --------------------------------
        1        862     512000          2 CURRENT
        2        860     512000          2 INACTIVE
        3        861     512000          2 INACTIVE
        4          0     204800          2 UNUSED ==> 아직 한번도 사용되지 않음

SQL> select * from v$logfile;

   GROUP# STATUS         MEMBER
---------- -------------- --------------------------------------------------
        1                /home/oracle/data01/oradata/IBM/redo03.log
        2                /home/oracle/data01/oradata/IBM/redo02.log
        3                /home/oracle/data01/oradata/IBM/redo01.log
        4                /home/oracle/data01/oradata/IBM/redo04.log
        1 INVALID        /home/oracle/data01/oradata/IBM/redo01b.log
        2 INVALID        /home/oracle/data01/oradata/IBM/redo02b.log
        3 INVALID        /home/oracle/data01/oradata/IBM/redo03b.log
        4 INVALID        /home/oracle/data01/oradata/IBM/redo04b.log


==> 현재 사용되고 있는 log group 은 group 1이고 나중에 추가한 member들은 invalid 한 상태이다.
강제로 log switch를 일으켜서 valid하게 바꾸자.

SQL> alter system switch logfile;

SQL> select group#,sequence#,bytes,members,status from v$log;

   GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
---------- ---------- ---------- ---------- --------------------------------
        1        862     512000          2 ACTIVE
        2        860     512000          2 INACTIVE
        3        861     512000          2 INACTIVE
        4        863     204800          2 CURRENT ==> unused에서 바뀜.

SQL> select * from v$logfile;

   GROUP# STATUS         MEMBER
---------- -------------- --------------------------------------------------
        1                /home/oracle/data01/oradata/IBM/redo03.log
        2                /home/oracle/data01/oradata/IBM/redo02.log
        3                /home/oracle/data01/oradata/IBM/redo01.log
        4                /home/oracle/data01/oradata/IBM/redo04.log
        1 INVALID        /home/oracle/data01/oradata/IBM/redo01b.log
        2 INVALID        /home/oracle/data01/oradata/IBM/redo02b.log
        3 INVALID        /home/oracle/data01/oradata/IBM/redo03b.log
        4                /home/oracle/data01/oradata/IBM/redo04b.log ==> valid하게 바뀜
         
================================================================================================  


Log Miner

================================================================================================  

* Parameter File 의 utl_file_dir 편집

a. 확인

SQL> select name,value from v$parameter
 2  where name='utl_file_dir';
 
NAME                 VALUE
-------------------- ------------------------------
utl_file_dir

SQL> !mkdir $ORACLE_HOME/LOG

b. LogMiner사용을 위해 init.ora file 편집
utl_file_dir=/oracle/app/oracle/product/8.1.7/LOG

c. restart

SQL> shutdown immediate
SQL> startup

확인
SQL> select name,value from v$parameter
 2  where name='utl_file_dir';
 
NAME                 VALUE
-------------------- ------------------------------
utl_file_dir         /oracle/app/oracle/product/8.1.7/LOG ==> LogMiner 준비를 위한 parameter set

d. LogMiner setting - 반드시 트랜잭션의 첫번째 명령이어야 함

SQL> commit;
SQL> exec dbms_logmnr_d.build('v817dict.ora','/oracle/app/oracle/product/8.1.7/LOG');
BEGIN dbms_logmnr_d.build('v817dict.ora','/oracle/app/oracle/product/8.1.7/LOG'); END;

*
ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 793
ORA-06512: at line 1

SQL> !ls $ORACLE_HOME/LOG

SQL> exec dbms_logmnr.add_logfile('/home/oracle/data01/oradata/IBM/redo01.log',DBMS_LOGMNR.NEW);
SQL> exec dbms_logmnr.add_logfile('/home/oracle/data01/oradata/IBM/redo02.log',DBMS_LOGMNR.ADDFILE);
SQL> exec dbms_logmnr.add_logfile('/home/oracle/data01/oradata/IBM/redo03.log',DBMS_LOGMNR.ADDFILE);
SQL> exec dbms_logmnr.add_logfile('/home/oracle/data01/oradata/IBM/redo04.log',DBMS_LOGMNR.ADDFILE);
SQL> exec dbms_logmnr.start_logmnr('/oracle/app/oracle/product/8.1.7/LOG/v817dict.ora');


e. 트랜잭션 수행

SQL> descc scott.dept
SQL> select * from scott.dept;
SQL> insert into scott.dept values(99,'test','test');
SQL> update scott.dept set loc='TEST' where deptno=99;
SQL> commit;

f. log miner 정보 분석
SQL> select timestamp,username,sql_redo from v$logmnr_contents
 2  where seg_name='DEPT';

g. 로그마이닝 종료

SQL> exec dbms_logmnr.end_logmnr;

================================================================================================  


8. Managing TableSpace and Data Files

================================================================================================  

* tablespace와 datafile 조회

SQL> col tablespace_name format a15
SQL> col file_name format a45
SQL> select tablespace_name,status,contents from dba_tablespaces;

TABLESPACE_NAME STATUS             CONTENTS
--------------- ------------------ ------------------
SYSTEM          ONLINE             PERMANENT
TOOLS           ONLINE             PERMANENT
RBS             ONLINE             PERMANENT
TEMP            ONLINE             TEMPORARY
USERS           ONLINE             PERMANENT
INDX            ONLINE             PERMANENT
DRSYS           ONLINE             PERMANENT

SQL> select tablespace_name,bytes,file_name from dba_data_files;

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
TOOLS             10485760 /home/oracle/data01/oradata/IBM/tools01.dbf
DRSYS             20971520 /home/oracle/data01/oradata/IBM/drsys01.dbf
USERS             20971520 /home/oracle/data01/oradata/IBM/users01.dbf
INDX              20971520 /home/oracle/data01/oradata/IBM/indx01.dbf
RBS               52428800 /home/oracle/data01/oradata/IBM/rbs01.dbf
TEMP              20971520 /home/oracle/data01/oradata/IBM/temp01.dbf
SYSTEM           283115520 /home/oracle/data01/oradata/IBM/system01.dbf

================================================================================================  

* tablespace 생성 및 사이즈 변경

SQL> create tablespace data05
 2  datafile '/home/oracle/data01/oradata/IBM/data05_01.dbf' size 1m;

Tablespace created.

1m 짜리 datafile 하나를 가진 tablespace data05를 추가하였다. 확인.

SQL> select tablespace_name,bytes,file_name from dba_data_files
 2  where tablespace_name='DATA05';

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_01.dbf

tablespace가 부족할때 늘리는 방법은 두가지가 있다.  
하나는 datafile을 추가하는 방법이고 다른하나는 datafile의 size를 늘리는 방법이다.

a. datafile을 하나 추가해보자.

SQL> alter tablespace data05
 2  add datafile '/home/oracle/data01/oradata/IBM/data05_02.dbf' size 1m;
 
SQL> select tablespace_name,bytes,file_name from dba_data_files
 2  where tablespace_name='DATA05';

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_01.dbf
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_02.dbf

제대로 추가되었다.


b. 그렇다면 하나의 사이즈를 변경해보자.

SQL> alter database datafile
 2  '/home/oracle/data01/oradata/IBM/data05_02.dbf' resize 2m;
 
SQL> select tablespace_name,bytes,file_name from dba_data_files
 2  where tablespace_name='DATA05';

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_01.dbf
DATA05             2097152 /home/oracle/data01/oradata/IBM/data05_02.dbf

2m로 제대로 변경이 되었다.

다시 원상복구
SQL> alter database datafile
 2  '/home/oracle/data01/oradata/IBM/data05_02.dbf' resize 1m;

전체를 다시 확인해보자

SQL> select tablespace_name,bytes,file_name from dba_data_files;

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
TOOLS             10485760 /home/oracle/data01/oradata/IBM/tools01.dbf
DRSYS             20971520 /home/oracle/data01/oradata/IBM/drsys01.dbf
USERS             20971520 /home/oracle/data01/oradata/IBM/users01.dbf
INDX              20971520 /home/oracle/data01/oradata/IBM/indx01.dbf
RBS               52428800 /home/oracle/data01/oradata/IBM/rbs01.dbf
TEMP              20971520 /home/oracle/data01/oradata/IBM/temp01.dbf
SYSTEM           283115520 /home/oracle/data01/oradata/IBM/system01.dbf
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_01.dbf
DATA05             1048576 /home/oracle/data01/oradata/IBM/data05_02.dbf

================================================================================================  

* tablespace 삭제 : Dictionary에서만 삭제되는것으로 실제 물리적으로 파일은 os command로 삭제해야한다.


SQL> select tablespace_name from dba_tablespaces
 2  where tablespace_name like 'DATA%'
 3  minus
 4  select distinct tablespace_name from dba_segments;

TABLESPACE_NAME
---------------
DATA05

SQL> drop tablespace data05;
SQL> select tablespace_name,bytes,file_name from dba_data_files;

TABLESPACE_NAME      BYTES FILE_NAME
--------------- ---------- ---------------------------------------------
TOOLS             10485760 /home/oracle/data01/oradata/IBM/tools01.dbf
DRSYS             20971520 /home/oracle/data01/oradata/IBM/drsys01.dbf
USERS             20971520 /home/oracle/data01/oradata/IBM/users01.dbf
INDX              20971520 /home/oracle/data01/oradata/IBM/indx01.dbf
RBS               52428800 /home/oracle/data01/oradata/IBM/rbs01.dbf
TEMP              20971520 /home/oracle/data01/oradata/IBM/temp01.dbf
SYSTEM           283115520 /home/oracle/data01/oradata/IBM/system01.dbf

SQL> !ls //home/oracle/data01/oradata/IBM/*.dbf
//home/oracle/data01/oradata/IBM/data05_01.dbf  //home/oracle/data01/oradata/IBM/system01.dbf
//home/oracle/data01/oradata/IBM/data05_02.dbf  //home/oracle/data01/oradata/IBM/temp01.dbf
//home/oracle/data01/oradata/IBM/drsys01.dbf    //home/oracle/data01/oradata/IBM/tools01.dbf
//home/oracle/data01/oradata/IBM/indx01.dbf     //home/oracle/data01/oradata/IBM/users01.dbf
//home/oracle/data01/oradata/IBM/rbs01.dbf

dictionary에서는 삭제되었으나 여전히 물리적인 file은 존재한다. 삭제하면 된다.
(tablespace생성시에는 file이 그냥 생성되나 삭제시는 dictionary삭제후 강제로 삭제해줘야 한다.)

SQL> !rm /home/oracle/data01/oradata/IBM/data05*

================================================================================================  

* tablespace 의 online/offline, read only/read write

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                                              STATUS
------------------------------------------------------------ ------------------
SYSTEM                                                       ONLINE
TOOLS                                                        ONLINE
RBS                                                          ONLINE
TEMP                                                         ONLINE
USERS                                                        ONLINE
INDX                                                         ONLINE
DRSYS                                                        ONLINE

7 rows selected.

SQL> select tablespace_name from dba_tables
 2  where table_name ='DEPT' and owner='SCOTT';

TABLESPACE_NAME
------------------------------------------------------------
SYSTEM

default로 생성시 scott user의 data가 system tablespace에 생성되었으나 이렇게 쓰면 안된다.
하나 생성해볼까?

SQL> create tablespace data01
 2  datafile '/home/oracle/data01/oradata/IBM/data01.dbf' size 1m;

Tablespace created.

SQL> connect scott/tiger
Connected.

SQL> create table dept_tmp tablespace data01
 2  as select * from dept;
 
SQL> connect internal
Connected.
SQL> select tablespace_name from dba_tables
 2  where table_name ='DEPT_TMP' and owner='SCOTT';

TABLESPACE_NAME
------------------------------------------------------------
DATA01

SQL> select * from scott.dept_tmp;

   DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
       10 ACCOUNTING                   NEW YORK
       20 RESEARCH                     DALLAS
       30 SALES                        CHICAGO
       40 OPERATIONS                   BOSTON
       
제대로 된다. 그렇다면 tablespace를 offline으로...

SQL> alter tablespace data01 offline;
SQL> select tablespace_name, status from dba_tablespaces
 2  where tablespace_name='DATA01';

TABLESPACE_NAME                                              STATUS
------------------------------------------------------------ ------------------
DATA01                                                       OFFLINE

SQL> select * from scott.dept_tmp;
select * from scott.dept_tmp
                   *
ERROR at line 1:
ORA-00376: file 8 cannot be read at this time
ORA-01110: data file 8: '/home/oracle/data01/oradata/IBM/data01.dbf'

위와 같이 error가 발생한다.
다시 online으로 해두자.
SQL> alter tablespace data01 online;

이번엔 read only로 변경
SQL> alter tablespace data01 read only;

SQL> select tablespace_name, status from dba_tablespaces
 2  where tablespace_name='DATA01';

TABLESPACE_NAME                                              STATUS
------------------------------------------------------------ ------------------
DATA01                                                       READ ONLY

변경되었다.

SQL> insert into scott.dept_tmp values(80,'new_dept','new_loc');
insert into scott.dept_tmp values(80,'new_dept','new_loc')
                 *
ERROR at line 1:
ORA-00372: file 8 cannot be modified at this time
ORA-01110: data file 8: '/home/oracle/data01/oradata/IBM/data01.dbf'

insert같은 DML(write성) 수행시 위와 같은 error 발생

원상복구
SQL> alter tablespace data01 read write;
SQL> insert into scott.dept_tmp values(80,'test','test');

제대로 된다.
================================================================================================  


9. Storage Structure and Relationships

================================================================================================  

* Extent 정보 조회 : 다음과 같이 각종 extent,segment 등의 정보를 조회해 볼 수 있다.

SQL> col owner format a10
SQL> col segment_type format a12
SQL> col segment_name format a12
SQL> col tablespace_name format a10

SQL> select owner,segment_name,segment_type, tablespace_name,max_extents,extents,pct_increase
 2  from dba_segments
 3  where max_extents - extents <= 10 and owner !='SYS';

no rows selected

SQL> select owner,segment_name,segment_type, tablespace_name,max_extents,extents,pct_increase
 2  from dba_segments
 3  where owner='SCOTT';

OWNER      SEGMENT_NAME SEGMENT_TYPE TABLESPACE MAX_EXTENTS    EXTENTS PCT_INCREASE
---------- ------------ ------------ ---------- ----------- ---------- ------------
SCOTT      DEPT_TMP     TABLE        DATA01             505          1           50
SCOTT      DEPT         TABLE        SYSTEM      2147483645          1           50
SCOTT      EMP          TABLE        SYSTEM      2147483645          1           50
SCOTT      BONUS        TABLE        SYSTEM      2147483645          1           50
SCOTT      SALGRADE     TABLE        SYSTEM      2147483645          1           50
SCOTT      PK_DEPT      INDEX        SYSTEM      2147483645          1           50
SCOTT      PK_EMP       INDEX        SYSTEM      2147483645          1           50


SQL> select segment_name,extents, initial_extent, next_extent,pct_increase
 2  from dba_segments
 3  where owner='SCOTT' and segment_name='EMP';

SEGMENT_NAME    EXTENTS INITIAL_EXTENT NEXT_EXTENT PCT_INCREASE
------------ ---------- -------------- ----------- ------------
EMP                   1          65536       65536           50


SQL> select segment_name,extent_id,block_id,bytes,blocks
 2  from dba_extents
 3  where owner='SCOTT' and segment_name='EMP';
 4  order by 2,3;
 
SEGMENT_NAME  EXTENT_ID   BLOCK_ID      BYTES     BLOCKS
------------ ---------- ---------- ---------- ----------
EMP                   0      33945      65536          8

================================================================================================  

* Free space 관리

tablespace내에 free space를 먼저 확인해본다.
SQL> select * from dba_free_space
 2  where tablespace_name ='DATA01' order by 1,2,3;

TABLESPACE    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
DATA01              8          7     999424        122            8

테이블을 여러개 생성해보자.
SQL> create table scott.dept2 tablespace data01 as select * from scott.dept;
SQL> create table scott.dept3 tablespace data01 as select * from scott.dept;
SQL> create table scott.dept4 tablespace data01 as select * from scott.dept;
SQL> create table scott.dept5 tablespace data01 as select * from scott.dept;
SQL> create table scott.dept6 tablespace data01 as select * from scott.dept;

SQL> select * from dba_free_space
 2  where tablespace_name ='DATA01' order by 1,2,3;

TABLESPACE    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
DATA01              8         32     794624         97            8

사용함에 따라 tablespace내 free space 가 줄어듦을 알 수 있다.

SQL> drop table scott.dept2;
drop table dept2
          *
ERROR at line 1:
ORA-04098: trigger 'SYS.JIS$ROLE_TRIGGER$' is invalid and failed re-validation
이건 또 뭐야 ? trigger가 걸려있네요...  
table drop 을 위해
SQL> alter trigger SYS.JIS$ROLE_TRIGGER$ disable;
drop table scott.dept3; ==> dept4 만 빼고 전부 drop
drop table scott.dept5;
drop table scott.dept6;

SQL> select * from dba_free_space
 2  where tablespace_name ='DATA01' order by 1,2,3;

TABLESPACE    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
DATA01              8          7      40960          5            8
DATA01              8         32     794624         97            8

tablespace의 free space가 늘긴 했는데 쪼개졌네요..
빈공간을 병합하자
SQL> alter tablespace data01 coalesce;

SQL> select * from dba_free_space
 2  where tablespace_name ='DATA01' order by 1,2,3;

TABLESPACE    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
DATA01              8          7      40960          5            8
DATA01              8         32     794624         97            8

그래도 두개로 쪼개져 있는 이유는? 중간에 dept4 가 사용하는 space가 coalesce 되지 않았기 때문

SQL> drop table scott.dept4;
SQL> alter tablespace data01 coalesce;

완전히 병합되었다.

================================================================================================  



10. Managing Rollback Segments

================================================================================================  

* rollback segment의 정보 조회

SQL> col owner format a10
SQL> col segment_name format a12
SQL> col segment_type format a12
SQL> col tablespace_name format a10
SQL> col status format a7

SQL> select segment_name,tablespace_name,status,initial_extent,next_extent,min_extents
 2  from dba_rollback_segs;

SEGMENT_NAME TABLESPACE STATUS  INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
------------ ---------- ------- -------------- ----------- -----------
SYSTEM       SYSTEM     ONLINE           57344       57344           2
RBS0         RBS        ONLINE          524288      524288           8
RBS1         RBS        ONLINE          524288      524288           8
RBS2         RBS        ONLINE          524288      524288           8
RBS3         RBS        ONLINE          524288      524288           8
RBS4         RBS        ONLINE          524288      524288           8
RBS5         RBS        ONLINE          524288      524288           8
RBS6         RBS        ONLINE          524288      524288           8

================================================================================================  

* rollback segment 생성

SQL> create rollback segment rbs99
 2  tablespace rbs
 3  storage(initial 20k next 20k minextents 2 optimal 80k);

Rollback segment created.

SQL> select segment_name,tablespace_name,status,initial_extent,next_extent,min_extents
 2  from dba_rollback_segs;

SEGMENT_NAME TABLESPACE STATUS  INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
------------ ---------- ------- -------------- ----------- -----------
SYSTEM       SYSTEM     ONLINE           57344       57344           2
RBS0         RBS        ONLINE          524288      524288           8
RBS1         RBS        ONLINE          524288      524288           8
RBS2         RBS        ONLINE          524288      524288           8
RBS3         RBS        ONLINE          524288      524288           8
RBS4         RBS        ONLINE          524288      524288           8
RBS5         RBS        ONLINE          524288      524288           8
RBS6         RBS        ONLINE          524288      524288           8
RBS99        RBS        OFFLINE          24576       32768           2

추가되었다. online으로 전환하자.

SQL> alter rollback segment rbs99 online;


SQL> create table emp2 as select * from emp;


SQL> select name,extents,xacts,shrinks,optsize
 2  from v$rollname n, v$rollstat s
 3  where n.usn = s.usn;

NAME                      EXTENTS      XACTS    SHRINKS    OPTSIZE
---------------------  ----------- ---------- ---------- ----------
SYSTEM                          9          0          0
RBS0                            8          0          0    4194304
RBS1                            8          0          0    4194304
RBS2                            8          0          0    4194304
RBS3                            8          0          0    4194304
RBS4                            8          0          0    4194304
RBS5                            8          0          0    4194304
RBS6                            8          0          0    4194304
RBS99                           2          0          0      81920   ==> extents,xacts의 변화 관찰


SQL> set transaction use rollback segment rbs99;
SQL> update emp2 set hiredate=sysdate;


SQL> select name,extents,xacts,shrinks,optsize
 2  from v$rollname n, v$rollstat s
 3  where n.usn = s.usn;

NAME               EXTENTS      XACTS    SHRINKS    OPTSIZE
--------------- ---------- ---------- ---------- ----------
SYSTEM                   9          0          0
RBS0                     8          0          0    4194304
RBS1                     8          0          0    4194304
RBS2                     8          0          0    4194304
RBS3                     8          0          0    4194304
RBS4                     8          0          0    4194304
RBS5                     8          0          0    4194304
RBS6                     8          0          0    4194304
RBS99                    2          1          0      81920 ==> transaction이 시작됨


SQL> update emp2 set hiredate=sysdate-1;  
sql> insert into emp2 select * from emp2; ==> 엄청 많이 수행 하자.


SQL> select name,extents,xacts,shrinks,optsize
 2  from v$rollname n, v$rollstat s
 3  where n.usn = s.usn;

NAME               EXTENTS      XACTS    SHRINKS    OPTSIZE
--------------- ---------- ---------- ---------- ----------
SYSTEM                   9          0          0
RBS0                     8          0          0    4194304
RBS1                     8          0          0    4194304
RBS2                     8          0          0    4194304
RBS3                     8          0          0    4194304
RBS4                     8          0          0    4194304
RBS5                     8          0          0    4194304
RBS6                     8          0          0    4194304
RBS99                    3          1          0      81920 ==> extents 증가


SQL> rollback;
SQL> set transaction use rollback segment rbs99;
SQL> update emp2 set sal=1000;


SQL> select name,extents,xacts,shrinks,optsize
 2  from v$rollname n, v$rollstat s
 3  where n.usn = s.usn;

NAME               EXTENTS      XACTS    SHRINKS    OPTSIZE
--------------- ---------- ---------- ---------- ----------
SYSTEM                   9          0          0
RBS0                     8          0          0    4194304
RBS1                     8          0          0    4194304
RBS2                     8          0          0    4194304
RBS3                     8          0          0    4194304
RBS4                     8          0          0    4194304
RBS5                     8          0          0    4194304
RBS6                     8          0          0    4194304
RBS99                    3          1          0      81920   ==> automatic 하게 shrink되었는지 확인

이전 tranx은 종료되었고 새로운 tranx가 시작됨

================================================================================================  

* rollback segment 삭제



SQL> rollback;


SQL> select name,extents,xacts,shrinks,optsize
 2  from v$rollname n, v$rollstat s
 3  where n.usn = s.usn; ==> xacts 가 '0' 인지 먼저 확인
 
SQL> alter rollback segment rbs99 offline;
SQL> drop rollback segment rbs99;
SQL> select segment_name,tablespace_name,status,initial_extent,next_extent,min_extents
 2  from dba_rollback_segs;

SEGMENT_NAME TABLESPACE STATUS  INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
------------ ---------- ------- -------------- ----------- -----------
SYSTEM       SYSTEM     ONLINE           57344       57344           2
RBS0         RBS        ONLINE          524288      524288           8
RBS1         RBS        ONLINE          524288      524288           8
RBS2         RBS        ONLINE          524288      524288           8
RBS3         RBS        ONLINE          524288      524288           8
RBS4         RBS        ONLINE          524288      524288           8
RBS5         RBS        ONLINE          524288      524288           8
RBS6         RBS        ONLINE          524288      524288           8
 
확인해보니 삭제되었다.

================================================================================================  


11.Managing Tables

================================================================================================  

* Temporary Table

a. on commit perserve rows : session내에서 생성한 temp table에 대해서 지속적.
  새로운 session 연결 되면 data 지워짐

Example : Creating a Session-Specific Temporary Table
CREATE GLOBAL TEMPORARY TABLE ...
    [ON COMMIT PRESERVE ROWS ]

b. on commit delete rows : tansaction이 끝나면 temp table 내의 data가 지워짐(commit,rollback등)

Example : Creating a Transaction-Specific Temporary Table
CREATE GLOBAL TEMPORARY TABLE ...
    [ON COMMIT DELETE ROWS ]

================================================================================================  

* Using Temporary Tables to Improve Performance

You can use temporary tables to improve performance when you run complex queries.  
Running multiple such queries is relatively slow because the tables are accessed multiple times  
for each returned row. It is faster to cache the values from a complex query in a temporary table,  
then run the queries against the temporary table.  

For example, even with a view like this defined to simplify further queries,  
the queries against the view may be slow because the contents of the view are recalculated each time:  

CREATE OR REPLACE VIEW Profile_values_view AS
SELECT d.Profile_option_name, d.Profile_option_id, Profile_option_value,
      u.User_name, Level_id, Level_code
 FROM Profile_definitions d, Profile_values v, Profile_users u
WHERE d.Profile_option_id = v.Profile_option_id
  AND ((Level_code = 'USER' AND Level_id = U.User_id) OR
       (Level_code = 'DEPARTMENT' AND Level_id = U.Department_id) OR
       (Level_code = 'SITE'))
  AND NOT EXISTS (SELECT 1 FROM PROFILE_VALUES P
                   WHERE P.PROFILE_OPTION_ID = V.PROFILE_OPTION_ID
                     AND ((Level_code = 'USER' AND
                           level_id = u.User_id) OR
                          (Level_code = 'DEPARTMENT' AND
                           level_id = u.Department_id) OR
                          (Level_code = 'SITE'))
                     AND INSTR('USERDEPARTMENTSITE', v.Level_code) >
                         INSTR('USERDEPARTMENTSITE', p.Level_code));


A temporary table allows us to run the computation once,  
and cache the result in later SQL queries and joins:  

CREATE GLOBAL TEMPORARY TABLE Profile_values_temp
        (
            Profile_option_name   VARCHAR(60)   NOT NULL,
            Profile_option_id     NUMBER(4)     NOT NULL,
            Profile_option_value  VARCHAR2(20)  NOT NULL,
            Level_code            VARCHAR2(10)          ,
            Level_id              NUMBER(4)             ,
            CONSTRAINT Profile_values_temp_pk
               PRIMARY KEY (Profile_option_id)
        ) ON COMMIT PRESERVE ROWS ORGANIZATION INDEX;

INSERT INTO Profile_values_temp
      (Profile_option_name, Profile_option_id, Profile_option_value,
       Level_code, Level_id)
SELECT Profile_option_name, Profile_option_id, Profile_option_value,
       Level_code, Level_id
 FROM Profile_values_view;
COMMIT;


Now the temporary table can be used to speed up queries,  
and the results cached in the temporary table are freed automatically by the database  
when the session ends.  

================================================================================================  

* Row Migration Test

scott/tiger로 접속해서

SQL> create table chain_test(col1 varchar2(100));

Table created.

SQL> insert into chain_test values('a');

1 row created.

SQL> insert into chain_test select * from chain_test;   <====== 1 row created.
SQL> / <====== 2 rows created.
SQL> / <====== 4 rows created.
SQL> / <====== 8 rows created.
SQL> / <====== 16 rows created.
SQL> / <====== 32 rows created.
SQL> / <====== 64 rows created.
SQL> / <====== 128 rows created.
SQL> / <====== 256 rows created.
SQL> / <====== 512 rows created.
SQL> commit;

SQL> @$ORACLE_HOME/rdbms/admin/utlchain                 <====== chanined_rows table생성

Table created.

SQL> desc chained_rows
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER_NAME                                         VARCHAR2(30)
TABLE_NAME                                         VARCHAR2(30)
CLUSTER_NAME                                       VARCHAR2(30)
PARTITION_NAME                                     VARCHAR2(30)
SUBPARTITION_NAME                                  VARCHAR2(30)
HEAD_ROWID                                         ROWID
ANALYZE_TIMESTAMP                                  DATE

SQL> analyze table chain_test list chained rows;

Table analyzed.

SQL> select count(*) from chained_rows;

 COUNT(*)
----------
        0                             ======> 아직까지는 chaining이 하나도 없지...
         
SQL> update chain_test
 2  set col1 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

1024 rows updated.

SQL> analyze table chain_test list chained rows;

Table analyzed.

SQL> select count(*) from chained_rows;

 COUNT(*)
----------
      995                       ==============> row migration이 다량 발생


row migration이 일어나면 여러 block에서 읽어야 하므로 그만큼 performance가 떨어진다.
이를 해결하기 위해 주기적으로 analyze하여 확인해보고 insert를 다시 해주면 된다.
chaining이 일어난 row들의 rowid로 찾아서 임시table을 생성하고 원래 table에서 chaining이 일어난
data를 삭제하고 다시 insert하면 된다.


SQL> create table chain_tmp as select * from chain_test
 2  where rowid in (select head_rowid from chained_rows where table_name='CHAIN_TEST');

SQL> delete from chain_test
 2  where rowid in(select head_rowid from chained_rows where table_name='CHAIN_TEST');

SQL> insert into chain_test select *  from chain_tmp;

SQL> commit;

다시 cahined_rows table 을 삭제하고 analyze해보자.
SQL> truncate table chained_rows;

Table truncated.

SQL> analyze table chain_test list chained rows;

Table analyzed.

SQL> select * from chained_rows; <====== no rows selected

chaining이 없어졌다.

================================================================================================  


12. Managing Indexes

================================================================================================  

1. B*Tree Index 생성, 확인

SQL> col table_name format a10
SQL> col index_name format a20
SQL> col index_type format a10
SQL> col column_name format a12
SQL> create index scott.dept_dname_ind on scott.dept(dname);

Index created.

SQL> create unique index scott.dept_deptno_uind on scott.dept(deptno);
create unique index scott.dept_deptno_uind on scott.dept(deptno)
                                                        *
ERROR at line 1:
ORA-01408: such column list already indexed

error가 난 이유는 column이 pk로 지정될때는 unique index가 자동으로 생성되기 때문.

user_constraints, user_cons_columns 등에서 확인해보면 알수있다.

SQL> select table_name,index_name,index_type,uniqueness
 2  from dba_indexes
 3  where owner='SCOTT';

TABLE_NAME INDEX_NAME           INDEX_TYPE UNIQUENESS
---------- -------------------- ---------- ------------------
DEPT       DEPT_DNAME_IND       NORMAL     NONUNIQUE ====> 생성한 index
AUDIT_ACTI I_AUDIT_ACTIONS      NORMAL     UNIQUE
ONS

DEPT       PK_DEPT              NORMAL     UNIQUE
EMP        PK_EMP               NORMAL     UNIQUE
DBMS_LOCK_ SYS_C001456          NORMAL     UNIQUE
ALLOCATED

DBMS_ALERT SYS_C001457          NORMAL     UNIQUE
_INFO


SQL> select table_name,index_name,column_position,column_name
 2  from dba_ind_columns
 3  where index_owner='SCOTT';

TABLE_NAME INDEX_NAME           COLUMN_POSITION COLUMN_NAME
---------- -------------------- --------------- ------------
DEPT       DEPT_DNAME_IND                     1 DNAME               ====> index가 걸린 column
AUDIT_ACTI I_AUDIT_ACTIONS                    1 ACTION
ONS

AUDIT_ACTI I_AUDIT_ACTIONS                    2 NAME
ONS

DEPT       PK_DEPT                            1 DEPTNO
EMP        PK_EMP                             1 EMPNO
DBMS_LOCK_ SYS_C001456                        1 NAME
ALLOCATED

DBMS_ALERT SYS_C001457                        1 NAME
_INFO

DBMS_ALERT SYS_C001457                        2 SID
_INFO

================================================================================================  

* Bitmap Index 생성, 확인

SQL> select count(*) from scott.emp;
SQL> select distinct job from scott.emp;

JOB
------------------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

SQL> create bitmap index scott.emp_job_bind on scott.emp(job);

SQL> select table_name,index_name,index_type,uniqueness
 2  from dba_indexes
 3  where owner='SCOTT';

TABLE_NAME INDEX_NAME           INDEX_TYPE UNIQUENESS
---------- -------------------- ---------- ------------------
DEPT       DEPT_DNAME_IND       NORMAL     NONUNIQUE
EMP        EMP_JOB_BIND         BITMAP     NONUNIQUE =====>
AUDIT_ACTI I_AUDIT_ACTIONS      NORMAL     UNIQUE
...

SQL> select table_name,index_name,column_position,column_name
 2  from dba_ind_columns
 3  where index_owner='SCOTT';

TABLE_NAME INDEX_NAME           COLUMN_POSITION COLUMN_NAME
---------- -------------------- --------------- ------------
DEPT       DEPT_DNAME_IND                     1 DNAME
EMP        EMP_JOB_BIND                       1 JOB =====>
AUDIT_ACTI I_AUDIT_ACTIONS                    1 ACTION
ONS

================================================================================================  

* Reverse Key Index 생성, 확인

SQL> create index scott.emp_hiredate_rind on scott.emp(hiredate) reverse;

SQL> select table_name,index_name,index_type,uniqueness
 2  from dba_indexes
 3  where owner='SCOTT';

TABLE_NAME INDEX_NAME           INDEX_TYPE UNIQUENESS
---------- -------------------- ---------- ------------------
DEPT       DEPT_DNAME_IND       NORMAL     NONUNIQUE
EMP        EMP_HIREDATE_RIND    NORMAL/REV NONUNIQUE ==>
EMP        EMP_JOB_BIND         BITMAP     NONUNIQUE
....

SQL> select table_name,index_name,column_position,column_name
 2  from dba_ind_columns
 3  where index_owner='SCOTT';

TABLE_NAME INDEX_NAME           COLUMN_POSITION COLUMN_NAME
---------- -------------------- --------------- ------------
DEPT       DEPT_DNAME_IND                     1 DNAME
EMP        EMP_HIREDATE_RIND                  1 HIREDATE ==>
EMP        EMP_JOB_BIND                       1 JOB
....

================================================================================================  

* Funtion-Based Index 생성, 확인 <===== Query Rewrite권한 필요

SQL> create index scott.emp_sal_find on scott.emp(sal * 1.1);


SQL> select table_name,index_name,index_type,uniqueness
 2  from dba_indexes
 3  where owner='SCOTT';

TABLE_NAME INDEX_NAME           INDEX_TYPE UNIQUENESS
---------- -------------------- ---------- ------------------
DEPT       DEPT_DNAME_IND       NORMAL     NONUNIQUE
EMP        EMP_HIREDATE_RIND    NORMAL/REV NONUNIQUE
EMP        EMP_JOB_BIND         BITMAP     NONUNIQUE
EMP        EMP_SAL_FIND         FUNCTION-B NONUNIQUE ==>
                               ASED NORMA
                               L
....

SQL> select table_name,index_name,column_position,column_name
 2  from dba_ind_columns
 3  where index_owner='SCOTT';

TABLE_NAME INDEX_NAME           COLUMN_POSITION COLUMN_NAME
---------- -------------------- --------------- ------------
DEPT       DEPT_DNAME_IND                     1 DNAME
EMP        EMP_HIREDATE_RIND                  1 HIREDATE
EMP        EMP_JOB_BIND                       1 JOB
EMP        EMP_SAL_FIND                       1 SYS_NC00009$   ====> column name이 내부적으로 바뀐다.

....

================================================================================================  

* Index drop

SQL> drop index scott.dept_dname_ind;
SQL> drop index scott.emp_hiredate_rind;
SQL> drop index scott.emp_job_bind;
SQL> drop index scott.emp_sal_find;

================================================================================================  


13.Maintaining Data Integrity

================================================================================================  

* PK/UK 와 Unique Index

SQL> desc scott.dept
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
DEPTNO                                    NOT NULL NUMBER(2)
DNAME                                              VARCHAR2(14)
LOC                                                VARCHAR2(13)

PK생성은 다음과 같이 할 수 있다.

SQL> alter table scott.dept
 2  add constraint dept_deptno_pk primary key(deptno);
add constraint dept_deptno_pk primary key(deptno)
                             *
ERROR at line 2:
ORA-02260: table can have only one primary key

이미 pk가 설정이 되어있어서 한테이블에 두개의 pk를 설정할 수 없다는 error.

SQL> alter table scott.dept
 2  add constraint dept_dname_uk unique (dname);

Table altered.

SQL> select table_name,constraint_name,constraint_type, status
 2  from dba_constraints
 3  where owner='SCOTT';

TABLE_NAME           CONSTRAINT_NAME CO STATUS
-------------------- --------------- -- ----------------
DEPT                 DEPT_DNAME_UK   U  ENABLED <=== 새로 생성한 UK
EMP                  FK_DEPTNO       R  ENABLED
DEPT                 PK_DEPT         P  ENABLED
EMP                  PK_EMP          P  ENABLED
AUDIT_ACTIONS        SYS_C001454     C  ENABLED
AUDIT_ACTIONS        SYS_C001455     C  ENABLED
DBMS_LOCK_ALLOCATED  SYS_C001456     P  ENABLED
DBMS_ALERT_INFO      SYS_C001457     P  ENABLED


SQL> select table_name,index_name,index_type,uniqueness
 2  from dba_indexes
 3  where owner='SCOTT';

TABLE_NAME INDEX_NAME           INDEX_TYPE UNIQUENESS
---------- -------------------- ---------- ------------------
DEPT       DEPT_DNAME_UK        NORMAL     UNIQUE <==
AUDIT_ACTI I_AUDIT_ACTIONS      NORMAL     UNIQUE
ONS

SQL> select table_name,index_name,column_position,column_name
 2  from dba_ind_columns
 3  where index_owner='SCOTT';

TABLE_NAME INDEX_NAME           COLUMN_POSITION COLUMN_NAME
---------- -------------------- --------------- ------------
DEPT       DEPT_DNAME_UK                      1 DNAME  <==  
AUDIT_ACTI I_AUDIT_ACTIONS                    1 ACTION
ONS

================================================================================================  

* Constraint Check

SQL> insert into scott.dept values(50,'HR','SEOUL');

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.dept values(50,'HR Dept','SEOUL');
insert into scott.dept values(50,'HR Dept','SEOUL')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_DEPT) violated

UK 값에 같은 값 insert하려다가 error가 난다.

================================================================================================  

* Constriaint 비활성화/활성화


SQL> alter table scott.dept
 2  disable constraint dept_dname_uk;

SQL> alter table scott.dept
 2  enable constraint dept_dname_uk;

================================================================================================  

* Deferred Constraint(?) ==> 자료좀 찾아보자..

================================================================================================  

* Constraint 삭제

alter table <테이블명> drop constraint

================================================================================================  


14. Loading Data

================================================================================================  

* 사용법

Usage: SQLLOAD keyword=value [,keyword=value,...]

Valid Keywords:

   userid -- ORACLE username/password
  control -- Control file name
      log -- Log file name
      bad -- Bad file name
     data -- Data file name
  discard -- Discard file name
discardmax -- Number of discards to allow          (Default all)
     skip -- Number of logical records to skip    (Default 0)
     load -- Number of logical records to load    (Default all)
   errors -- Number of errors to allow            (Default 50)
     rows -- Number of rows in conventional path bind array or between direct path data saves
              (Default: Conventional path 64, Direct path all)
 bindsize -- Size of conventional path bind array in bytes  (Default 65536)
   silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
   direct -- use direct path                      (Default FALSE)
  parfile -- parameter file: name of file that contains parameter specifications
 parallel -- do parallel load                     (Default FALSE)
     file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions  (Default FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable  (Default FALSE)
commit_discontinued -- commit loaded rows when load is discontinued  (Default FALSE)
 readsize -- Size of Read buffer                  (Default 1048576)

PLEASE NOTE: Command-line parameters may be specified either by
position or by keywords.  An example of the former case is 'sqlload
scott/tiger foo'; an example of the latter is 'sqlload control=foo
userid=scott/tiger'.  One may specify parameters by position before
but not after parameters specified by keywords.  For example,
'sqlload scott/tiger control=foo logfile=log' is allowed, but
'sqlload scott/tiger control=foo log' is not, even though the
position of the parameter 'log' is correct.

================================================================================================  
* case 별로 sqlldr을 사용하는법은  
http://technet.oracle.com/doc/server.815/a67792/ch04.htm#1364
에 자세히 나와있다. 그중 두가지 정도의 case만 기본적으로 다루어보자.

================================================================================================  

* case1 : data를 control file에 직접 입력하여 load하기

a. data 입력될 table 있어야함 (dept_tmp 라는 table을 생성하여 입력해보자)

SQL> create table dept_tmp as select * from dept;

Table created.

SQL> truncate table dept_tmp;

Table truncated.

b. control file을 구성한다.


load data
infile * ==> data 가 ctl file 끝에 있다는 의미
replace                   ==> 이게 없으면 빈테이블일때만 load된다.
into table dept_tmp
fileds terminated by ',' optionally enclosed by '"' ==> field 구분자와 "가 들어가면 빼고 입력된다.
(deptno,dname,loc)
begindata
12,research,"saratoga"
10,"accounting",cleveland
11,"art","salem"
13,finance,boston

c. 다음과 같이 sqlldr을 실행
oracle@swsvrctr:/home/oracle> sqlldr scott/tiger control=test.ctl log=test.log bad=test.bad
error가 생기면 log가 남고 loading 되지 않은 data만 bad file에 남는다.

================================================================================================  

* case 2 : Fixed-format records의 Loading

a. data 입력될 table 있어야함 (dept_tmp 라는 table을 생성하여 입력해보자)
SQL> create table emp_tmp as select * from emp;

Table created.

b. data file의 내용을 보고 그에 맞게 control file을 구성한다.

data file은 다음과 같다고 하자.

1111    joo     Manager         1111    19191.00        10
2222    hwang   salesman        2222    294974.50       20
3333    test    test            3333    4984.00         40
4444    kwon    engineer        4444    49.90           50

control file을 만들어보자.

load data
infile '/home/oracle/test.dat'
replace
into table emp_tmp

(empno position(01:04) integer external, ==> position을 일일이 맞추어 준다.
ename position(09:14) char,
job position(17:24) char,
mgr position(33:36) integer external,
sal position(41:49) decimal external,
comm position(51:54) decimal external,
deptno position(57:58) integer external)

주의 : data file의 data가 공백이 아닌 tab 으로 되어있으면 position에서 한칸으로 인식되니까 주의

c. 다음과 같이 sqlldr을 실행
home/oracle> sqlldr scott/tiger control=test.ctl data=test.dat log=test.log bad=test.bad

================================================================================================  


15. Reorganizing Data

================================================================================================  

* 오래 사용한 table 주로 DML성 문장이 자주 일어나 performance에 영향을 미치므로 주기적으로
 Reorganize 를 해주는것이 좋다.
 
 Export => table drop => import 순으로 한다.
 
 export 는 user 별로 table별로 받을 수 있다.
 
 a. Export

oracle@swsvrctr:/home/oracle> exp scott/tiger tables='dept,emp' file=test.dmp

Export: Release 8.1.6.0.0 - Production on Wed Jul 4 14:32:21 2001

(c) Copyright 1999 Oracle Corporation.  All rights reserved.


Connected to: Oracle8i Enterprise Edition Release 8.1.6.0.0, 64 bit - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
Export done in KO16KSC5601 character set and WE8ISO8859P1 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)

About to export specified tables via Conventional Path ...
. . exporting table                           DEPT          7 rows exported
. . exporting table                            EMP         14 rows exported
Export terminated successfully without warnings.

 b. drop table
 
oracle@swsvrctr:/home/oracle> sqlplus scott/tiger

SQL> drop table emp;
SQL> drop table dept;

 c. Import
 
oracle@swsvrctr:/home/oracle> imp scott/tiger tables='dept,emp' file=test.dmp

Import: Release 8.1.6.0.0 - Production on Wed Jul 4 14:34:25 2001

(c) Copyright 1999 Oracle Corporation.  All rights reserved.


Connected to: Oracle8i Enterprise Edition Release 8.1.6.0.0, 64 bit - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

Export file created by EXPORT:V08.01.06 via conventional path
import done in KO16KSC5601 character set and WE8ISO8859P1 NCHAR character set
import server uses WE8ISO8859P1 character set (possible charset conversion)
. importing SCOTT's objects into SCOTT
. . importing table                         "DEPT"          7 rows imported
. . importing table                          "EMP"         14 rows imported
About to enable constraints...
Import terminated successfully without warnings.


 d. 제대로 되었나 조회

SQL> select * from dept;
SQL> select * from emp;

================================================================================================  


16. Managing Password Security and Resources

================================================================================================  


* verify_function 생성을 위해 돌려줘야 할 script : $ORACLE_HOME/rdbms/admin/utlpwdmg.sql

  NAME
    utlpwdmg.sql - script for Default Password Resource Limits

  DESCRIPTION
    This is a script for enabling the password management features
    by setting the default password resource limits.

  NOTES
    This file contains a function for minimum checking of password
    complexity. This is more of a sample function that the customer
    can use to develop the function for actual complexity checks that the
    customer wants to make on the new password.

  MODIFIED   (MM/DD/YY)
  asurpur     04/17/97 - Fix for bug479763
  asurpur     12/12/96 - Changing the name of password_verify_function
  asurpur     05/30/96 - New script for default password management
  asurpur     05/30/96 - Created

================================================================================================  

* verify_function 생성 및 패스워드 관리기능 활성화

SQL> @$ORACLE_HOME/rdbms/admin/utlpwdmg

Function created.


Profile altered.

================================================================================================  

* 사용자 생성

utlpwdmg.sql script를 돌려 verify_function을 생성후 user를 생성할때는 몇가지를 check하여 좀더  
password 관리를 할 수 있도록 해준다.  
다음과 같이 user/passwd를 같게 하면 error가 나서 생성되지 않는다.

SQL> create user myuser identified by myuser
 2  default tablespace TS_USER1
 3  temporary tablespace TEMP;
create user myuser identified by myuser
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20001: Password same as user

다시 시도
SQL> create user myuser identified by mypasswd9$
 2  default tablespace ts_user1
 3  temporary tablespace temp;

User created.

SQL> grant connect,resource to myuser;

확인
SQL> connect myuser/mypasswd9$

================================================================================================  

* 패스워드 관리/ expire 시키기

SQL> alter user myuser password expire;

User altered.

admin이 강제로 expire시켰기 때문에 다음과 같이 password변경을 뭍는다.
SQL> connect myuser/mypassword9$
Changing password for test
New password:
Retype new password:
Password changed
Connected.

password를 또 규칙에 맞지 않게 넣으면 다음과 같은 error가 발생한다.

ERROR:
ORA-00988: missing or invalid password(s)

================================================================================================  

* dictionary 조회

SQL> select resource_name,limit from dba_profiles  
 2  where profile='DEFAULT' and resource_type='PASSWORD';

RESOURCE_NAME        LIMIT
-------------------- ---------------
FAILED_LOGIN_ATTEMPT 3
S

PASSWORD_LIFE_TIME   60
PASSWORD_REUSE_TIME  1800
PASSWORD_REUSE_MAX   UNLIMITED
PASSWORD_VERIFY_FUNC VERIFY_FUNCTION
TION

PASSWORD_LOCK_TIME   .0006
PASSWORD_GRACE_TIME  10

RESOURCE_NAME        LIMIT
-------------------- ---------------
FAILED_LOGIN_ATTEMPT 3
S

PASSWORD_LIFE_TIME   60
PASSWORD_REUSE_TIME  1800
PASSWORD_REUSE_MAX   UNLIMITED
PASSWORD_VERIFY_FUNC VERIFY_FUNCTION
TION

PASSWORD_LOCK_TIME   .0006
PASSWORD_GRACE_TIME  10

================================================================================================  


17. Managing Users

================================================================================================  

* OS 인증 : os에 login 한 id/passwd로 oracle의 id/passwd로 함께 사용하기 위한방법

a. user를 생성하는데 identified externally로 생성한다.

oracle@swsvrctr:/home/oracle> sqlplus internal
SQL> create user oracle identified externally
 2  default tablespace ts_user1
 3  temporary tablespace temp;

User created.

SQL> grant connect,resource to oracle;
SQL> revoke unlimited tablespace from oracle;
SQL> shutdown immediate

b. init.ora 에서 다음을 편집한다.(추가)
os_authent_prefix=""

c. startup하고 확인해본다.

SQL> startup
SQL> exit
oracle@swsvrctr:/home/oracle> sqlplus / ==> id/passwd를 넣을 필요없이 접속

SQL> select user from dual;

USER
------------------------------------------------------------
ORACLE

제대로 접속이 된다.

================================================================================================  

* tablespace 사용량 통제

SQL> connect internal
Connected.
SQL> col tablespacename format a10
SQL> col username format a10
SQL> alter user oracle quota 20k on ts_user1;  ==> oracle user는 ts_user1에 20k 만 사용 가능하다.

User altered.

SQL> select * from dba_ts_quotas;

TABLESPACE_NAME                                              USERNAME
------------------------------------------------------------ ----------
    BYTES  MAX_BYTES     BLOCKS MAX_BLOCKS
---------- ---------- ---------- ----------
TS_USER1                                                     ORACLE
        0      20480          0          5

SQL> connect /
Connected.
SQL> select user from dual;

USER
------------------------------------------------------------
ORACLE

SQL> create table test
 2  (id number(10))
 3  (tablespace ts_user1
 4  storage(initial 20k)
 
까지는 생성이 되나 다음과 같이 늘리려고 하면 error가 난다.

SQL> alter table test allocate extent(size 4k); ==> error

================================================================================================  


18. Managing Privileges

================================================================================================  

* with grant option과 with admin option  

(둘다 실행 권한을 받은 user가 다시 실행 권한을 다른 user에게 줄 수 있게 해주는 option이다.)
-- 차이는 with admin option으로 권한을 받은 user1이 다른 user2에게 권한을 부여한 후 user1으로부터
  권한을 revoke하면 user1의 권한만 revoke되나
  with grant option으로 부여하면 user1에게 revoke 될 시 user2의 권한도 cascade로 revoke된다.


oracle@swsvrctr:/home/oracle> sqlplus internal

SQL> col grantor format a10
SQL> col grantee format a10
SQL> col table_name format a10
SQL> col table_schema format a10
SQL> col privilege format a25
SQL> grant create user to scott with admin option; ==> with admin option으로 권한 부여후
SQL> connect scott/tiger
SQL> grant create user to oracle; ==> 다시 oracle 에게 같은 권한 부여후
SQL> connect internal
SQL> select * from dba_sys_privs
 2  where grantee in ('SCOTT','ORACLE');

GRANTEE    PRIVILEGE                 ADMIN_
---------- ------------------------- ------
ORACLE     CREATE USER               NO
SCOTT      CREATE USER               YES
SCOTT      UNLIMITED TABLESPACE      NO

SQL> revoke create user from scott; ==> scott의 권한을 revoke
SQL> select * from dba_sys_privs
 2  where grantee in ('SCOTT','ORACLE');

GRANTEE    PRIVILEGE                 ADMIN_
---------- ------------------------- ------
ORACLE     CREATE USER               NO ==> scott의 create user 권한만 revoke되었다.  
SCOTT      UNLIMITED TABLESPACE      NO     oracle권한은 그대로

SQL> grant select on dept to oracle with grant option; ==> with grant option 으로 권한 부여후
SQL> connect /
SQL> create user myuser identified by myuser1$
 2  default tablespace ts_user1
 3  temporary tablespace temp;

SQL> grant select on scott.dept to myuser; ==> 다시 같은 권한을 다른 myuser에게 부여

Grant succeeded.

SQL> select * from all_tab_privs
 2  where table_name='DEPT';

GRANTOR    GRANTEE    TABLE_SCHE TABLE_NAME PRIVILEGE                 GRANTA
---------- ---------- ---------- ---------- ------------------------- ------
SCOTT      ORACLE     SCOTT      DEPT       SELECT                    YES
ORACLE     MYUSER     SCOTT      DEPT       SELECT                    NO

SQL> revoke select on dept from oracle; ==> oracle의 권한을 revoke

Revoke succeeded.

SQL> select * from all_tab_privs           ==> with grant option으로 생성된 이하 myuser의 권한도
 2  where table_name='DEPT';      revoke 되었다.

no rows selected


================================================================================================  

* Database Auditing : user 사용 시간정보 확인, 동시사용자측정 등 여러가지에 필요

SQL> connect internal
SQL> shutdown immediate

init.ora file에서 편집
audit_trail = true            # if you want auditing ==> 주석기호(#) 삭제

SQL> startup

SQL> show parameter audit_trail
NAME                                 TYPE     VALUE                          
------------------------------------ -------------- ------------------------------
audit_trail                          string         TRUE

SQL> audit connect;
SQL> select * from dba_stmt_audit_opts;
USER_NAME            PROXY_NAME           AUDIT_OPTION    SUCCESS    FAILURE
-------------------- -------------------- --------------- ---------- ----------
                                         CREATE SESSION  BY ACCESS  BY ACCESS
                                         
SQL> connect scott/tiger
SQL> connect scott/fail
SQL> connect internal
SQL> select username,timestamp,action_name,logoff_time,returncode
 2  from dba_audit_session;

USERNAME   TIMESTAMP ACTION_NAME     LOGOFF_TI RETURNCODE
---------- --------- --------------- --------- ----------
SCOTT      05-JUL-01 LOGOFF          05-JUL-01          0 ==> login 성공하면 0 return
SCOTT      05-JUL-01 LOGON                           1017 ==> login 실패한 returncode

SQL> shutdown

파라미터 이전대로 돌려두자(#audit_trail=true : 주석처리)

SQL> startup 하고
SQL> show parameter audit_trail
NAME                                 TYPE     VALUE                          
------------------------------------ -------------- ------------------------------
audit_trail                          string         NONE

================================================================================================  


19. Managing Roles

================================================================================================  

* Role

resource role에 포함된 권한을 살펴보자
SQL> select  * from dba_sys_privs
 2  where grantee='RESOURCE';
 

GRANTEE    PRIVILEGE            ADMIN_
---------- -------------------- ------
RESOURCE   CREATE CLUSTER       NO
RESOURCE   CREATE INDEXTYPE     NO
RESOURCE   CREATE OPERATOR      NO
RESOURCE   CREATE PROCEDURE     NO
RESOURCE   CREATE SEQUENCE      NO
RESOURCE   CREATE TABLE         NO
RESOURCE   CREATE TRIGGER       NO
RESOURCE   CREATE TYPE          NO

8 rows selected.

다음은 dev라는 role을 만들어서
SQL> create role dev;
SQL> grant create table,create view to dev;
SQL> grant select on emp to dev;
SQL> connect internal

oracle이라는 user에게 dev,resource role, create session권한 부여
SQL> connect internal
SQL> grant dev to oracle;
SQL> grant resource to oracle;
SQL> grant create session to oracle;
SQL> alter user oracle default role resource;            ==> session의 연결 끊김에 상관없이 지속적으로
SQL> grant select_catalog_role to oracle;                logon 후 resource role이 enable되게 함
                                                            (set 할 필요 없이)
SQL> select segment_name,status from  dba_rollback_segs; ==> 현재 session에서 select_catalog_role이  
select segment_name,status from  dba_rollback_segs           disabled됨
                                *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> set role select_catalog_role; ==> set은 현재session에서 role을 사용가능하게 해줌.
   이를 위해 이 role은 이미 user에게 grant 되어있어야함.
SQL> select segment_name,status from  dba_rollback_segs;

--------------- --------------------------------
SEGMENT_NAME    STATUS
SYSTEM          ONLINE
RBS1            ONLINE
RBS2            ONLINE

================================================================================================  


20. Using National Language Support

================================================================================================  

* sysdate format 변경

SQL> connect internal
SQL> select sysdate from dual;

SYSDATE
---------
05-JUL-01

SQL> alter session set nls_date_format='YY/MM/DD:HH24:MI:SS';
SQL> select sysdate from dual;

SYSDATE
-----------------
01/07/05:12:25:37

================================================================================================  

* Character set 변경하고 한글명 table 만들기
-- 가급적 한글명 table은 만들지 않는것이 좋으나 만들수 없는것은 아니다.

SQL> create table scott.부서 as select scott.dept;
create table scott.부서 as select scott.dept
                  *
ERROR at line 1:
ORA-00911: invalid character ==> 테이블명이 한글이어서 error난다.


* Database Characterset을 변경해 보자. ==> 매우 조심스러운 작업
    (DATA 보존 못할 위험성 있다.backup 필요)

SQL> select * from nls_database_parameters ==> nls_database_parameters 에서 현재 DB의  
 2  where parameter like '%CHARACTERSET%';     characterset관련을 parameter를 확인
 
PARAMETER                 VALUE
------------------------- --------------------
NLS_CHARACTERSET          WE8ISO8859P1
NLS_NCHAR_CHARACTERSET    WE8ISO8859P1

SQL> select value from v$nls_valid_values ==> 234건의 data가 있다.
 2  where parameter like '%CHARACTERSET';

-- warning : character set을 변경 할수는 있지만 기존에 들어가있는 데이타에 대해서는 책임 못짐.

a.  
SQL> shutdown immediate
SQL> connect internal
SQL> startup mount exclusive;
SQL> alter system enable restricted session;
SQL> alter database open;

b.  
SQL> alter database character set ko16ksc5601;
SQL> alter database national chartacter charcter set ko16ksc5601;
-- 확인
SQL> select * from nls_database_parameters ==> nls_database_parameters 에서 현재 DB의  
 2  where parameter like '%CHARACTERSET%';     characterset관련을 parameter를 확인

shutdown immediate;

c. .profile edit
NLS_LANG=Amerian_America.us7ascii; export NLS_LANG을
NLS_LANG=korean_korea.ko16ksc5601; export NLS_LANG로 변경

d. Database startup

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 12:14
반응형

시나리오 13
ARCHIVE LOG MODE, OFFLINE BACKUP
원인 :INACTIVE한 REDO LOG GROUP 유실

--1.정상 운영중

SQL> SELECT * FROM SCOTT.DEPT1;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
         1 S1                   S1
         3 S3                   S3
         4 S4                   S4
         5 S5                   S5
         6 S6                   S6
         7 S7                   S7
         9 B9                   B9
        10 S10                  S10
        11 S11                  S11
        12 S12                  S12

10 개의 행이 선택되었습니다.

SQL> INSERT INTO SCOTT.DEPT1 VALUES (13,'S13','S13');

1 개의 행이 만들어졌습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> SELECT GROUP#,SEQUENCE#,ARCHIVED,STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         32 YES INACTIVE
         2         33 NO  CURRENT
         3         31 YES INACTIVE

--CURRENT는 언제나 NO ARC
SQL> ALTER SYSTEM SWITCH LOGFILE;

시스템이 변경되었습니다.

SQL> SELECT GROUP#,SEQUENCE#,ARCHIVED,STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         32 YES INACTIVE
         2         33 YES ACTIVE
        3         34 NO  CURRENT

3 개의 행이 선택되었습니다.

--CURRENT 3 ,  2번이 액티브되었다
--INSERT 명령은 LSN 33에 저장
SQL> SELECT GROUP#,MEMBER FROM V$LOGFILE;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
         3
C:\ORACLE\ORADATA\ORCL\REDO03.LOG

         2
C:\ORACLE\ORADATA\ORCL\REDO02.LOG

         1
C:\ORACLE\ORADATA\ORCL\REDO01.LOG


--INACTIVE 1

SQL> HOST DEL C:\ORACLE\ORADATA\ORCL\REDO01.LOG

SQL> @LOGSWITCH
ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03113: 통신 채널에 EOF 가 있습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


ALTER SYSTEM SWITCH LOGFILE
*
1행에 오류:
ORA-03114: ORACLE에 연결되어 있지 않습니다


SQL> --INACTIVE 는 신경쓰지않는파일
SQL> EXIT
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production에서 분리되었습니다.

C:\Documents and Settings\easy>STARTUP
'STARTUP'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.

C:\Documents and Settings\easy>SYS

C:\Documents and Settings\easy>SQLPLUS "SYS/ORACLE AS SYSDBA"

SQL*Plus: Release 9.2.0.1.0 - Production on 월 Jun 16 14:50:29 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

휴지 인스턴스에 접속되었습니다.

SQL> STARTUP
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.
ORA-00313: 로그 그룹 1 (스레드 1의)의 멤버를 여는데 실패했습니다
ORA-00312: 온라인 로그 1 스레드 1: 'C:\ORACLE\ORADATA\ORCL\REDO01.LOG'


SQL> SELECT GROUP#,SEQUENCE#,ARCHIVED,STATUS FROM V$LOG;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          0 YES UNUSED  //한번도 쓴적이 없다는뜻
         2         33 YES INACTIVE
         3         34 NO  INVALIDATED

--장애의 원인 1그룹
ALERT,TRACE파일 읽어보면 오류나온다

--3.복구
ARCHIVE LOG FILE은 존재함으로 사용자의 명령어는 잘보관
--삭제후 재생성

--GROUP삭제
SQL> ALTER DATABASE
  2  DROP LOGFILE GROUP 1;

데이타베이스가 변경되었습니다.

--재생성
SQL> ALTER DATABASE
  2  ADD LOGFILE GROUP 1 'C:\ORACLE\ORADATA\ORCL\REDO01.LOG'
  3  SIZE 100M;

데이타베이스가 변경되었습니다.

SQL> ALTER DATABASE OPEN;

데이타베이스가 변경되었습니다.

--4.확인
SQL> SELECT * FROM SCOTT.DEPT1;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
         1 S1                   S1
         3 S3                   S3
         4 S4                   S4
         5 S5                   S5
         6 S6                   S6
         7 S7                   S7
         9 B9                   B9
        10 S10                  S10
        11 S11                  S11
        12 S12                  S12
        13 S13                  S13

11 개의 행이 선택되었습니다.

--백업
SQL> @OFFBACKUP

HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL01.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL02.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL03.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\DRSYS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\INDX01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\ODM01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\TOOLS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\USERS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\XDB01.DBF C:\OFFBACKUP

HOST COPY C:\ORACLE\ORADATA\ORCL\TEMP01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO03.LOG C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO02.LOG C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO01.LOG C:\OFFBACKUP
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

시나리오 14
ARCHIVE LOG MODE, OFFLINE BACKUP
원인 : CURRENT REDO LOG GROUP 유실

--1.정상 운영중
SQL> SELECT GROUP#,SEQUENCE#,ARCHIVED,STATUS FROM V$LOG;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         35 NO  CURRENT
         2         33 YES INACTIVE
         3         34 YES INACTIVE

3 개의 행이 선택되었습니다.

SQL> SAVE REDO
file REDO.sql(이)가 생성되었습니다
--CURRENT:1
SQL> INSERT INTO SCOTT.DEPT1 VALUES(14,'S14','S14');

1 개의 행이 만들어졌습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> ALTER SYSTEM SWITCH LOGFILE;

시스템이 변경되었습니다.

SQL> @REDO

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         35 YES ACTIVE
         2         36 NO  CURRENT
         3         34 YES INACTIVE

3 개의 행이 선택되었습니다.

SQL> ALTER SYSTEM SWITCH LOGFILE;

시스템이 변경되었습니다.

SQL> @REDO

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         35 YES ACTIVE
         2         36 YES ACTIVE
         3         37 NO  CURRENT

3 개의 행이 선택되었습니다.

--CURRENT 3
SQL> INSERT INTO SCOTT.DEPT1 VALUES(14,'A14','A14');

1 개의 행이 만들어졌습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

--2. 장애 유도
SQL> SELECT GROUP#,SEQUENCE#,ARCHIVED,STATUS FROM V$LOG;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         35 YES INACTIVE
         2         36 YES INACTIVE
         3         37 NO  CURRENT

3 개의 행이 선택되었습니다.

SQL> SELECT GROUP#,MEMBER FROM V$LOGFILE;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
        3
C:\ORACLE\ORADATA\ORCL\REDO03.LOG

         2
C:\ORACLE\ORADATA\ORCL\REDO02.LOG

         1
C:\ORACLE\ORADATA\ORCL\REDO01.LOG


3 개의 행이 선택되었습니다.

--CURRENT 3:
SQL> SHUTDOWN ABORT

ORACLE 인스턴스가 종료되었습니다.
SQL> EXIT
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production에서 분리되었습니다.

C:\Documents and Settings\easy>DEL C:\ORACLE\ORADATA\ORCL\REDO03.LOG

C:\Documents and Settings\easy>SQLPLUS "SYS/ORACLE AS SYSDBA"

SQL*Plus: Release 9.2.0.1.0 - Production on 월 Jun 16 15:17:36 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

휴지 인스턴스에 접속되었습니다.


SQL> STARTUP
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.
ORA-00313: 로그 그룹 3 (스레드 1의)의 멤버를 여는데 실패했습니다
ORA-00312: 온라인 로그 3 스레드 1: 'C:\ORACLE\ORADATA\ORCL\REDO03.LOG'
ORA-27041: 파일을 열 수 없습니다
OSD-04002: 파일을 열 수 없음
O/S-Error: (OS 2) 지정된 파일을 찾을 수 없습니다.
//로그 그룹3 CURRENT가 이상하다


SQL> @REDO

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         35 YES INACTIVE
         2         36 YES INACTIVE
         3         37 NO  CURRENT

//불완전복구를해야한다

--3.복구
불완전 복구

SQL> HOST COPY C:\OFFBACKUP\*.DBF C:\oracle\oradata\ORCL
C:\OFFBACKUP\CWMLITE01.DBF
C:\OFFBACKUP\DRSYS01.DBF
C:\OFFBACKUP\EXAMPLE01.DBF
C:\OFFBACKUP\INDX01.DBF
C:\OFFBACKUP\ODM01.DBF
C:\OFFBACKUP\SYSTEM01.DBF
C:\OFFBACKUP\TEMP01.DBF
C:\OFFBACKUP\TOOLS01.DBF
C:\OFFBACKUP\UNDOTBS01.DBF
C:\OFFBACKUP\USERS01.DBF
C:\OFFBACKUP\XDB01.DBF
       11개 파일이 복사되었습니다.

--아카이브있는곳까지 복구

사용자 삽입 이미지
//아카이브로그파일은 36번까지있다

SQL> RECOVER DATABASE UNTIL CANCEL
ORA-00279: 변환 291681가 (06/16/2008 14:55:40에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00035.ARC
ORA-00280: 변환 291681(스레드 1를 위한)가 시퀀스번호 35에 있습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 변환 293975가 (06/16/2008 15:12:39에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00036.ARC
ORA-00280: 변환 293975(스레드 1를 위한)가 시퀀스번호 36에 있습니다
ORA-00278: 이 복구를 위해 로그 'C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00035.ARC'
파일은 더이상 필요하지 않습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 변환 294145가 (06/16/2008 15:13:47에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00037.ARC
ORA-00280: 변환 294145(스레드 1를 위한)가 시퀀스번호 37에 있습니다
ORA-00278: 이 복구를 위해 로그 'C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00036.ARC'
파일은 더이상 필요하지 않습니다. //더이상 복구하면 파일이없어 에러날것이다.


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 아카이브된 로그 'C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00037.ARC'를 열
수 없습니다
ORA-27041: 파일을 열 수 없습니다
OSD-04002: 파일을 열 수 없음
O/S-Error: (OS 2) 지정된 파일을 찾을 수 없습니다.

//다시 실행해서 CANCEL 해준다.
SQL> RECOVER DATABASE UNTIL CANCEL
ORA-00279: 변환 294145가 (06/16/2008 15:13:47에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : C:\ORACLE\ORADATA\ORCL\ARCHIVE\ARCH00037.ARC
ORA-00280: 변환 294145(스레드 1를 위한)가 시퀀스번호 37에 있습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
매체 복구가 취소되었습니다.

SQL> ALTER DATABASE OPEN RESETLOGS;

데이타베이스가 변경되었습니다.

--4.확인

사용자 삽입 이미지

//REDO03.LOG가 복구되어있다.

SQL> SELECT * FROM SCOTT.DEPT1;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
         1 S1                   S1
         3 S3                   S3
         4 S4                   S4
         5 S5                   S5
         6 S6                   S6
         7 S7                   S7
         9 B9                   B9
        10 S10                  S10
        11 S11                  S11
        12 S12                  S12
        13 S13                  S13

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        14 S14                  S14  //불완전 복구 'A14'는 복구되지않았다.

12 개의 행이 선택되었습니다.

--5.백업 !!(불완전복구이므로 반드시)
SQL> @LOGSWITCH

시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.


시스템이 변경되었습니다.

SQL> @OFFBACKUP

HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL01.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL02.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CONTROL03.CTL C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\DRSYS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\INDX01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\ODM01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\TOOLS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\USERS01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\XDB01.DBF C:\OFFBACKUP

HOST COPY C:\ORACLE\ORADATA\ORCL\TEMP01.DBF C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO03.LOG C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO02.LOG C:\OFFBACKUP
HOST COPY C:\ORACLE\ORADATA\ORCL\REDO01.LOG C:\OFFBACKUP
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

        1개 파일이 복사되었습니다.

ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 12:12
반응형
  
오라클9i 데이타베이스 초기화 매개변수(전부) 설명 |
2006.01.24 14:01

========================================
오라클9i 데이타베이스 초기화 매개변수(전부) 설명
========================================
이거는 Oracle DataBase Release 2 (9.2.0.1) 버전꺼 임돠...


07_DICTIONARY_ACCESSIBILITY
설명    : Oracle7에서 Oracle8i로 이전할 때 주로 사용됩니다. TRUE로 설정된 경우 S
ELECT ANY TABLE과 같은 SYSTEM 권한은 SYS 스키마의 객체에 대한 액세스를 제한하지
않습니다. (Oracle7 기능) FALSE인 경우 사용자는 SELECT_CATALOG_ROLE, EXECUTE_CATA
LOG_ROLE 또는 DELETE_CATALOG_ROLE을 부여 받았을 때만 SYS 스키마 객체에 액세스할
수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE

A
active_instance_count
설명    : 2개의 인스턴스로 이루어진 클러스터에서 사용자가 하나의 인스턴스를 기본 인스턴스로 지정하고 나머지 인스턴스를 보조 인스턴스로 지정할 수 있도록 합니다.
이 매개변수는 2개 이상의 인스턴스가 포함된 클러스터에서는 기능을 수행하지 않습니다.
사용 가능한 값: 1 또는 >= 클러스터의 인스턴스 수입니다.
기본값  : 없음

aq_tm_processes
설명    : 0보다 클 경우 대기열 메시지에 대한 시간 모니터링이 활성화됩니다. 시간은 응용 프로그램 개발에 사용되는 지연 및 만료 등록정보를 지정하는 메시지에 사용할 수 있습니다.
사용 가능한 값: 0 - 10
기본값  : 0

archive_lag_target
설명: 이 매개변수는 시간 기반의 스레드 고급 기능과 관련됩니다.
사용 가능한 값: 0 또는 [60, 7200]의 모든 정수입니다.
기본값: 기본값은 0으로 시간 기반의 스레드 고급 기능을 비활성화합니다. 그렇지 않
은 경우 값은 초 단위의 숫자로 표시됩니다.

audit_file_dest
설명    : 데이터베이스에 대한 모든 SYSDBA 또는 INTERNAL 접속이 이 디렉토리에 감
사 파일을 생성합니다. (UNIX의 경우에만)
사용 가능한 값: 유효한 임의 디렉토리 이름
기본값  : ORACLE_HOME/rdbms/audit

audit_trail
설명    : 데이터베이스 감사 기능을 활성화하거나 비활성화합니다. 감사 레코드는 매
개변수 값이 TRUE 또는 DB일 경우에는 SYS.AUD$ 테이블에 기록되고 매개변수 값이 OS
인 경우에는 운영 체제 파일에 기록됩니다.
사용 가능한 값: NONE | FALSE | DB | TRUE | OS
기본값  : NONE


B
background_core_dump
설명    : 생성된 코어 파일에 SGA 정보를 덤프할지 여부를 지정합니다. (UNIX의 경우
)
사용 가능한 값: FULL | PARTIAL
기본값  : FULL

background_dump_dest
설명    : Oracle 작업 중 백그라운드 프로세스(LGWR, DBW n 등)에 대한 추적 파일을
기록할 경로명(디렉토리 또는 디스크)을 지정합니다. 또한 중요한 이벤트 및 메시지를
 기록하는 데이터베이스 경보 파일의 위치를 정의합니다.
사용 가능한 값: 유효한 임의 디렉토리 이름입니다.
기본값  : ORACLE_HOME/rdbms/log (운영 체제에 따라 다름)

backup_tape_io_slaves
설명    : Recovery Manager 매개변수로 서버 프로세스 또는 추가 입출력 슬래이브를
사용하여 테이프를 읽거나 테이프에 기록할지 결정합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

bitmap_merge_area_size
설명    : 인덱스의 범위 스캔을 통해 읽어들인 비트맵을 병합하는 데 사용되는 메모
리 크기를 지정합니다.
사용 가능한 값: 시스템에 따라 다릅니다.
기본값  : 1MB

blank_trimming
설명    : TRUE 값을 지정하면 원본 길이가 대상 길이보다 길더라도 데이터를 할당할
수 있습니다. (SQL92 호환)
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

buffer_pool_keep
설명    : 객체를 메모리에 보존하여 입출력을 감소시키는데 목적이 있는 DB_BLOCK_BU
FFERS에서 할당된 유지 풀 크기입니다.
사용 가능한 값: 특정 문자열 값입니다. (예:. buffers:400, lru_latches:3)
기본값  : 없음

buffer_pool_recycle
설명    : 객체를 사용한 후 제거하여 메모리를 재사용하기 위해 DB_BLOCK_BUFFERS에
서 할당한 재생 풀 크기입니다.
사용 가능한 값: 특정 문자열 값입니다. (예: buffers:50, lru_latches:1)
기본값  : 없음


C
circuits
설명    : 수신 및 송신 네트워크 세션에 대해 사용 가능한 가상 회로의 총 수를 지정
합니다. 이 값은 인스턴스의 전체 SGA 요구 사항을 구성하는 몇몇 매개변수 중의 하나
입니다.
기본값  : 파생: 공유 서버 구조를 사용하는 경우 SESSIONS 매개변수 값. 그렇지 않은
 경우 0

cluster_database
설명: CLUSTER_DATABASE를 TRUE로 설정하여 Real Application 클러스터 옵션을 활성화
합니다.
사용 가능한 값: TRUE | FALSE
기본값: FALSE

cluster_database_instances
설명: 클러스터 데이터베이스의 일부로 현재 구성되어 있는 인스턴스의 수입니다. 이
값은 구성된 인스턴스 수에 따라 달라지는 SGA 구조의 크기를 결정할 때 사용됩니다.
이 매개변수를 제대로 설정하면 SGA의 메모리 사용이 개선됩니다. 여러 매개변수는 이
 값을 사용하여 계산됩니다.
사용 가능한 값: 0이 아닌 값입니다.
기본값: 1

cluster_interconnects
설명: Real Application 클러스터 환경에서 사용할 수 있는 추가 상호 접속입니다. 단
일 상호 접속이 클러스터 데이터베이스의 대역폭 요구 사항을 충분히 만족시키지 않을
 때 이 매개변수를 설정해야 합니다. 이 매개변수를 설정하지 않으면 Oracle은 Oracle
9i Real Application 클러스터 상호 노드 통신에 대한 해당 상호 접속을 확인하는 현
재 의미를 보존합니다. 
사용 가능한 값: 콜론으로 구분된 하나 이상의 IP 주소입니다.
기본값: NONE

compatible
설명    : 이전 릴리스와의 역호환성을 보증하는 동시에 새 릴리스를 사용할 수 있습
니다.
사용 가능한 값: 현재 릴리스를 기본값으로 합니다.
기본값  : 릴리스에 따라 다름

commit_point_strength
설명    : 이 값은 분산 트랜잭션에서 커밋 위치 사이트를 결정합니다.
사용 가능한 값: 0-255 
기본값  : 운영 체제에 따라 다름

control_files
설명    : 하나 이상의 제어 파일 이름을 지정합니다. Oracle은 서로 다른 장치 또는
OS 파일 이중화에 대해 여러 개의 파일을 사용하도록 권장합니다.
사용 가능한 값: 1 - 8 파일 이름입니다. (경로명 포함)
기본값  : 운영 체제에 따라 다름

constrol_file_record_keep_time
설명    : 제어 파일의 재사용 가능 섹션에 있는 레코드를 유지해야 하는 최소 기간(
일 수)입니다.
사용 가능한 값: 0 - 365
기본값  : 7

core_dump_dest
설명    : 코어 덤프 위치를 지정하는 디렉토리 이름입니다. (UNIX의 경우)
사용 가능한 값: 유효한 임의 디렉토리 이름입니다.
기본값  : ORACLE_HOME/dbs

cpu_count
설명    : Oracle이 다른 매개변수 값을 계산하는 데 사용할 수 있는 CPU 수입니다.
이 값은 변경하지 마십시오.
사용 가능한 값: 0 - 무제한입니다.
기본값  : Oracle이 자동으로 설정함

create_bitmap_area_size
설명    : CREATE_BITMAP_AREA_SIZE가 비트맵 인덱스 작성에 할당된 메모리 크기를 지
정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 8 MB

cusor_space_for_time
설명    : 공유 SQL 영역을 커서가 참조하는 동안 공유 풀에 유지할지 또는 일정 시간
이 지난 후 삭제할지 결정합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE(일정 시간 후 삭제됨)

cursor_sharing
설명    : 최종적으로 동일한 공유 커서를 공유할 수 있는 SQL 문의 종류를 제어합니
다.
사용 가능한 값:
 FORCE: 일부 리터럴이 다르지만 명령문의 의미에는 영향을 주지 않고 나머지는 동
일한 경우 명령문이 커서를 공유하도록 합니다.
 EXACT: 동일한 SQL 문만 커서를 공유하도록 합니다.
기본값  : EXACT


D
db_2k_cache_size
설명: 2K 버퍼에 대한 캐시 크기를 지정합니다. db_block_size가 2K가 아닌 다른 값을
 가지는 경우에만 매개변수를 설정할 수 있습니다.
사용 가능한 값: 0M 또는 적어도 16M입니다. 플랫폼별 블록 크기 제한 사항이 적용됩
니다.
기본값: 0M

db_4k_cache_size
설명: 4K 버퍼에 대한 캐시 크기를 지정합니다. db_block_size가 4K가 아닌 다른 값을
 가지는 경우에만 매개변수를 설정할 수 있습니다.
사용 가능한 값: 0M 또는 적어도 16M입니다. 플랫폼별 블록 크기 제한 사항이 적용됩
니다.
기본값: 0M

db_8k_cache_size
설명: 8K 버퍼에 대한 캐시 크기를 지정합니다. db_block_size가 8K가 아닌 다른 값을
 가지는 경우에만 매개변수를 설정할 수 있습니다.
사용 가능한 값: 0M 또는 적어도 16M입니다. 플랫폼별 블록 크기 제한 사항이 적용됩
니다.
기본값: 0M

db_16k_cache_size
설명: 16K 버퍼에 대한 캐시 크기를 지정합니다. db_block_size가 16K가 아닌 다른 값
을 가지는 경우에만 매개변수를 설정할 수 있습니다.
사용 가능한 값: 0M 또는 적어도 16M입니다. 플랫폼별 블록 크기 제한 사항이 적용됩
니다.
기본값: 0M

db_32k_cache_size
설명: 32K 버퍼에 대한 캐시 크기를 지정합니다. db_block_size가 32K가 아닌 다른 값
을 가지는 경우에만 매개변수를 설정할 수 있습니다.
사용 가능한 값: 0M 또는 적어도 16M입니다. 플랫폼별 블록 크기 제한 사항이 적용됩
니다.
기본값: 0M

db_block_buffers
설명    : 버퍼 캐시의 Oracle 블록 수입니다. 이 매개변수 값은 인스턴스에 대한 전
체 SGA 크기에 중요한 영향을 줍니다.
사용 가능한 값: 4 - 운영 체제에 따라 다릅니다.
기본값  : 32768

db_block_checking
설명    : 트랜잭션 관리 블록의 손상 여부를 확인할지 제어할 때 사용됩니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

db_block_checksum
설명    : 읽거나 기록한 모든 데이터 블록에 대해 DBWn, ARCH, SQL*Loader가 블록 체
크섬을 계산 또는 확인할지 지정합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

db_block_size
설명    : 오라클 데이터베이스 블록의 크기(바이트)입니다. 이 값은 데이터베이스 생
성 시 설정되며 이후에는 변경할 수 없습니다.
사용 가능한 값: 1024 - 65536입니다. (운영 체제에 따라 다름)
기본값  : 2048(운영 체제에 따라 다름)

db_cache_advice
설명: 다른 캐시 크기를 사용한 예상 작업에 대한 통계 수집을 활성화 및 비활성화합
니다. 정보는 V$DB_CACHE_ADVICE 뷰에 수집됩니다.
사용 가능한 값: OFF--권고가 해제되고 권고에 대한 메모리는 할당되지 않습니다. ON-
-권고가 설정됩니다. (예: CPU 및 메모리 오버헤드가 모두 초래됩니다.) READY--권고
가 해제되지만 권고에 대한 메모리는 할당된 상태로 유지됩니다.
기본값: OFF

db_cache_online_log_dest_1

db_cache_online_log_dest_2

db_cache_online_log_dest_3

db_cache_online_log_dest_4

db_cache_online_log_dest_5
설명: 온라인 로그 및 제어 파일 생성에 대한 기본 위치를 설정합니다. 기본값은 온라
인 로그 또는 제어 파일 생성 중에 파일 이름이 지정되지 않을 때마다 사용됩니다.
사용 가능한 값: 파일 시스템 디렉토리 이름입니다. 디렉토리가 존재해야 합니다. 디
렉토리는 Oracle이 해당 디렉토리에 파일을 생성할 수 있도록 하는 권한을 가져야 합
니다.

db_cache_size
설명: 표준 블록 크기 버퍼에 대한 캐시 크기를 지정합니다.
사용 가능한 값: 적어도 16M입니다.
기본값: 48M

db_create_file_dest
설명: 데이터 파일, 제어 파일 및 온라인 로그 생성에 대한 기본 위치를 설정합니다.
사용 가능한 값: 파일 시스템 디렉토리 이름입니다. 디렉토리가 존재해야 합니다. 디
렉토리는 Oracle이 해당 디렉토리에 파일을 생성할 수 있도록 하는 권한을 가져야 합
니다.

db_domain
설명    : 도메인에 고유한 데이터베이스 이름을 작성하기 위해 권장하는 데이터베이
스 이름의 확장자를 지정합니다. (예: US.ORACLE.COM)
사용 가능한 값: 마침표로 구분된 임의의 문자열로 최대 길이가 128자입니다.
기본값  : WORLD

db_files
설명    : 데이터베이스에 대해 열 수 있는 데이터베이스 파일의 최대 개수입니다.
사용 가능한 값: MAXDATAFILES - 운영 체제에 따라 다릅니다.
기본값  : 운영 체제에 따라 다름 (예: Solaris의 경우 200)

db_file_multiblock_read_count
설명    : 전체 순차 스캔 관련 입출력 작업을 하는 동안 읽어온 최대 블록 수입니다.
 
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 8

db_file_name_convert
설명    : 기본 데이터베이스 상의 새 데이터 파일 이름을 대기 데이터베이스 상의 파
일 이름으로 변환합니다.
사용 가능한 값: 유효한 기본/대기 디렉토리 및 파일 이름 쌍입니다.
기본값  : 없음

db_keep_cache_size
설명: KEEP 버퍼 풀의 버퍼 수를 지정합니다. KEEP 버퍼 풀의 버퍼 크기는 기본 블록
크기(블록 크기는 db_block_size에 의해 정의됨)입니다.
사용 가능한 값: 0 또는 적어도 하나의 미립자 크기(더 작은 값은 미립자 크기로 자동
으로 반올림됨)입니다.
기본값: 0M

db_name
설명    : CREATE DATABASE 문에 지정된 이름과 동일한 데이터베이스 식별자입니다.
사용 가능한 값: 최대 8자의 유효한 임의의 이름입니다.
기본값  : 없음(지정해야 함)

db_recycle_cache_size
설명: RECYCLE 버퍼 풀의 크기를 지정합니다. RECYCLE 풀의 버퍼 크기는 기본 블록 크
기입니다.
사용 가능한 값: 0 또는 적어도 하나의 미립자 크기(더 작은 값은 미립자 크기로 자동
으로 반올림됨)입니다.
기본값: 0M

db_writer_processes
설명    : 인스턴스에 대한 데이터베이스 기록자 프로세스의 초기 개수입니다. DBWR_I
O_SLAVES를 사용하는 경우 하나의 데이터베이스 기록자만 사용됩니다.
사용 가능한 값: 1 - 10
기본값  : 1

dblink_encrypt_login
설명    : 다른 Oracle 서버에 접속 중일 때 데이터베이스 링크에 암호화된 암호를 사
용할지 지정합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

dbwr_io_slaves
설명    : DBW0 프로세스가 사용하는 입출력 슬래이브의 수입니다. DBW0 프로세스와
해당 슬래이브는 항상 디스크에 기록합니다.
사용 가능한 값: 0 - 운영 체제에 따라 다릅니다.
기본값  : 0

dispatchers
설명    : 공유 서버를 사용하여 공유 환경을 설정하기 위한 작업 할당자의 수와 유형
을 설정합니다. 이 매개변수에는 여러 가지 옵션을 지정할 수 있습니다. 따라서 자세
한 내용은 Oracle8i 관리자 설명서와 Oracle Net Administrator's Guide를 참조하십시
오. 예제 문자열 값은 ''(PROTOCOL=TCP)(DISPATCHERS=3)''입니다.
사용 가능한 값: 유효한 매개변수 사양입니다.
기본값  : NULL

distributed_transactions
설명    : 데이터베이스가 한 번에 참여할 수 있는 분산 트랜잭션의 최대 개수입니다.
 네트워크 실패가 비정상적으로 많이 발생하여 많은 수의 미확정 트랜잭션이 생기는
경우 이 값을 줄입니다.
사용 가능한 값: 0 - TRANSACTIONS 매개변수 값입니다.
기본값  : 운영 체제에 따라 다름

disk_asynch_io
설명    : 데이터 파일, 제어 파일, 로그 파일에 대한 입출력이 비동기적인지, 즉 테
이블 스캔 시 프로세스가 입출력 및 CPU 요청과 겹치는지 제어합니다. 사용 중인 플랫
폼이 디스크에 대한 비동기 입출력을 지원할 경우에만 이 매개변수를 변경하십시오.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE

dml_locks
설명    : 모든 사용자에 의해 획득된 테이블 잠금의 최대 개수입니다. DML(데이터 조
작어) 작업을 수행 중인 각 테이블에는 DML(데이터 조작어) 잠금이 필요합니다. 예를
들어, 3명의 사용자가 2개의 테이블을 수정하는 경우 6의 값이 필요합니다.
사용 가능한 값: 0 또는 20부터 무제한입니다.
기본값  : 4 * TRANSACTIONS (파생)

drs_start
Oracle이 DRMON 프로세스를 시작해야 하는지 여부를 결정하도록 합니다. DRMON은 치명
적이지 않은 Oracle 백그라운드 프로세스며 인스턴스가 존재하는 한 존재합니다.
사용 가능한 값: TRUE | FALSE입니다.
기본값: FALSE


E
enqueue_resources
설명    : 대기열에 넣으면 공유 리소스에 대해 동시 프로세스를 활성화할 수 있습니
다. 예를 들어, Oracle은 특정 프로세스가 공유 모드로 테이블을 잠그고 다른 프로세
스가 공유 갱신 모드로 해당 테이블을 잠그는 작업을 허용합니다.
사용 가능한 값: 10 - 65535(7.3) 또는 10 - 무제한(8.1)입니다.
기본값  : 파생됨(값이 DML_LOCKS + 20 이상일 경우 적당함)

event
설명    : 오라클 고객 지원 센터에서 시스템을 디버그하는 데 사용합니다. 일반적으
로 변경해서는 안됩니다. \n사용 가능한 값: 사용할 수 없습니다. \n기본값  : 없음


F
fal_client
설명: FAL 서비스(FAL_SERVER 매개변수를 통해 구성)에 의해 사용되는 FAL 클라이언트
 이름이 FAL 클라이언트를 나타내도록 지정합니다. 매개변수 값은 Oracle Net 서비스
이름입니다. 이 Oracle Net 서비스 이름은 FAL 서버 시스템에서 FAL 클라이언트(예:
이 대기 데이터베이스)를 가리키도록 제대로 구성된 것으로 간주됩니다.
사용 가능한 값: Oracle Net 서비스 이름의 문자열 값입니다.

fal_server
설명: 이 대기 데이터베이스에 대한 FAL 서버를 지정합니다. 값은 Oracle Net 서비스
이름입니다. Oracle Net 서비스 이름은 대기 데이터베이스 시스템에서 원하는 FAL 서
버를 가리키도록 제대로 구성된 것으로 간주됩니다.
사용 가능한 값: Oracle Net 서비스 이름의 문자열 값입니다.

fast_start_io_target
설명    : 충돌 또는 인스턴스 복구 중 필요한 입출력의 수를 지정합니다. DB_BLOCK_M
AX_DIRTY_TARGET 값을 사용할 때보다 복구 진행 시간에 대한 더욱 정밀한 제어를 가능
하게 합니다.
사용 가능한 값: 0은 입출력 복구 제한을 사용하지 않고 1000은 캐시의 모든 버퍼를
사용합니다.
기본값  : 캐시의 모든 버퍼

fast_start_mttr_target
설명: 데이터베이스 단일 인스턴스의 고장 복구를 위해 필요한 초 단위의 예측 시간을
 지정합니다. FAST_START_MTTR_TARGET은 해당 복구 시간이 전체 MTTR(평균 복구 시간)
 부분 내에 있도록 데이터베이스 작업을 수정하는 매개변수 집합으로 내부적으로 변환
됩니다. 매개변수는 "fast start fault recovery" 기능을 가지는 이러한 Edition으로
제한됩니다.
사용 가능한 값: [0, 3600]입니다. 이는 데이터 버터 캐시 항목 수 이상의 제한 및 최
대 크기의 로그에 있는 블록 수보다 큰 제한을 계산합니다.
기본값: 0

fast_start_parallel_rollback
설명    : 병렬 롤백 수행 시 최대 프로세스 수를 결정합니다. 대부분의 트랜잭션이
오랫동안 실행 중인 시스템에서 유용합니다.
사용 가능한 값: FALSE | LOW | HIGH
기본값  : LOW (2 * CPU_COUNT)

fixed_date
설명    : SYSDATE가 반환하는 날짜입니다. 시스템 날짜가 아닌 고정된 날짜를 항상
반환해야 할 경우 테스트하는 데 유용합니다. 큰 따옴표를 사용하거나 사용하지 않습
니다. 작은 따옴표는 사용하지 마십시오.
사용 가능한 값: YYYY-MM-DD-HH24:MI:SS 또는 기본 Oracle 날짜 형식입니다.
기본값  : NULL


G
gc_files_to_locks
설명    : 클러스터 데이터베이스 매개변수로 데이터 파일에 대한 PCM(병렬 캐시 관리
) 잠금 매핑을 제어합니다.
구문         : GC_FILES_TO_LOCKS = '{file_list=lock_count[!blocks][R][EACH][:...
]'
기본값  : NULL

global_context_pool_size
설명: 글로벌 응용 프로그램 컨텍스트 저장 및 관리를 위해 할당할 SGA의 메모리 양입
니다.
사용 가능한 값: 모든 정수 값입니다.
기본값: 1M

global_names
설명    : 데이터베이스 링크 이름이 접속하는 데이터베이스 이름과 동일해야 하는지
지정합니다. FALSE로 지정하면 확인을 수행하지 않습니다. 분산 처리의 일관성있는 이
름 지정 규칙을 위해 이 매개변수를 TRUE로 설정하십시오.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE



H
hash_ared_size
설명    : 병렬 실행 작업 및 DML(데이터 조작어) 또는 DDL(데이터 정의어) 문에 관련
된 값으로 해시 조인에 사용될 메모리의 최대 크기를 바이트 단위로 지정합니다. 자세
한 내용은 Oracle8i 개념 설명서를 참조하십시오.
사용 가능한 값: 0 - 운영 체제에 따라 다른 값을 가집니다.
기본값  : 파생: 2 * SORT_AREA_SIZE 매개변수 값

hash_join_enabled
설명    : TRUE로 설정된 경우 최적기는 가장 효율적인 조인 방식을 계산할 때 해시
조인을 고려합니다. Oracle은 데이터 웨어하우징 응용 프로그램에 대해 TRUE 값을 사
용하도록 권장합니다.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE

hi_shared_memory_address
설명    : 시스템 글로벌 영역(SGA)의 런타임 시 시작 주소를 지정합니다. SGA의 시작
 주소를 링크 시 지정하는 플랫폼에서는 무시됩니다. 64비트 플랫폼에서는 이 매개변
수를 사용하여 상위 및 하위 32비트를 지정합니다. 설정하지 않은 경우 기본적으로 플
랫폼에 따라 다른 위치로 지정됩니다.
사용 가능한 값: 임의 정수값입니다.
기본값  : 0

hs_autoregister
설명    : 이기종 서비스(HS) 에이전트의 자동 자체 등록을 활성화하거나 비활성화합
니다. 활성화된 경우 동일한 에이전트를 통해 이후에 접속할 때 적은 수의 오버헤드를
 유발하도록 정보를 데이터 딕셔너리로 업로드합니다.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE


I
ifile
설명    : 현재 매개변수 파일에 다른 매개변수 파일을 내장시키기 위해 사용합니다.
이 매개변수는 최대 중첩 수준이 3단계를 초과하지 않는 범위 내에서 하나의 매개변수
 파일의 서로 다른 행에 여러 번 포함시킬 수 있습니다.
사용 가능한 값: 유효한 임의 매개변수 파일 이름입니다. (구문: IFILE = parameter_f
ile_name)
기본값  : NULL

instance_groups
설명    : 클러스터 데이터베이스 매개변수로 현재 인스턴스를 콤마로 구분된 목록을
사용하여 지정한 그룹에 할당합니다. 인스턴스 그룹은 병렬 작업에 대해 질의 슬래이
브를 할당할 때 사용됩니다. \n사용 가능한 값: 콤마로 구분된 그룹 이름의 문자열입
니다. \n기본값  : NULL

instance_name
설명    : 여러 인스턴스가 공통 서비스 이름을 공유할 때 각 데이터베이스 인스턴스
를 고유하게 식별합니다. INSTANCE_NAME과 실제로 호스트 상의 인스턴스 공유 메모리
를 고유하게 식별하는 SID를 혼동하시 마십시오.
사용 가능한 값: 임의 영숫자입니다.
기본값  : 데이터베이스 SID

instance_number
설명    : 클러스터 데이터베이스 매개변수로 저장 영역 매개변수 FREELIST GROUPS를
사용하여 생성된 데이터베이스 객체 소유의 사용 가능한 목록 그룹에 대한 인스턴스
매핑에 고유 번호를 지정합니다. ALTER TABLE ... ALLOCATE EXTENT 문의 INSTANCE 절
에 이 값을 사용하여 이 인스턴스에 확장 영역을 동적으로 할당합니다 \nn사용 가능한
 값: 1 - MAX_INSTANCES입니다. (데이터베이스 생성 시 지정됨) \n기본값  : 사용 가
능한 최하위 번호(인스턴스 시작 순서와 다른 인스턴스에 지정된 INSTANCE_NUMBER 값
에 따라 다름)


J
java_max_sessionspace_size
설명    : 서버에서 Java 프로그램 실행에 사용할 수 있는 메모리의 최대 크기를 바이
트 단위로 지정합니다. 특정 데이터베이스 호출에서 다른 데이터베이스 호출로 Java
상태를 저장합니다. 사용자의 세션 지속 시간 Java 상태가 이 값을 초과하면 이 세션
은 메모리 부족 오류로 종료됩니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 0

java_pool_size
설명    : Java 메소드와 클래스 정의 및 호출 끝에 Java 세션 공간으로 이전된 Java
객체의 공유 인메모리 표현을 저장하는 Java 풀 메모리의 크기를 바이트 단위로 지정
합니다. 자세한 내용은 Oracle8i Java Developer's Guide를 참조하십시오.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 운영 체제에 따라 다름

java_soft_sessionspace_limit
설명    : Java 세션에서 사용되는 Java 메모리에 '부분 제한'을 바이트 단위로 지정
합니다. 사용자의 세션 지속 시간 Java 상태가 너무 많은 메모리를 사용하는 경우 Ora
cle은 경고를 생성하고 추적 파일에 메시지를 기록합니다.
사용 가능한 값: 0 - 4GB
기본값  : 0

job_queue_processes
설명    : 복제된 환경에만 관련된 값으로 인스턴스 당 SNP 작업 대기열 프로세스의
수(SNP0, ... SNP9, SNPA, ... SNPZ)를 지정합니다. 테이블 스냅샷을 자동으로 갱신하
거나 DBMS_JOB에 의해 생성된 요청을 수행하려면 이 매개변수 값을 1 이상으로 설정하
십시오.
사용 가능한 값: 0 - 36
기본값  : 0


K

L
large_pool_size
설명    : 공유 서버가 세션 메모리, 메시지 버퍼의 병렬 실행 및 RMAN 백업, 디스크
입출력 버퍼 복구에 사용하는 대형 풀 할당 힙의 크기를 지정합니다.
사용 가능한 값: 600K(최소값)에서 >= 20000M(최대값은 운영 체제에 따라 다름)입니다
.
기본값  : 0(병렬 실행 또는 DBWR_IO_SLAVES를 구성하지 않은 경우)

license_max_users
설명    : 데이터베이스에 생성할 수 있는 최대 사용자 수를 지정합니다. 동시 세션
사용 라이센스와 사용자 라이센스를 모두 활성화하지 마십시오. LICENSE_MAX_SESSIONS
나 LICENSE_MAX_USERS 또는 둘 다 0이어야 합니다.
사용 가능한 값: 0에서 사용자 라이센스 수까지입니다.
기본값  : 0

license_max_sessions
설명    : 동시에 허용하는 동시 사용자 세션의 최대 수를 지정합니다. 이 제한 값에
도달하면 RESTRICTED SESSION 권한을 가진 사용자만 서버에 접속할 수 있습니다. 다른
 모든 사용자는 시스템이 최대 용량에 도달했다는 경고 메시지를 받게 됩니다.
사용 가능한 값: 0에서 세션 라이센스 수까지입니다.
기본값  : 0

license_sessions_warning
설명    : 동시 사용자 세션 수의 경고 제한을 지정합니다. 이 제한 값에 도달해도 추
가 사용자가 접속할 수 있지만 ALERT 파일에 메시지가 기록됩니다. RESTRICTED SESSIO
N 권한을 가진 사용자가 접속할 때 시스템이 최대 용량에 근접하고 있다는 경고 메시
지가 표시됩니다.
사용 가능한 값: 0 - LICENSE_MAX_SESSIONS
기본값  : 0

local_listener
설명    : 동일한 시스템의 데이터베이스 인스턴스를 Oracle Net 리스너로 식별하는 O
racle Net 주소 목록입니다. 각 인스턴스와 작업 할당자는 클라이언트 접속을 활성화
하기 위해 리스너에 등록합니다. 이 매개변수는 현재 버전 8.1에서는 사용되지 않는 M
TS_LISTENER_ADDRESS와 MTS_MULTIPLE_LISTENERS 매개변수보다 우선 적용됩니다.
사용 가능한 값: 유효한 Oracle Net 주소 목록입니다.
기본값  : (ADDRESS_LIST=(Address=(Protocol=TCP)(Host=localhost)(Port=1521)) (Add
ress=(Protocol=IPC)(Key=DBname)))

lock_date
설명    : 전체 SGA를 물리적 메모리로 잠글 때 사용됩니다. 이 기능을 지원하지 않는
 플랫폼에서는 무시됩니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

lock_name_space
설명    : 분산 잠금 관리자(DLM)가 잠금 이름을 생성하기 위해 사용하는 네임스페이
스를 지정합니다. 동일한 클러스터에 동일한 데이터베이스 이름을 가진 대기 또는 복
제 데이터베이스가 있을 경우 이 값을 설정해야 합니다.
사용 가능한 값: 최대 8자로 특수 문자를 수락하지 않습니다.
기본값  : NULL

log_archive_dest
설명    : 데이터베이스가 ARCHIVELOG 모드로 실행 중이거나 아카이브된 리두 로그에
서 데이터베이스를 복구하는 중에만 적용 가능합니다. 8.1 Enterprise Edition에서는
LOG_ARCHIVE_DEST_n을 대신 사용해야 합니다.
사용 가능한 값: NULL 문자열 또는 원시 분할 영역을 제외한 유효한 임의 경로 및 장
치 이름입니다.
기본값  : NULL

log_archive_dest_1
설명    : 아카이브된 리두 로그 파일을 복제할 수 있는 5개의 로컬(LOCATION으로 지
정) 또는 원격(SERVICE로 지정) 대상 중 첫번째 대상입니다. 이 매개변수는 Enterpris
e Edition Oracle8i 데이터베이스 이상에 대해서만 유효합니다.
사용 가능한 값: 구문: (null_string | SERVICE=tnsnames-service |LOCATION=director
y-spec)[MANDATORY | OPTIONAL][REOPEN=integer]
기본값  : NULL

log_archive_dest_2
설명    : 아카이브된 리두 로그 파일을 복제할 수 있는 5개의 로컬(LOCATION으로 지
정) 또는 원격(SERVICE로 지정) 대상 중 두번째 대상입니다. 이 매개변수는 Enterpris
e Edition Oracle8i 데이터베이스 이상에 대해서만 유효합니다.
사용 가능한 값: 구문: (null_string | SERVICE=tnsnames-service |LOCATION=director
y-spec)[MANDATORY | OPTIONAL][REOPEN=integer]
기본값  : NULL

log_archive_dest_3
설명    : 아카이브된 리두 로그 파일을 복제할 수 있는 5개의 로컬(LOCATION으로 지
정) 또는 원격(SERVICE로 지정) 대상 중 세번째 대상입니다. 이 매개변수는 Enterpris
e Edition Oracle8i 데이터베이스 이상에 대해서만 유효합니다.
사용 가능한 값: 구문: (null_string | SERVICE=tnsnames-service |LOCATION=director
y-spec)[MANDATORY | OPTIONAL][REOPEN=integer]
기본값  : NULL

log_archive_dest_4
설명    : 아카이브된 리두 로그 파일을 복제할 수 있는 5개의 로컬(LOCATION으로 지
정) 또는 원격(SERVICE로 지정) 대상 중 네번째 대상입니다. 이 매개변수는 Enterpris
e Edition Oracle8i 데이터베이스 이상에 대해서만 유효합니다.
사용 가능한 값: 구문: (null_string | SERVICE=tnsnames-service |LOCATION=director
y-spec)[MANDATORY | OPTIONAL][REOPEN=integer]
기본값  : NULL

log_archive_dest_5
설명    : 아카이브된 리두 로그 파일을 복제할 수 있는 5개의 로컬(LOCATION으로 지
정) 또는 원격(SERVICE로 지정) 대상 중 다섯번째 대상입니다. 이 매개변수는 Enterpr
ise Edition Oracle8i 데이터베이스 이상에 대해서만 유효합니다.
사용 가능한 값: 구문: (null_string | SERVICE=tnsnames-service |LOCATION=director
y-spec)[MANDATORY | OPTIONAL][REOPEN=integer]
기본값  : NULL

log_archive_dest_6

log_archive_dest_7

log_archive_dest_8

log_archive_dest_9

log_archive_dest_10

log_archive_dest_state_1
설명    : 해당 아카이브된 로그 대상 매개변수의 가용성 상태를 지정합니다. (LOG_AR
CHIVE_DEST_1에만 적용됨) 활성화된 경우 로그 대상을 아카이브하고 지연된 경우에는
다시 활성화할 때까지 해당 대상을 아카이브 작업에서 제외합니다.
사용 가능한 값: ENABLE | DEFER
기본값  : ENABLE

log_archive_dest_state_2
설명    : 해당 아카이브된 로그 대상 매개변수의 가용성 상태를 지정합니다. (LOG_AR
CHIVE_DEST_2에만 적용됨) 활성화된 경우 로그 대상을 아카이브하고 지연된 경우에는
다시 활성화할 때까지 해당 대상을 아카이브 작업에서 제외합니다.
사용 가능한 값: ENABLE | DEFER
기본값  : ENABLE

log_archive_dest_state_3
설명    : 해당 아카이브된 로그 대상 매개변수의 가용성 상태를 지정합니다. (LOG_AR
CHIVE_DEST_3에만 적용됨) 활성화된 경우 로그 대상을 아카이브하고 지연된 경우에는
다시 활성화할 때까지 해당 대상을 아카이브 작업에서 제외합니다.
사용 가능한 값: ENABLE | DEFER
기본값  : ENABLE

log_archive_dest_state_4
설명    : 해당 아카이브된 로그 대상 매개변수의 가용성 상태를 지정합니다. (LOG_AR
CHIVE_DEST_4에만 적용됨) 활성화된 경우 로그 대상을 아카이브하고 지연된 경우에는
다시 활성화할 때까지 해당 대상을 아카이브 작업에서 제외합니다.
사용 가능한 값: ENABLE | DEFER
기본값  : ENABLE

log_archive_dest_state_5
설명    : 해당 아카이브된 로그 대상 매개변수의 가용성 상태를 지정합니다. (LOG_AR
CHIVE_DEST_5에만 적용됨) 활성화된 경우 로그 대상을 아카이브하고 지연된 경우에는
다시 활성화할 때까지 해당 대상을 아카이브 작업에서 제외합니다.
사용 가능한 값: ENABLE | DEFER
기본값  : ENABLE

log_archive_dest_state_6
설명: 특정 로그 아카이브 대상의 마지막 사용자 정의 상태를 식별합니다.
사용 가능한 값: ENABLE--대상 속성이 유효한 경우 archivelog 대상을 활성화합니다.
DEFER--대상 속성이 유효한 경우에도 archivelog 대상의 프로세스를 지연시킵니다. AL
TERNATE--대체 대상 속성이 유효한 경우 다른 대상 실패가 이 대상을 자동으로 활성화
하는 시간까지 archivelog 대상의 프로세스를 지연시킵니다.

log_archive_dest_state_7
설명: 특정 로그 아카이브 대상의 마지막 사용자 정의 상태를 식별합니다.
사용 가능한 값: ENABLE--대상 속성이 유효한 경우 archivelog 대상을 활성화합니다.
DEFER--대상 속성이 유효한 경우에도 archivelog 대상의 프로세스를 지연시킵니다. AL
TERNATE--대체 대상 속성이 유효한 경우 다른 대상 실패가 이 대상을 자동으로 활성화
하는 시간까지 archivelog 대상의 프로세스를 지연시킵니다.

log_archive_dest_state_8
설명: 특정 로그 아카이브 대상의 마지막 사용자 정의 상태를 식별합니다.
사용 가능한 값: ENABLE--대상 속성이 유효한 경우 archivelog 대상을 활성화합니다.
DEFER--대상 속성이 유효한 경우에도 archivelog 대상의 프로세스를 지연시킵니다. AL
TERNATE--대체 대상 속성이 유효한 경우 다른 대상 실패가 이 대상을 자동으로 활성화
하는 시간까지 archivelog 대상의 프로세스를 지연시킵니다.

log_archive_dest_state_9
설명: 특정 로그 아카이브 대상의 마지막 사용자 정의 상태를 식별합니다.
사용 가능한 값: ENABLE--대상 속성이 유효한 경우 archivelog 대상을 활성화합니다.
DEFER--대상 속성이 유효한 경우에도 archivelog 대상의 프로세스를 지연시킵니다. AL
TERNATE--대체 대상 속성이 유효한 경우 다른 대상 실패가 이 대상을 자동으로 활성화
하는 시간까지 archivelog 대상의 프로세스를 지연시킵니다.

log_archive_dest_state_10
설명: 아카이브 로그 대상을 지정합니다.
사용 가능한 값: 로컬 파일 시스템 위치(디스크 위치) 또는 Oracle Net 서비스 이름(t
ns 서비스)을 통한 원격 아카이브입니다.

log_archive_duplex_dest
설명    : LOG_ARCHIVE_DEST가 아닌 두번째 아카이브 대상을 지정합니다. 이 매개변수
는 Oracle8i Enterprise Edition에서 LOG_ARCHIVE_DEST_n으로 바뀌었습니다.
사용 가능한 값: NULL 문자열 또는 원시 분할 영역을 제외한 유효한 경로 및 장치 이
름입니다.
기본값  : NULL

log_archive_format
설명    : LOG_ARCHIVE_FORMAT은 데이터베이스가 ARCHIVELOG 모드일 때만 사용할 수 있습니다. 변수 %s(로그 시퀀스 번호) 및 %t(스레드 번호)이(가) 포함된 텍스트 문자
열을 사용하여 아카이브된 리두 로그 파일의 고유한 파일 이름을 지정합니다. 이 문자
열은 LOG_ARCHIVE_DEST 매개변수에 추가됩니다.
사용 가능한 값: 유효한 임의 파일 이름입니다.
기본값  : 운영 체제에 따라 다름

log_archive_max_processes
설명    : 필요한 ARCH 프로세스의 수를 지정합니다. 이 값이 LOG_ARCHIVE_START = TRUE로 설정된 경우 인스턴스 시작 시 평가되거나 SQL*Plus 또는 SQL 구문을 통해 ARCH 프로세스를 호출할 때 평가됩니다.
사용 가능한 값: 1과 10 사이의 임의 정수입니다.
기본값  : 1

log_archive_min_succeed_dest
설명    : 로그 파일을 겹쳐쓰기 전에 복사해야 하는 최소 대상 수를 정의합니다. 이
값은 LOG_ARCHIVE_DEST_n의 MANDATORY 대상 수보다 크거나 같아야 합니다.
사용 가능한 값: 1 - 5입니다. (LOG_ARCHIVE_DEST 및 LOG_ARCHIVE_DUPLEX_DEST와 함께 사용될 경우에는 1 - 2로 제한됨)
기본값  : 1

log_archive_start
설명    : 데이터베이스가 ARCHIVELOG 모드일 때만 적용 가능한 값으로 리두 로그를
자동 또는 수동으로 복사할지 여부를 지정합니다. 권장값은 자동 아카이브를 수행하는
 TRUE입니다. 이 값을 사용하지 않으면 인스턴스 대기를 방지하기 위해 ALTER SYSTEM
ARCHIVE LOG ... 명령을 사용한 수동 개입이 필요합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

log_archive_trace
설명    : 아카이브 로그 프로세스에 의해 생성되는 출력을 제어합니다. 이 프로세스
는 ARCn 백그라운드 프로세스(출력 로그에 ARCn으로 지정됨)에 의해 시작될 수 있습니
다.
 명시적인 세션 호출 포그라운드 프로세스(출력 로그에 ARCH로 지정됨) 또는
 관리 대기의 원격 파일 서버(RFS) 프로세스. 
사용 가능한 값: 
 0: 아카이브 로그 추적 사용 중지(기본값)
 1: 리두 로그 파일 아카이브 추적
 2: 각 아카이브 로그 대상의 아카이브 상태 추적
 4: 아카이브 작업 단계 추적
 8: 아카이브 로그 대상 작업 추적
 16: 세부 아카이브 로그 대상 작업 추적
 32: 아카이브 로그 대상 매개변수 수정 추적
 64: ARCn 프로세스 상태 작업 추적
기본값  : 0

log_buffer
설명    : 리두 항목을 LGWR에 의해 리두 로그 파일에 기록하기 전에 버퍼로 저장하기
 위해 사용되는 메모리 크기를 지정합니다. 리두 항목은 데이터베이스 블록의 변경 사
항 기록을 보존합니다. 특히 실행 시간이 길거나 많은 수의 트랜잭션이 실행 중인 시
스템에서 이 값을 65536 이상으로 설정하면 리두 로그 파일 입출력을 줄일 수 있습니
다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 최대 500K 또는 128K * CPU_COUNT, 이 중 크기가 더 큰 값

log_checkpoint_interval
설명    : 체크포인트가 발생하기 전에 리두 로그 파일에 써야 할 OS 블록(데이터베이
스 블록이 아님)의 수를 지정합니다. 체크포인트는 이 값에 상관없이 항상 로그 전환
시에 발생합니다. 이 값의 크기를 줄이면 인스턴스 복구에 필요한 시간이 감소하지만
과도한 디스크 작업이 유발될 수 있습니다.
사용 가능한 값: 무제한입니다. (0을 지정하면 이 매개변수 기능을 해제함)
기본값  : 운영 체제에 따라 다름

log_checkpoint_timeout
설명    : 다른 체크포인트가 발생할 때까지의 최대 시간을 초 단위로 지정합니다. 이
 시간 초과 값을 0으로 설정하면 시간에 준한 체크포인트 기능을 해제합니다. 이 값의
 크기를 줄이면 인스턴스 복구 시간이 감소하지만 과도한 디스크 작업이 유발될 수 있
습니다.
사용 가능한 값: 0 - 무제한입니다.
기본값  : Oracle8i: 900초, Enterprise Edition: 1800초

log_checkpoints_to_alert
설명    : 체크포인트 정보를 경보 파일에 기록합니다. 이 매개변수를 사용하면 체크
포인트가 원하는 빈도로 발생하는지 결정할 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

log_file_name_convert
설명    : 기본 데이터베이스 상의 로그 파일 이름을 대기 데이터베이스 상의 해당 경
로 및 파일 이름으로 변환합니다. 로그 파일을 기본 데이터베이스에 추가할 때 해당
파일을 대기 데이터베이스에도 추가해야 합니다. 이 매개변수는 Oracle7의 LOG_FILE_N
AME_CONVERT 매개변수를 대신합니다.
사용 가능한 값: 유효한 경로/파일 이름, 형식: ''기본 로그 파일의 경로/파일 이름''
,''대기 로그 파일의 경로/파일 이름''
기본값  : NULL

logmnr_max_persistent_sessions


M
max_commit_propagation_delay
설명    : 클러스터 데이터베이스 매개변수로 LGWR이 인스턴스의 SGA에 저장된 SCN(시
스템 변경 번호)을 새로 고칠 때까지 허용된 최대 시간의 길이를 100분의 1초 단위로
지정합니다. SCN은 정기적으로 갱신되지는 않으므로 이 성능 매개변수는 거의 변경할
필요가 없습니다. \n사용 가능한 값: 0 - 90000 \n기본값  : 700

max_dispatchers
설명    : 공유 서버 환경에서 동시에 실행될 수 있는 작업 할당자 프로세스의 최대
수를 지정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 작업 할당자가 구성된 경우 5와 구성된 작업 할당자 수 가운데 큰 값이 기
본값이 됩니다.

max_dump_file_size
설명    : 각 추적 파일의 최대 크기를 지정합니다. 추적 파일이 너무 많은 공간을 차
지하는 경우 이 제한을 변경할 수 있습니다. 덤프 파일 크기를 운영 체제가 허용하는
크기로만 제한하려면 UNLIMITED로 설정합니다.
사용 가능한 값: 0 - UNLIMITED('K' 또는 'M' 단위 사용 가능)
기본값  : 10000블록

max_enabled_roles
설명    : 하위 롤을 포함하여 사용자가 사용할 수 있는 데이터베이스 롤의 최대 수를
 지정합니다. 각 사용자는 PUBLIC과 사용자 고유 롤에 해당하는 2개의 추가 롤을 가지
고 있으므로 실제로 사용자가 활성화할 수 있는 롤의 수는 MAX_ENABLED_ROLES 값에 2
를 더한 값에 해당합니다.
사용 가능한 값: 0 - 148
기본값  : 20

max_rollback_segments
설명    : SGA에서 롤백 세그먼트 캐시의 최대 크기를 지정합니다. 지정된 숫자는 하
나의 인스턴스가 동시에 온라인 상태(즉, INUSE 상태)를 유지할 수 있는 롤백 세그먼
트의 최대 수를 나타냅니다.
사용 가능한 값: 2 - 65535
기본값  : max(30, TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)

max_shared_servers
설명    : 공유 서버 환경에서 동시에 실행될 수 있는 공유 서버 프로세스의 최대 수
를 지정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 20

max_transaction_branches
설명    : 분산 트랜잭션의 분기 수를 제어합니다. MAX_TRANSACTION_BRANCHES 값을 작
은 값으로 설정하면 (MAX_TRANSACTION_BRANCHES * DISTRIBUTED_TRANSACTIONS * 72바이
트) 값에 따라 공유 풀 메모리를 약간 줄일 수 있습니다. 이 매개변수는 현재 버전 8.
1.3에서는 사용되지 않습니다.
사용 가능한 값: 1 - 32
기본값  : 8

mts_circuits
설명    : 수신 및 송신 네트워크 세션에 대해 사용 가능한 가상 회로의 총 수를 지정
합니다. 이 값은 인스턴스의 전체 SGA 요구 사항을 구성하는 몇몇 매개변수 중의 하나
입니다.
기본값  : 파생: 공유 서버 구조를 사용하는 경우 SESSIONS 매개변수 값. 그렇지 않은
 경우 0

mts_dispatchers
설명    : 공유 서버를 사용하여 공유 환경을 설정하기 위한 작업 할당자의 수와 유형
을 설정합니다. 이 매개변수에는 여러 가지 옵션을 지정할 수 있습니다. 따라서 자세
한 내용은 Oracle8i 관리자 설명서와 Oracle Net Administrator's Guide를 참조하십시
오. 예제 문자열 값은 ''(PROTOCOL=TCP)(DISPATCHERS=3)''입니다.
사용 가능한 값: 유효한 매개변수 사양입니다.
기본값  : NULL

mts_listener_address
설명    : 공유 서버에 대한 리스너 구성을 지정합니다. 리스너 프로세스는 시스템에
서 사용되는 각 네트워크 프로토콜에 대한 접속 요청의 수신 주소가 필요합니다. MTS_
MULTIPLE_LISTENERS=TRUE로 설정된 경우가 아니면 각 항목은 별도의 인접 값을 가져야
 합니다. 이 매개변수는 현재 버전 8.1.3에서는 사용되지 않습니다.
구문         : (ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=7002))
기본값  : NULL

mts_max_dispatchers
설명    : 공유 서버 환경에서 동시에 실행될 수 있는 작업 할당자 프로세스의 최대
수를 지정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 작업 할당자가 구성된 경우 5와 구성된 작업 할당자 수 가운데 큰 값이 기
본값이 됩니다.

mts_max_servers
설명    : 공유 서버 환경에서 동시에 실행될 수 있는 공유 서버 프로세스의 최대 수
를 지정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 20

mts_multiple_listners
설명    : 다중 리스너 주소를 개별 항목 또는 하나의 ADDRESS_LIST 문자열로 지정할
지 결정합니다. TRUE로 설정된 경우 MTS_LISTENER_ADDRESS 매개변수는 다음과 같이 지
정할 수 있습니다.
   (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5000)(HOST=zeus))
                 (ADDRESS=(PROTOCOL=decnet)(OBJECT=outa)(NODE=zeus))
이 매개변수는 현재 버전 8.1.3에서는 사용되지 않습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

mts_service
설명    : 공유 서버 매개변수로 데이터베이스 접속을 구현하기 위해 작업 할당자에
등록된 고유한 서비스 이름을 지정합니다. 작업 할당자를 사용할 수 없을 경우에도 데
이터베이스에 접속하려면 이 값을 인스턴스 이름과 동일하게 설정합니다. 이 매개변수
는 현재 버전 8.1.3에서는 사용되지 않습니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 0

mts_servers
설명    : 공유 서버 환경에서 인스턴스가 시작될 때 생성할 서버 프로세스의 수를 지
정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 1

mts_sessions
설명    : 허용할 공유 서버 구조 사용자 세션의 총 수를 지정합니다. 이 매개변수를
설정하면 전용 서버의 사용자 세션을 예약할 수 있습니다.
사용 가능한 값: 0부터 (SESSIONS - 5)까지 
기본값  : 파생: MTS_CIRCUITS 값과 (SESSIONS - 5) 값 중 작은 값



N
nls_calendar
설명    : Oracle이 날짜 형식에 사용할 달력 시스템을 지정합니다. 예를 들어, NLS_C
ALENDAR를 'Japanese Imperial'로 설정하면 날짜 형식은 'E YY-MM-DD'이며 날짜가 1997년 5월 15일인 경우 SYSDATE는 'H 09-05-15'와 같이 표시됩니다.
사용 가능한 값: Arabic Hijrah, English Hijrah, Gregorian, Japanese Imperial, Per
sian, ROC Official (Republic of China), Thai Buddha입니다.
기본값  : Gregorian

nls_comp
설명    : SQL 문에 NLS_SORT를 사용하는 번거로운 프로세스를 피합니다. 일반적으로
WHERE 절의 비교는 이진 값을 대상으로 하지만 문자 비교의 경우에는 NLSSORT 함수가
필요합니다. NLS_COMP를 사용하면 비교가 NLS_SORT 세션 매개변수에 따른 문자 비교임을 나타낼 수 있습니다.
사용 가능한 값: Oracle8i National Language Support Guide에 지정된 10바이트 길이
의 문자열입니다.
기본값  : BINARY 

nls_currency
설명    : L 숫자 형식 요소에 대해 지역 통화 기호로 사용할 문자열을 지정합니다.
이 매개변수의 기본값은 NLS_TERRITORY에 의해 결정됩니다.
사용 가능한 값: Oracle8i National Language Support Guide에 지정된 10바이트 길이
의 문자열입니다.
기본값  : NLS_TERRITORY에서 파생된 값

nls_date_format
설명    : TO_CHAR 및 TO_DATE 함수에 사용할 기본 날짜 형식을 지정합니다. 이 매개
변수의 기본값은 NLS_TERRITORY에 의해 결정됩니다. 이 매개변수는 큰 따옴표로 표시
한 임의의 유효한 날짜 형식 마스크를 값으로 가질 수 있습니다. 예: ''MMM/DD/YYYY''
사용 가능한 값: 일정한 길이를 넘지 않는 임의의 유효한 날짜 형식 마스크입니다.
기본값  : 파생

nls_date_language
설명    : 요일과 달 이름 및 날짜 약자(AM, PM, AD, BC)를 표기할 언어를 지정합니다
. 이 매개변수의 기본값은 NLS_LANGUAGE에 의해 지정된 언어입니다.
사용 가능한 값: 임의의 유효한 NLS_LANGUAGE 값입니다.
기본값  : NLS_LANGUAGE 값

nls_dual_currency
설명    : NLS_TERRITORY에 정의된 기본 이중 통화 기호를 무시할 때 사용됩니다. 기
본 이중 통화 기호는 이 매개변수가 설정되지 않았을 때 사용됩니다. 그렇지 않으면
이 값을 이중 통화 기호로 하는 새 세션이 시작됩니다.
사용 가능한 값: 임의의 유효한 형식 이름입니다.
기본값  : 이중 통화 기호

nls_iso_currency
설명    : C 숫자 형식 요소에 대해 국제 통화 기호로 사용할 문자열을 지정합니다.
이 매개변수의 기본값은 NLS_TERRITORY에 의해 결정됩니다.
사용 가능한 값: 임의의 유효한 NLS_TERRITORY 값입니다.
기본값  : NLS_TERRITORY에서 파생된 값

nls_languge
설명    : 메시지, 요일 및 달 이름, AD, BC, AM, PM과 같은 기호, 기본 정렬 방법에
사용되는 데이터베이스 기본 언어를 지정합니다. 지원되는 언어에는 영어, 프랑스어,
일본어 등이 있습니다.
사용 가능한 값: 임의의 유효한 언어 이름입니다.
기본값  : 운영 체제에 따라 다름

nls_length_semantics
설명: 바이트 또는 코드포인트 의미를 사용하여 새로운 char, varchar2, clob, nchar,
 nvarchar2, nclob 열 생성을 지정합니다. 모든 문자 집합은 자신의 고유한 문자 정의
를 가집니다. 동일한 문자 집합이 클라이언트 및 서버에서 사용될 경우 문자열은 해당
 문자 집합에 의해 정의된 대로 문자 단위로 측정되어야 합니다. 기존의 열은 영향을
받지 않습니다.
사용 가능한 값: BYTE 또는 CHAR입니다.
기본값: nls_length_semantics에 대한 데이터베이스 문자 집합의 문자를 측정하는 항
목에 대해서는 BYTE입니다.

nls_nchar_conv_excp
설명: (TRUE인 경우) 데이터 손실이 암시적 변환에서 발생할 때 오류를 반환하는 매개
변수입니다.
사용 가능한 값: FALSE | TRUE
기본값: TRUE

nls_numeric_characters
설명    : 그룹 구분 기호와 소수점으로 사용할 문자를 지정합니다. 그룹 구분 기호는
 정수 그룹(예: 천, 백만 등)을 구분하는 문자이고 소수점은 숫자의 정수 부분과 소수
 부분을 구분하는 문자입니다. 형식: <decimal_character><group_separator>.
사용 가능한 값: '+', '-', '<', '>'을 제외한 임의의 단일 바이트 문자 
기본값  : NLS_TERRITORY에서 파생된 값

nls_sort
설명    : ORDER BY 질의에 대한 조합 순서를 지정합니다. 이진 정렬의 경우 ORDER BY
 질의에 대한 조합 순서는 숫자 값을 기준으로 합니다. 문자 정렬의 경우 정의된 문자
 정렬 순서로 데이터를 배열하려면 전체 테이블을 스캔해야 합니다.
사용 가능한 값: BINARY 또는 유효한 문자 정의 이름입니다.
기본값  : NLS_LANGUAGE에서 파생된 값

nls_territory
설명    : 날짜와 주 번호 매김, 기본 날짜 형식, 기본 소수점 문자, 그룹 구분 기호,
 기본 ISO 및 지역 통화 기호에 대한 이름 지정 규칙을 지정합니다. 지원되는 지역에
는 미국, 프랑스, 일본 등이 있습니다. 모든 지역에 대한 내용은 Oracle8i National L
anguage Support Guide를 참조하십시오.
사용 가능한 값: 임의의 유효한 지역 이름입니다.
기본값  : 운영 체제에 따라 다름

nls_time_format
설명    : 날짜 시간 필드인 HOUR, MINUTE, SECOND가 포함된 TIME 데이터 유형의 기본
값을 설정하는 문자열 값을 지정합니다.
구문         : TIME '09:26:50'. (값을 7바이트로 저장함)
기본값  : NLS_TERRITORY에서 파생된 값

nls_time_tz_format
설명    : 날짜 시간 필드인 HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE
가 포함된 TIME WITH TIME ZONE 데이터 유형의 기본값을 설정하는 UTC와 TZD 값 쌍을
지정합니다. UTC는 국제 표준 시간이고 TZD는 지역 시간대입니다.
구문         : TIME '09:26:50.20+ 02:00'. (값을 9바이트로 저장함)
기본값  : NLS_TERRITORY에서 파생된 값

nls_timestamp_format
설명    : NLS_TIME_FORMAT와 유사하지만 시간의 HOUR, MINUTE, SECOND 값을 비롯한
날짜의 YEAR, MONTH, DAY 값을 저장하는 TIMESTAMP 데이터 유형의 기본값을 설정합니
다.
구문         : TIMESTAMP '1997-01-31 09:26:50.10'. (값을 11바이트로 저장함)
기본값  : NLS_TERRITORY에서 파생된 값

nls_timestamp_tz_format
설명    : NLS_TIME_TZ_FORMAT과 유사하며 한 쌍의 값으로 날짜의 YEAR, MONTH, DAY
값과 시간의 HOUR, MINUTE, SECOND 값을 비롯한 TIMEZONE_HOUR와 TIMEZONE_MINUTE 값
을 저장하는 TIMESTAMP 데이터의 기본값을 지정합니다.
구문         : TIMESTAMP '1997- 01- 31 09:26:50+ 02: 00'. (값을 13바이트로 저장
함)
기본값  : NLS_TERRITORY에서 파생된 값


O
object_cache_max_size_percent
설명    : 세션 객체 캐시가 최적 크기를 초과할 수 있는 최적 캐시 크기 백분율을 지
정합니다. 최대 크기는 최적 크기와 최적 크기에 이 백분율을 곱한 값의 합과 같습니
다. 캐시 크기가 이 최대 크기를 초과하면 시스템은 캐시를 최적 크기로 축소합니다.
사용 가능한 값: 0%에서 운영 체제에 따른 최대값까지입니다.
기본값  : 10%

object_cache_optimal_size
설명    : 캐시 크기가 최대 크기를 초과할 때 세션 객체 캐시를 어느 크기로 축소할
지 지정합니다.
사용 가능한 값: 10K에서 운영 체제 특정 최대값까지입니다.
기본값  : 100K

open_cursors
설명    : 세션이 한 번에 가질 수 있는 열린 커서(컨텍스트 영역)의 최대 수와 사용
자에 의해 재실행되는 명령문을 다시 구문 분석하지 않기 위해 PL/SQL이 사용하는 PL/
SQL 커서 캐시 크기를 지정합니다. 이 값을 충분히 크게 설정하면 응용 프로그램에 의
해 열린 커서가 부족해지는 현상을 방지할 수 있습니다.
사용 가능한 값: 1 에서 운영 체제 제한값까지입니다.
기본값  : 64

open_links
설명    : 하나의 세션에서 원격 데이터베이스에 대해 동시에 열 수 있는 접속의 최대
 수를 지정합니다. 이 값은 모든 데이터베이스를 열어 해당 명령문을 실행할 수 있도
록 여러 데이터베이스를 참조하는 단일 SQL 문에서 언급된 데이터베이스 수보다 크거
나 같아야 합니다.
사용 가능한 값: 0에서 255까지입니다. (0인 경우 분산 트랜잭션 사용 금지)
기본값  : 4

open_links_per_instance
설명    : XA 응용 프로그램의 이전 가능한 열린 접속의 최대 수를 지정합니다. XA 트
랜잭션은 이전 가능한 열린 접속을 사용하여 트랜잭션이 커밋된 후 접속을 캐시로 저
장합니다. 트랜잭션은 접속을 생성한 사용자와 트랜잭션을 소유한 사용자가 동일한 경
우 접속을 공유할 수 있습니다.
사용 가능한 값: 0 - UB4MAXVAL
기본값  : 4

optimizer_features_enable
설명    : 최적기 기능을 제어하는 ini.ora 매개변수의 변경을 허용합니다. 영향을 받
는 매개변수는 PUSH_JOIN_PREDICATE, FAST_FULL_SCAN_ENABLED, COMPLEX_VIEW_MERGING
및 B_TREE_BITMAP_PLANS입니다.
사용 가능한 값: 8.0.0, 8.0.3, 8.0.4, 8.1.3입니다.
기본값  : 8.0.0

optimizer_index_caching
설명    : 중첩 루프 조인의 버퍼 캐시에 저장할 인덱스 블록의 비율에 대한 비용 기
반 가정을 조정합니다. 이 값을 조정하면 인덱스가 사용되는 중첩 루프 조인의 실행
비용에 영향을 줍니다. 이 매개변수 값을 크게 설정하면 최적기가 중첩 루프 조인의
실행에 부담을 덜 느끼게 됩니다.
사용 가능한 값: 0에서 100%까지입니다.
기본값  : 0

optimizer_index_cost_adj
설명    : 고려할 인덱스 액세스 경로의 수가 너무 많거나 너무 적을 때 최적기 성능
을 조정하기 위해 사용됩니다. 작은 값을 설정하면 최적기가 더 자주 인덱스를 선택하
게 됩니다. 즉, 값을 50%로 설정하면 인덱스 액세스 경로의 부담이 정상의 반이 됩니
다.
사용 가능한 값: 1 - 10000
기본값  : 100(인덱스 액세스 경로의 일반적인 비용)

optimizer_max_permutations
설명    : 대규모 조인을 가진 질의를 구문 분석할 때 최적기가 고려하는 테이블 순열
의 수를 제한합니다. 이렇게 하면 질의 구문 분석 시간을 허용 한도 내로 단축시킬 수
 있지만 찾은 계획이 최적이 아닐 수 있습니다. 일반적으로 1000 이하의 값을 사용하
면 구문 분석 시간을 수 초 이내로 유지할 수 있습니다.
사용 가능한 값: 4에서 2^32(~43억)까지입니다.
기본값  : 80,000

optimizer_mode
설명    : 최적기 기능을 지정합니다. RULE로 설정하면 질의에 힌트가 포함되어 있지
않은 경우 규칙 기반 최적기가 사용됩니다. CHOOSE로 설정하면 명령문의 테이블에 통
계가 없는 경우 비용 기반 최적기가 사용됩니다. ALL_ROWS 또는 FIRST_ROWS로 설정하
면 항상 비용 기반 최적기를 사용합니다.
사용 가능한 값: RULE | CHOOSE | FIRST_ROWS | ALL_ROWS
기본값  : CHOOSE

oracle_trace_collection_name
설명    : Oracle Trace 모음 이름을 지정하여 출력 파일 이름(모음 정의 파일 .cdf와
 데이터 모음 파일 .dat)에 사용됩니다. 이 매개변수가 NULL이 아니면 이 값이 다시 N
ULL로 설정될 때까지 ORACLE_TRACE_ENABLE = TRUE로 되어 기본 Oracle Trace 모음이
시작됩니다.
사용 가능한 값: 최대 16자 길이의 유효한 모음 이름입니다. (8자 길이의 파일 이름을
 사용하는 플랫폼 제외)
기본값  : NULL

oracle_trace_collection_path
설명    : Oracle Trace 모음 정의(.cdf)와 데이터 모음(.dat) 파일이 있는 디렉토리
의 경로명을 지정합니다.
사용 가능한 값: 전체 디렉토리 경로명입니다.
기본값  : 운영 체제 지정값(일반적으로 ORACLE_HOME/otrace/admin/cdf)

oracle_trace_collection_size
설명    : Oracle Trace 모음 파일의 최대 크기를 바이트 단위로 지정합니다. 모음 파
일 크기가 이 최대값에 도달하면 모음 기능이 사용 중지됩니다. 범위 값이 0인 경우에
는 크기 제한이 없습니다.
사용 가능한 값: 0 - 4294967295
기본값  : 5242880

oracle_trace_enable
설명    : 서버의 Oracle Trace 모음 기능을 활성화하려면 이 값을 TRUE로 설정하십시
오. TRUE로 설정된 경우 Oracle Trace를 해당 서버에 대해 사용할 수 있습니다. 모음
을 시작하려면 ORACLE_TRACE_COLLECTION_NAME에 NULL이 아닌 값을 지정하거나 Oracle
Trace Manager를 사용하여 모음을 시작합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

oracle_trace_facillty_name
설명    : Oracle Trace 제품 정의 파일 이름(.fdf 파일)을 지정합니다. 이 파일에는
Oracle Trace 데이터 모음 API를 사용하는 제품에 대해 모여진 모든 이벤트 및 데이터
 항목의 정의 정보가 포함되어 있습니다. Oracle은 기본 파일인 ORCLED.FDF의 사용을
권장합니다.
사용 가능한 값: 최대 16자 길이의 유효한 기능 이름입니다.
기본값  : oracled

oracle_trace_facillity_path
설명    : Oracle TRACE 기능 정의(.fdf) 파일이 위치한 디렉토리 경로명을 지정합니
다.
사용 가능한 값: 전체 디렉토리 경로명입니다.
기본값  : ORACLE_HOME/otrace/admin/fdf/(운영 체제에 따라 다름)

os_authent_prefix
설명    : 사용자의 운영 체제 계정 이름과 암호를 사용하여 서버에 접속한 사용자를
인증합니다. 이 매개변수 값은 모든 사용자의 운영 체제 계정의 시작에 연결됩니다. N
ULL값을 지정하면 OS 계정 접두어를 제거할 수 있습니다.
사용 가능한 값: 임의의 식별자입니다.
기본값  : 운영 체제 지정값(일반적으로 'OPS$')

os_roles
설명    : 운영 체제 또는 데이터베이스가 각 사용자의 롤을 식별할지 지정합니다. TR
UE로 설정하면 운영 체제가 모든 데이터베이스 사용자에 대한 롤 부여를 전적으로 관
리합니다. 그렇지 않으면 데이터베이스가 롤을 식별하고 관리합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE


P
parallel_adaptive_multi_user
설명    : 다중 사용자 환경에서 병렬 실행을 사용하여 성능을 향상시키기 위해 고안
된 적응 알고리즘을 활성화하거나 비활성화합니다. 시스템 부하를 바탕으로 요청된 병
렬 실행 수를 자동으로 축소하여 질의 시작 단계에서 이 작업을 수행합니다. PARALLEL
_AUTOMATIC_TUNING = TRUE로 설정된 경우 가장 잘 사용됩니다.
사용 가능한 값: TRUE | FALSE
기본값  : PARALLEL_AUTOMATIC_TUNING = TRUE로 설정된 경우 TRUE, 아니면 FALSE

parallel_automatic_tuning
설명    : TRUE로 설정된 경우 병렬 실행을 제어하는 매개변수의 기본값을 Oracle이
결정합니다. 이 매개변수의 설정과 더불어 시스템의 테이블에 대한 병렬 계산을 설정
해야 합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

parallel_broadcast_enabled
설명    : 해시 또는 병합 조인을 사용하여 소규모 결과 집합(크기는 행이 아닌 바이
트 단위로 측정됨)에 조인된 대량의 결과 집합에 대한 성능 향상을 제공할 수 있습니
다. TRUE로 설정된 경우 최적기는 소규모 결과 집합의 각 행을 보다 큰 집합의 각 클
러스터 데이터베이스 프로세싱 행에 대해 브로드캐스트할 수 있습니다. \n사용 가능한
 값: TRUE | FALSE \n기본값  : FALSE

parallel_execution_message_size
설명    : 병렬 실행(병렬 질의, PDML(병렬 데이터 조작어), 병렬 복구, 복제)의 메시
지 크기를 지정합니다. 2048 또는 4096보다 큰 값을 지정하면 보다 큰 공유 풀이 필요
합니다. PARALLEL_AUTOMATIC_TUNING = TRUE로 설정된 경우 메시지 버퍼는 대형 풀의
외부에 할당됩니다.
사용 가능한 값: 2148에서 무한대입니다.
기본값  : PARALLEL_AUTOMATIC_TUNING이 FALSE로 설정된 경우 일반적으로 2148 또는 P
ARALLEL_AUTOMATIC_TUNING이 TRUE로 설정된 경우 4096(운영 체제에 따라 다름)

parallel_instance_group
설명    : 클러스터 데이터베이스 매개변수로 병렬 실행 슬래이브 생성에 사용되는 병
렬 인스턴스 그룹의 식별에 사용됩니다. 병렬 작업은 해당 INSTANCE_GROUPS 매개변수
에 일치 그룹을 지정한 인스턴스에 대해서만 병렬 실행 슬래이브를 생성합니다. \n사
용 가능한 값: 그룹 이름을 나타내는 문자열입니다. \n기본값  : 현재 활성화된 모든
인스턴스로 구성된 그룹

parallel_max_servers
설명    : 인스턴스에 대한 병렬 실행 서버 또는 병렬 복구 프로세스의 최대 수를 지
정합니다. 인스턴스 시작 시 할당된 질의 서버의 수는 수요에 따라 이 값까지 증가하
게 됩니다.
사용 가능한 값: 0 - 256
기본값  : CPU_COUNT, PARALLEL_AUTOMATIC_TUNING, PARALLEL_ADAPTIVE_MULTI_USER 값
에 따라 다름

parallel_min_percent
설명    : 병렬 실행에 필요한 스레드의 최소 비율을 퍼센트 단위로 지정합니다. 적절
한 수의 질의 슬래이브를 병렬 실행에 사용할 수 없을 경우 오류 메시지를 표시하고
질의가 순차적으로 실행되지 않도록 하려면 이 매개변수를 설정하십시오.
사용 가능한 값: 0 - 100
기본값  : 0(이 매개변수를 사용하지 않음을 나타냄)

parallel_min_servers
설명    : 병렬 실행을 위해 인스턴스를 시작했을 때 Oracle이 생성하는 질의 서버 프
로세스의 최소 개수를 지정합니다.
사용 가능한 값: 0에서 PARALLEL_MAX_SERVERS까지입니다.
기본값  : 0

parallel_server
설명    : 클러스터 데이터베이스 옵션을 활성화하려면 PARALLEL_SERVER를 TRUE로 설
정하십시오. \n사용 가능한 값: TRUE | FALSE \n기본값  : FALSE

parallel_server_instances
설명    : 현재 구성된 인스턴스의 수입니다. 이 값은 구성된 인스턴스의 수에 따라 S
GA 구조의 크기를 결정할 때 사용됩니다. 이 매개변수 값을 적당히 설정하면 SGA의 메
모리 사용을 개선할 수 있습니다. 여러 매개변수가 이 값을 사용하여 계산됩니다.
사용 가능한 값: 0이 아닌 임의의 값입니다.
기본값  : 1

parallel_threads_per_cpu
설명    : 병렬 실행 중 또는 병렬 적응 알고리즘 및 로드 밸런싱 알고리즘을 조정하
기 위해 CPU가 처리할 수 있는 스레드 또는 프로세스의 수를 나타냅니다. 대표 질의를
 실행할 때 시스템이 과부하되면 이 값을 줄여야 합니다.
사용 가능한 값: 0이 아닌 임의의 값입니다.
기본값  : 운영 체제에 따라 다름(일반적으로 2)

partition_view_enabled
설명    : PARTITION_VIEW_ENABLED가 TRUE로 설정된 경우 최적기는 분할 영역 보기에
서 불필요한 테이블 액세스를 제거하거나 생략합니다. 이 매개변수는 최적기가 기본
테이블에 대한 통계에서 분할 영역 보기에 대한 통계를 계산하는 비용 기반 방법을 변
경할 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

pga_aggregate_target
설명: 인스턴스에 첨부된 모든 서버 프로세스의 총 대상 PGA 메모리를 지정합니다. 작
업 영역의 자동 설정을 활성화하기 전에 이 매개변수를 양수 값으로 설정하십시오. 이
 메모리는 SGA에 상주하지 않습니다. 데이터베이스는 사용하는 PGA 메모리의 대상 크
기로 이 매개변수를 사용합니다. 이 매개변수를 설정할 때 Oracle 인스턴스에 대해 사
용 가능한 시스템의 총 메모리에서 SGA를 빼십시오. 남은 메모리는 pga_aggregate_tar
get에 할당할 수 있습니다.
사용 가능한 값: 이 제한을 KB, MB, GB 단위로 지정하기 위해 문자 K, M 또는 G를 붙
인 정수입니다. 최소값은 10M이고 최대값은 4000G입니다. 
기본값: 작업 영역의 자동 조정이 완전히 비활성화되어 있음을 의미하는 "지정되지 않
음"입니다.

pl_sql_compiler_flags
설명: PL/SQL 컴파일러에 의해 사용됩니다. 컴파일러 플래그 목록을 콤마로 구분된 문
자열 목록으로 지정합니다.
사용 가능한 값: native(PL/SQL 모듈이 원시 코드로 컴파일됨), interpreted(PL/SQL
모듈이 PL/SQL 바이트 코드 형식으로 컴파일됨), debug(PL/SQL 모듈이 조사 디버그 기
호를 사용하여 컴파일됨), non_debug입니다.
기본값: " interpreted, non_debug "

plsql_native_c_compiler
설명: 생성된 C 파일을 객체 파일로 컴파일하는 데 사용되는 C 컴파일러의 전체 경로
명을 지정합니다. 이 매개변수는 선택 사항입니다. 각 플랫폼에 제공되는 플랫폼별 ma
ke 파일은 이 매개변수에 대한 기본값을 포함합니다. 값이 이 매개변수에 대해 지정되
는 경우 해당 값은 make 파일의 기본값보다 우선 적용됩니다.
사용 가능한 값: C 컴파일러의 전체 경로입니다.
기본값: 없음

plsql_native_library_subdir_count

plsql_native_library_dir
설명: PL/SQL 컴파일러에 의해 사용됩니다. 원시 컴파일러에 의해 만들어진 공유 객체
가 있는 디렉토리명을 지정합니다.
사용 가능한 값: 디렉토리명입니다.
기본값: 없음

plsql_native_linker
설명: 이 매개변수는 객체 파일을 공유 객체나 DLL에 링크시키는 데 사용하는 UNIX의
ID 또는 GNU lD와 같은 링커의 전체 경로명을 지정합니다. 이 매개변수는 선택 사항입
니다. 각 플랫폼에 제공되는 플랫폼별 make 파일은 이 매개변수에 대한 기본값을 포함
합니다. 값이 이 매개변수에 대해 지정되는 경우 해당 값은 make 파일의 기본값보다
우선 적용됩니다.
사용 가능한 값: 링커의 전체 경로명입니다.
기본값: 없음

plsql_native_make_file_name
설명: make 파일의 전체 경로명을 지정합니다. make 유틸리티(PLSQL_NATIVE_MAKE_UTIL
ITY에 의해 지정됨)는 이 make 파일을 사용하여 공유 객체나 DLL을 생성합니다. 해당
플랫폼에 DLL을 생성하는 make 유틸리티에 대한 규칙을 포함하는 포트별 make 파일이
각 플랫폼에 제공됩니다.
사용 가능한 값: make 파일의 전체 경로명입니다.
기본값: 없음

plsql_native_make_utility
설명: UNIX의 make 또는 gmake(GNU make)와 같은 make 유틸리티의 전체 경로명을 지정
합니다. make 유틸리티는 생성된 C 소스에서 공유 객체나 DLL을 생성하는 데 필요합니
다.
사용 가능한 값: make 유틸리티의 전체 경로명입니다.
기본값: 없음

plsql_v2_compatibility
설명    : PL/SQL의 호환성 수준을 설정합니다. FALSE로 설정된 경우 PL/SQL V3 기능
을 사용하고 V2 기능은 금지됩니다. 그렇지 않은 경우 PL/SQL V3를 실행할 때 특정 PL
/SQL V2 기능이 허용됩니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

pre_page_sga
설명    : 플랫폼에 따라 결정되는 매개변수로 TRUE로 설정된 경우 모든 SGA 페이지를
 메모리로 로드하여 인스턴스가 신속하게 최대 성능에 도달할 수 있도록 합니다. 따라
서 이렇게 하면 인스턴스 시작 및 사용자 로그인 시간이 길어지지만 충분한 메모리를
확보하여 시스템 상의 페이지 오류를 줄일 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

processes
설명    : Oracle 서버에 동시에 접속할 수 있는 운영 체제 사용자 프로세스의 최대
수를 지정합니다. 이 값은 작업 대기열(SNP)과 병렬 실행(Pnnn) 프로세스와 같은 모든
 백그라운드 프로세스의 수를 고려해야 합니다.
사용 가능한 값: 6에서 운영 체제 특정 값까지입니다.
기본값  : PARALLEL_MAX_SERVERS 값에 따라 다름


Q
query_rewrite_enabled
설명    : 구체화된 뷰에 대한 질의 재작성을 활성화하거나 비활성화합니다. 세션 매
개변수 및 별개의 구체화된 뷰가 모두 활성화되고 비용 기반 최적화가 활성화된 경우
에만 특정 구체화된 뷰를 활성화합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

query_rewrite_integrity
설명    : Oracle 서버에 의해 강제로 실행되는 질의 재작성의 정도를 나타냅니다. EN
FORCED로 설정된 경우 Oracle이 일관성과 무결성을 보증하게 됩니다. TRUSTED로 설정
된 경우 선언된 관계를 사용한 재작성이 가능합니다. STALE_TOLERATED로 설정된 경우
구체화된 뷰는 비록 기본 데이터와 일치하지 않는 경우라도 재작성할 수 있습니다.
사용 가능한 값: ENFORCED, TRUSTED, STALE_TOLERATED
기본값  : ENFORCED


R
rdbms_server_dn
설명    : RDBMS 서버의 식별 이름입니다. 이 이름은 전사적인 디렉토리 서비스에서
전사적인 롤을 읽어 들이는 데 사용됩니다. 자세한 내용은 Oracle Advanced Security
Administrator's Guide를 참조하십시오.
사용 가능한 값: 모든 X.500 식별 이름 형식의 값입니다.
기본값  : 없음

read_only_open_delayed
설명    : 대부분의 데이터가 읽기 전용 테이블스페이스에 저장된 대규모 데이터베이
스의 시작과 같은 특정 작업의 처리 속도를 향상시키는 데 사용됩니다. TRUE로 설정된
 경우 테이블스페이스에서 데이터를 읽을 때 읽기 전용 테이블스페이스의 데이터에 먼
저 액세스합니다. 가능한 부작용에 대한 내용은 서버 참조 설명서를 참조하십시오.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

recovery_parallelism
설명    : 인스턴스 또는 매체 복구에 참여하는 프로세스의 수를 지정합니다. 0 또는
1의 값을 지정하면 단일 프로세스가 복구를 순차적으로 수행합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다. (PARALLEL_MAX_SERVERS 값을 초과할 수
없음)
기본값  : 운영 체제에 따라 다름

remote_archive_enable
설명: 원격 대상에 대한 리두 로그 파일의 아카이브가 허용되는지 여부를 제어합니다.
 오라클 데이터베이스 인스턴스가 REDO 로그 파일을 원격으로 아카이브하거나 아카이
브 REDO 로그 파일을 원격으로 받으려면 매개변수를 값 "TRUE"로 설정해야 합니다.
사용 가능한 값: FALSE | TRUE
기본값: TRUE

remote_dependencies_mode
설명    : 원격 PL/SQL 내장 프로시저에 대한 종속성을 데이터베이스가 처리하는 방법
을 지정하는 데 사용됩니다. TIMESTAMP로 설정하면 서버와 로컬 시간 기록이 일치할
경우에만 프로시저가 실행됩니다. SIGNATURE로 설정하면 서명이 유효한 경우 프로시저
가 실행됩니다.
사용 가능한 값: TIMESTAMP | SIGNATURE
기본값  : TIMESTAMP

remote_listener

remote_login_passwordfile
설명    : 권한 사용자의 암호를 운영 체제에서 확인할지 파일로 확인할지 지정합니다
. NONE으로 설정하면 Oracle은 암호 파일을 무시합니다. EXCLUSIVE로 설정하면 각 권
한 사용자를 데이터베이스의 암호 파일을 사용하여 인증합니다. SHARED로 설정하면 많
은 수의 데이터베이스가 SYS 및 INTERNAL 암호 파일 사용자를 공유합니다.
사용 가능한 값: NONE | SHARED | EXCLUSIVE
기본값  : NONE

remote_os_authent
설명    : REMOTE_OS_AUTHENT를 TRUE로 설정하면 OS_AUTHENT_PREFIX 값을 사용한 원격
 클라이언트의 인증을 허용합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

remote_os_roles
설명    : REMOTE_OS_ROLES를 TRUE로 설정하면 운영 체제가 원격 클라이언트에 대한
롤을 지정할 수 있습니다. FALSE로 설정하면 원격 클라이언트에 대한 롤은 데이터베이
스가 식별하고 관리합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

replication_dependency_tracking
설명    : 복제 서버가 변경 사항을 병렬로 전달하려면 종속성 추적이 중요합니다. FA
LSE로 설정하면 데이터베이스에 대한 읽기/쓰기 작업의 실행 속도는 빨라지지만 복제
서버에 대한 병렬 전달 종속 정보는 생성되지 않습니다.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE(읽기/쓰기 종속성 추적 활성화)

resource_limit
설명    : 데이터베이스 프로파일에 리소스 제한의 강제 수행 여부를 결정합니다. FAL
SE로 설정하면 리소스 제한의 강제 적용을 비활성화하고, TRUE 값으로 설정하면 리소
스 제한의 강제 적용을 활성화합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

resource_manager_plan
설명    : 지정된 경우 리소스 관리자가 인스턴스의 계획과 모든 종속 항목(하위 계획
, 지침 및 소비자 그룹)을 활성화합니다. 지정되지 않은 경우 리소스 관리자는 비활성
화되지만 ALTER SYSTEM 명령을 사용하면 활성화할 수 있습니다.
사용 가능한 값: 임의의 유효한 문자열입니다.
기본값  : NULL

rollback_segments
설명    : 값이 TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT 값을 초과하더라
도 인스턴스 시작 중 획득할 하나 이상의 롤백 세그먼트를 지정합니다. 형식: ROLLBAC
K_SEGMENTS = (rbseg_name [, rbseg_name] ... )
사용 가능한 값: DBA_ROLLBACK_SEGS에 나열된 임의의 롤백 세그먼트 이름입니다. (SYS
TEM 제외)
기본값  : NULL(공용 롤백 세그먼트가 기본값으로 사용됨)

row_locking
설명    : 테이블 갱신 시 행 잠금의 획득 여부를 지정합니다. ALWAYS로 설정하면 테
이블이 갱신될 때만 행 잠금을 획득합니다. INTENT로 설정하면 SELECT FOR UPDATE에
대해 행 잠금만 사용되지만 갱신 시에는 테이블 잠금을 획득합니다.
사용 가능한 값: ALWAYS | DEFAULT | INTENT
기본값  : ALWAYS


S
serial_reuse
설명    : 직렬의 재사용 가능 메모리 기능을 사용할 SQL 커서의 유형을 지정합니다.
CURSOR_SPACE_FOR_TIME = TRUE로 설정된 경우 SERIAL_REUSE 값은 무시되어 DISABLE 또
는 NULL로 설정된 것으로 처리됩니다.
사용 가능한 값: DISABLE | SELECT | DML | PLSQL | ALL | NULL
기본값  : NULL

serializable
설명    : 질의가 테이블 수준의 읽기 잠금을 획득하여 해당 질의가 포함된 트랜잭션
이 커밋될 때까지 모든 객체 읽기 갱신을 금지할지 결정합니다. 이 작업 모드는 반복
가능한 읽기를 제공하여 동일한 트랜잭션 내의 동일한 데이터에 대한 두 개의 질의가
동일한 값을 반환하는지 확인할 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

session_cached_cursors
설명    : 캐시로 저장할 세션 커서의 수를 지정합니다. 동일한 SQL 문을 여러 번 구
문 분석하면 해당 세션 커서가 세션 커서 캐시로 이동합니다. 이렇게 하면 커서가 캐
시로 저장되어 다시 열 필요가 없으므로 구문 분석 시간이 줄어듭니다.
사용 가능한 값: 0에서 운영 체제 특정 값까지입니다.
기본값  : 0

session_max_open_files
설명    : 특정 세션에서 열 수 있는 BFILE의 최대 수를 지정합니다. 이 값에 도달하
면 추가로 파일을 열기 위한 이후의 시도는 실패하게 됩니다. 이 매개변수는 운영 체
제 매개변수인 MAX_OPEN_FILES에도 종속됩니다.
사용 가능한 값: 1에서 (50, OS 수준의 MAX_OPEN_FILES)의 최소값입니다.
기본값  : 10

sessions
설명    : 사용자와 시스템 세션의 총 수를 지정합니다. 기본값은 순환 세션의 수를
고려하여 PROCESSES 값보다 큽니다.
사용 가능한 값: 임의의 정수값입니다.
기본값  : 파생(1.1 * PROCESSES + 5)

service_names
설명    : Oracle Net 리스너가 복제된 환경의 특정 데이터베이스와 같은 단일 서비스
를 식별하기 위해 사용할 수 있는 인스턴스의 서비스 이름을 지정합니다. 서비스에 도
메인이 없으면 DB_DOMAIN 매개변수가 추가됩니다.
구문         : SERVICE_NAMES = name1.domain, name2.domain
기본값  : DB_NAME.DB_DOMAIN(정의된 경우)

shadow_core_dump
설명    : UNIX에서만 사용되는 매개변수로 생성된 코어 파일에 SGA 정보를 덤프할지
지정합니다. FULL로 설정하면 SGA가 코어 덤프에 포함됩니다. PARTIAL로 설정하면 SGA
는 덤프되지 않습니다.
사용 가능한 값: FULL | PARTIAL
기본값  : FULL

shared_memory_address
설명    : SHARED_MEMORY_ADDRESS와 HI_SHARED_MEMORY_ADDRESS는 런타임 시 SGA의 시
작 주소를 지정합니다. 많은 플랫폼에서는 SGA의 시작 주소를 링크 시 지정하므로 이
러한 매개변수는 해당 플랫폼에서 무시됩니다. 두 매개변수가 모두 0 또는 NULL일 경
우 주소는 플랫폼 고유값을 사용하게 됩니다.
사용 가능한 값: 임의의 정수값입니다.
기본값  : 0

shared_pool_reserved_size
설명    : 단편화로 인한 성능 저하를 피하기 위해 공유 풀 메모리의 연속된 대규모
요청에 대해 예약된 공간을 지정합니다. 이러한 풀은 공유 풀에서 객체를 비우지 않도
록 공통적으로 필요한 모든 대규모 프로시저 및 패키지를 저장할 수 있는 크기여야 합
니다.
사용 가능한 값: SHARED_POOL_RESERVED_MIN_ALLOC에서 0.5 *
 SHARED_POOL_SIZE까지입니다. (바이트 단위)
기본값  : SHARED_POOL_SIZE 값의 5%

shared_pool_size
설명    : 공유 풀의 크기를 바이트 단위로 지정합니다. 공유 풀에는 공유 커서, 내장
 프로시저, 제어 구조 및 병렬 실행 메시지 버퍼와 같은 객체가 포함되어 있습니다.
이 값을 크게 설정하면 다중 사용자 환경에서 성능을 향상시킬 수 있습니다.
사용 가능한 값: 300 KB에서 운영 체제 특정 값입니다.
기본값  : 64비트인 경우 64MB, 아니면 16MB

shared_server_sessions
설명    : 허용할 공유 서버 구조 사용자 세션의 총 수를 지정합니다. 이 매개변수를
설정하면 전용 서버의 사용자 세션을 예약할 수 있습니다.
사용 가능한 값: 0부터 (SESSIONS - 5)까지 
기본값  : 파생: MTS_CIRCUITS 값과 (SESSIONS - 5) 값 중 작은 값

shared_servers
설명    : 공유 서버 환경에서 인스턴스가 시작될 때 생성할 서버 프로세스의 수를 지
정합니다.
사용 가능한 값: 운영 체제에 따라 다릅니다.
기본값  : 1

sga_max_size
설명: 인스턴스 사용 기간에 대한 시스템 글로벌 영역의 최대 크기를 지정합니다.
사용 가능한 값: 운영 체제에 따라 0입니다. 시작 시 최소값을 조정하면 부적절하다는
 것에 유념하십시오.
기본값: 지정된 값이 없는 경우 sga_max_size의 기본값은 시작 시 SGA의 초기 크기, X
와 동일합니다. 이 크기는 SGA에서의 다른 풀(예: 버퍼 캐시, 공유 풀, 대형 풀 등)
크기에 따라 다릅니다. 값이 X보다 작은 것으로 지정되는 경우 사용 중인 sga_max_siz
e의 크기는 X가 됩니다. 즉, 최대값(X는 사용자가 지정한 sga_max_size 값)입니다.

sort_area_retained_size
설명    : 정렬 실행이 완료된 후 보유한 사용자 전역 영역(UGA) 메모리의 최대 크기
를 지정합니다. 이 메모리는 정렬 공간에서 마지막 행이 인출된 후 운영 체제가 아닌
UGA로 환원됩니다.
사용 가능한 값: 두 개의 데이터베이스 블록에 해당하는 값부터 SORT_AREA_SIZE 값까
지입니다.
기본값  : SORT_AREA_SIZE 값

sort_area_size
설명    : SORT_AREA_SIZE는 정렬에 사용하는 메모리의 최대 크기를 바이트 단위로 지
정합니다. 정렬이 완료된 후 행은 반환되고 메모리는 해제됩니다. 대규모 정렬의 효율
성을 향상시키려면 이 크기를 증가시키십시오. 메모리가 초과되면 임시 디스크 세그먼
트를 사용합니다.
사용 가능한 값: 6개의 데이터베이스 블록에 해당하는 값(최소값)에서 운영 체제 특정
 값(최대값)까지입니다.
기본값  : 운영 체제에 따라 다름

spfile
설명: 사용 중인 현재 서버 매개변수 파일의 이름을 지정합니다.
사용 가능한 값: 정적 매개변수
기본값: SPFILE 매개변수는 사용할 서버 매개변수 파일의 이름을 나타내기 위해 클라
이언트측 PFILE에 정의될 수 있습니다. 서버에서 기본 서버 매개변수 파일을 사용하는
 경우 SPFILE 값은 서버에 의해 내부적으로 설정됩니다.

sql_trace
설명    : SQL 추적 기능을 활성화하거나 비활성화합니다. TRUE로 설정된 경우 성능
개선에 유용한 조정 정보를 수집합니다. SQL 추적 기능은 시스템 오버헤드를 유발하므
로 TRUE 설정은 조정 정보가 필요한 경우에만 사용해야 합니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

sql_version
설명    :  사용되지 않음

sql92_security
설명: 해당 참조 테이블 열 값의 갱신 또는 삭제를 실행하는 데 테이블 수준 SELECT
권한이 필요한지 여부를 지정합니다.
사용 가능한 값: TRUE | FALSE
기본값: FALSE

standby_archive_dest
설명    : 기본 인스턴스의 아카이브 로그 위치를 지정합니다. STANDBY_ARCHIVE_DEST
및 LOG_ARCHIVE_FORMAT 값을 사용하여 대기 사이트의 전체 아카이브 로그 파일 이름을
 구성합니다. 대기 데이터베이스의 RFS 서버는 ARCHIVE_LOG_DEST 값이 아닌 이 값을
사용합니다.
사용 가능한 값: NULL 문자열 또는 원시 장치 이름을 제외한 유효한 경로/장치 이름입
니다.
기본값  : NULL

standby_file_management

standby_preservs_names
설명: 대기 데이터베이스의 파일 이름이 기본 데이터베이스의 파일 이름과 동일한지
여부를 나타냅니다.
사용 가능한 값: TRUE 또는 FALSE입니다. 참고: 값을 True로 설정하고 대기 데이터베
이스가 기본 데이터베이스와 동일한 시스템에 있는 경우 기본 데이터베이스 파일은 겹
쳐쓰여질 수 있습니다.
기본값: FALSE입니다.

start_transformation_enabled
설명    : 스타 질의에 대해 비용 기반 질의 변환의 적용 여부를 결정합니다. TRUE로
설정된 경우 최적기는 스타 질의에 대한 비용 기반 변환을 고려합니다. FALSE로 설정
된 경우 변환을 사용하지 않습니다. TEMP_DISABLE로 설정하면 질의 변환을 고려하지만
 임시 테이블은 사용되지 않습니다.
사용 가능한 값: TRUE | FALSE | TEMP_DISABLE
기본값  : FALSE



T
tape_asynch_io
설명    : 순차 장치에 대한 비동기 입출력(예: Oracle 입출력 테이프 데이터의 BACKU
P 또는 RESTORE) 제어에 사용됩니다. TRUE 값은 사용 중인 플랫폼이 기록 장치에 대한
 비동기 입출력을 지원하는 경우에만 유효합니다. 비동기 입출력 구현이 안정적이지
않을 때는 FALSE 값을 사용하십시오.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

thread
설명    : 클러스터 데이터베이스 매개변수로 각 인스턴스에 대한 고유한 리두 스레드
 번호를 지정합니다. 인스턴스의 리두 스레드를 비활성화하면 해당 인스턴스를 시작할
 수 없습니다. 0으로 설정하면 활성화된 사용 가능한 공용 스레드를 선택하게 됩니다.
 \n사용 가능한 값: 0에서 활성화된 최대 스레드 수까지입니다. \n기본값  : 0

timed_statistics
설명    : 데이터베이스와 SQL 문을 조정하는 데 사용할 수 있는 운영 체제 시간 정보
를 수집합니다. 운영 체제에서 시간을 요청하는 오버헤드를 방지하려면 이 값을 0으로
 설정합니다. TRUE로 설정하면 오래 지속되는 작업의 진행 상황을 보는 데 유용하게
사용할 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

timed_os_statistics
설명    : 시스템 관리자가 운영 체제 통계를 수집하기 위해 사용합니다. 리소스를 효
율적으로 사용하기 위해 필요한 경우에만 이 값을 설정합니다. 전용 서버의 경우 운영
 체제 통계는 사용자가 접속 및 접속 해제하거나 지정된 시간 제한이 만료되어 호출이
 인출될 때 수집됩니다. 공유 서버의 경우 통계는 인출 또는 인입된 호출에 대해 수집
됩니다.
사용 가능한 값: 초 단위의 시간입니다.
기본값  : 0(운영 체제 통계 새로 고침 없음)

trace_enabled

tracefile_identifier

transaction_auditing
설명    : 트랜잭션 계층이 사용자 로그온 이름, 사용자 이름, 세션 ID, 일부 운영 체
제 정보 및 클라이언트 정보를 포함한 특수한 리두 레코드를 생성할지 결정합니다. 이
러한 레코드는 리두 로그 분석 도구를 사용할 때 유용할 수 있습니다.
사용 가능한 값: TRUE | FALSE
기본값  : TRUE

transactions
설명    : 동시 트랜잭션의 최대 수를 지정합니다. 이 값을 크게 설정하면 SGA 크기가
 증가하여 인스턴스 시작 시 할당된 롤백 세그먼트 수를 증가시킬 수 있습니다. 기본
값은 순환 트랜잭션 수를 고려하여 SESSIONS 값 크기보다 큽니다.
사용 가능한 값: 숫자입니다.
기본값  : 파생(1.1 * SESSIONS)

transactions_per_rollback_segment
설명    : 롤백 세그먼트당 허용된 동시 트랜잭션의 수를 지정합니다. 시작 시 획득하
는 롤백 세그먼트의 최소 수는 TRANSACTIONS 값을 이 매개변수 값으로 나눈 값에 해당
합니다. 롤백 세그먼트 이름을 ROLLBACK_SEGMENTS 매개변수에 지정하면 더 많은 수의
롤백 세그먼트를 획득할 수 있습니다.
사용 가능한 값: 1에서 운영 체제 특정 값까지입니다.
기본값  : 5


U
undo_retention
설명: UNDO_RETENTION 매개변수는 데이터베이스에 보유할 커밋된 실행 취소 정보의 양
을 지정하는 데 사용됩니다. 매개변수 값은 인스턴스 시작 시간에 설정할 수 있습니다
. 실행 취소 보존 공간 요구 사항을 만족시키는 데 필요한 실행 취소 공간의 양은 다
음과 같이 계산될 수 있습니다. UndoSpace = RD * UPS. 여기서 UndoSpace는 실행 취소
 블록 수로 나타나고 RD는 초 단위의 UNDO_RETENTION으로 나타나며 UPS는 초당 실행
취소 블록 수로 나타납니다.
사용 가능한 값: 허용 최대값은 (2 ** 32)초입니다.
기본값: 30초입니다.

undo_management
설명: 시스템이 사용해야 하는 실행 취소 공간 관리 모드를 지정합니다. AUTO로 설정
할 경우 인스턴스는 SMU 모드로 시작됩니다. 그렇지 않은 경우 RBU 모드로 시작됩니다
. RBU 모드에서 실행 취소 공간은 롤백 세그먼트로 외부적으로 할당됩니다. SMU 모드
에서 실행 취소 공간은 실행 취소 테이블스페이스로 외부적으로 할당됩니다.
사용 가능한 값: Auto 또는 Manual
기본값: 첫번째 인스턴스가 시작될 때 UNDO_MANAGEMENT 매개변수가 생략되는 경우 MAN
UAL의 기본값이 사용되며 인스턴스는 RBU 모드로 시작됩니다. 첫번째 인스턴스가 아닌
 경우 인스턴스는 모든 다른 기존의 인스턴스와 동일한 실행 취소 모드로 시작됩니다.

undo_suppress_errors
설명: 사용자가 SMU 모드로 RBU 작업(예: ALTER ROLLBACK SEGMENT ONLINE) 실행을 시
도하는 동안 오류를 방지할 수 있도록 합니다. 사용자는 모든 응용 프로그램 및 스크
립트가 SMU 모드로 변환되기 전에 SMU 기능을 사용할 수 있습니다.
사용 가능한 값: True 또는 False
기본값: False입니다.

undo_tablespace
설명: 실행 취소 테이블스페이스는 실행 취소 정보를 저장하는 데 단독으로 사용됩니
다. UNDO_TABLESPACE는 SMU(시스템 관리 실행 취소) 모드로만 사용할 수 있습니다. 지
정된 실행 취소 테이블스페이스, <undoname>은 인스턴스에 의해 사용됩니다. 테이블스
페이스가 존재하지 않는 경우, 실행 취소 테이블스페이스가 아닌 경우 또는 다른 인스
턴스에 의해 사용 중인 경우 인스턴스 STARTUP은 실패합니다.
기본값: 각 데이터베이스는 0 또는 더 많은 실행 취소 테이블스페이스를 포함합니다.
SMU 모드에서 각 ORACLE 인스턴스는 하나의 실행 취소 테이블스페이스에 할당됩니다.

use_indirect_data_buffers
설명    : 4GB 이상의 물리적 메모리를 지원할 수 있는 32비트 플랫폼에 대해 확장된
버퍼 캐시 방식의 사용을 제어합니다. 다른 플랫폼에서는 무시됩니다.
사용 가능한 값: TRUE | FALSE
기본값  : FALSE

user_dump_dest
설명    : 사용자 프로세스를 대신하여 디버깅 추적 파일을 기록할 위치의 디렉토리
경로명을 지정합니다. 예: NT의 경우 C:/ORACLE/UTRC; UNIX의 경우 /oracle/utrc; VMS
의 경우 DISK$UR3:[ORACLE.UTRC]
사용 가능한 값: 유효한 로컬 경로명, 디렉토리, 디스크입니다.
기본값  : 운영 체제에 따라 다름

utl_file_dir
설명    : 데이터베이스 관리자가 PL/SQL 파일 입출력이 허용된 디렉토리를 지정할 수
 있도록 합니다. 하나 이상의 디렉토리를 지정하려면 여러 개의 UTL_FILE_DIR 매개변
수를 사용하십시오. UTL_FILE_DIR 매개변수에 지정된 파일에 대해서는 모든 사용자가
읽기 또는 쓰기 작업을 수행할 수 있습니다.
사용 가능한 값: 임의의 유효한 디렉토리 경로입니다.
기본값  : 없음


V


W
workarea_size_policy
설명: 작업 영역 크기 조정 정책을 지정합니다. 이 매개변수는 작업 영역이 조정되는
모드를 제어합니다.
사용 가능한 값: AUTO, MANUAL입니다.
기본값: PGA_AGGREGATE_TARGET이 설정되어 있는 경우에는 AUTO, 그렇지 않은 경우에는
 MANUAL입니다.


X


Y


Z



 
 
 
 
 
 
 
 
 
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:56
반응형
--FLASH BACK QUERY

SQL> SHOW PARAMETER UNDO

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1

--undo_management: UNDO SEGMENT의 관리
AUTO는 자동관리
//플래쉬백 쿼리를 쓰려면 undo_management가 반드시 AUTO해야된다

--undo_retention : COMMIT후 DATA 지속시간
//현재 10800
SQL> SELECT 10800/60/60 FROM DUAL;

10800/60/60
-----------
          3

1 개의 행이 선택되었습니다.

--10800: 3시간까지 이다.
//시간 변경 하면 15 분  후부터 적용

SQL> DESC DBMS_FLASHBACK
PROCEDURE DISABLE
PROCEDURE ENABLE_AT_SYSTEM_CHANGE_NUMBER
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 QUERY_SCN                      NUMBER                  IN
PROCEDURE ENABLE_AT_TIME
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 QUERY_TIME                     TIMESTAMP               IN
FUNCTION GET_SYSTEM_CHANGE_NUMBER RETURNS NUMBER

-- FLASHBACK
실행할수 있는 권한이 있어야한다.

//SCOTT 실수로 EMP테이블을 삭제한다.
--SCOTT
C:\Documents and Settings\easy>SQLPLUS SCOTT/TIGER

SQL*Plus: Release 9.2.0.1.0 - Production on 월 Jun 16 15:47:56 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


다음에 접속됨:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> DELETE EMP;

14 행이 삭제되었습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> @TIME

TO_CHAR(SYSDATE,'YY
-------------------
2008-06-16:15:48:37

SQL> SELECT * FROM EMP;

선택된 레코드가 없습니다.

//SYS는 SCOTT이 삭제한지 모르고 SCOTT의 EMP테이블을 조회해본다

--SYS

SQL> SHOW USER
USER은 "SYS"입니다.

SQL> SELECT * FROM SCOTT.EMP
  2  ;

선택된 레코드가 없습니다. //나올리가없다;

-- FLASHBACK
실행할수 있는 권한이 있어야한다.

SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO SCOTT;

권한이 부여되었습니다.

//SCOTT접속
SQL> CONN SCOTT/TIGER
연결되었습니다.

SQL> DESC DBMS_FLASHBACK
PROCEDURE DISABLE
PROCEDURE ENABLE_AT_SYSTEM_CHANGE_NUMBER
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 QUERY_SCN                      NUMBER                  IN
PROCEDURE ENABLE_AT_TIME
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 QUERY_TIME                     TIMESTAMP               IN
FUNCTION GET_SYSTEM_CHANGE_NUMBER RETURNS NUMBER

SQL> SELECT * FROM SCOTT.EMP;

선택된 레코드가 없습니다.

//타임머신을 타고 EMP테이블이 삭제하기 전시간으로 돌아간다고 생각하면된다.

SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP(-
> '2008/06/16:15:43:37','YYYY/MM/DD:HH24:MI:SS'));

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> SELECT * FROM SCOTT.EMP; //현재시간은 삭제하기 전 시간이다.

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 81/06/09       2450
        10

      7788 SCOTT      ANALYST         7566 87/04/19       3000
        20

      7839 KING       PRESIDENT            81/11/17       5000
        10


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


14 개의 행이 선택되었습니다.

//DELETE하기 전시간이라 테이블이 보인다.복구된 것은 아니다.

--다시돌아오기:EXECUTE DBMS_FLASHBACK.DISABLE();

SQL> EXECUTE DBMS_FLASHBACK.DISABLE();

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> SELECT * FROM SCOTT.EMP;// 원래시간으로 돌아왔기때문에 테이블이 보이지않는다.

선택된 레코드가 없습니다.

//다시 삭제전 시간으로
SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('2008/06/16:15:43:37','YYYY/MM/DD:HH24:MI:SS
'));

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> SELECT * FROM SCOTT.EMP;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 81/06/09       2450
        10

      7788 SCOTT      ANALYST         7566 87/04/19       3000
        20

      7839 KING       PRESIDENT            81/11/17       5000
        10


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


14 개의 행이 선택되었습니다.

SQL> @TIME

TO_CHAR(SYSDATE,'YY
-------------------
2008-06-16:16:02:29

1 개의 행이 선택되었습니다.

//원래시간으로
SQL> EXECUTE DBMS_FLASHBACK.DISABLE();

PL/SQL 처리가 정상적으로 완료되었습니다.

//그렇다면 EMP테이블을 복구할려면 FLASH BACK을 사용해 삭제전 과거의 테이블을
불러와서 현재의 EMP테이블에 넣어주면된다

--복구
SQL> INSERT INTO EMP
  2  SELECT * FROM EMP AS OF TIMESTAMP(TO_TIMESTAMP(
  3  '2008/06/16:15:43:37','YYYY/MM/DD:HH24:MI:SS'));

14 개의 행이 만들어졌습니다.

SQL> SELECT * FROM EMP;  //정상조회된다.

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 81/06/09       2450
        10

      7788 SCOTT      ANALYST         7566 87/04/19       3000
        20

      7839 KING       PRESIDENT            81/11/17       5000
        10


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


14 개의 행이 선택되었습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> SELECT * FROM EMP;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 81/06/09       2450
        10

      7788 SCOTT      ANALYST         7566 87/04/19       3000
        20

      7839 KING       PRESIDENT            81/11/17       5000
        10


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


14 개의 행이 선택되었습니다.

SQL> SELECT * FROM EMP;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 81/06/09       2450
        10

      7788 SCOTT      ANALYST         7566 87/04/19       3000
        20

      7839 KING       PRESIDENT            81/11/17       5000
        10


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


14 개의 행이 선택되었습니다.

SQL>

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:38
반응형
생성위치: $ORACLE_HOME/dbs/
파일이름: spfileSID.ora
관련파일: initSID.ora(pfile)

텍스트파일인 pfile과 달리 바이너리파일인 spfile은 텍스트 에디터로 수정할 수 없다.
pfile로 생성된 이후에는 alter system 명령으로 수정해야한다.

spfile을 생성하는 방법은 다음과 같다.
SQL> create SPFILE from PFILE;

인스턴스가 재시작된 이후에는 데이터베이스 초기화를 위해서는 spfile만 사용

관련된에러:
ORA-32001: write to SPFILE requested but no SPFILE specified at startup
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:36
반응형

# OracleInstanceShutdown

+ Shutdown normal
- 새로운 사용자 연결 불허
- 모든 사용자가 데이터베이스 접속을 끊을 때까지 대기
- 이미 연결된 사용자는 계속 작업 가능
- 모든 사용자의 접속이 끊기면 데이터베이스를 닫고 인스턴스를 디스마운트한 후에 인스턴스 종료

+ Shutdown immediate
- 새로운 사용자 연결 불허
- 모든 사용자의 데이터베이스 접속 종료
- 커밋되지 않은 트랜잭션들은 롤백
- 데이터베이스를 닫고, 인스턴스 디스마운트, 인스턴스 중료 순

+ Shutdown transactional
- 새로운 사용자 연결 불허
- 새로운 트랜잭션 불허. 사용자가 새로운 트랜잭션을 시도할 경우 세션 종료
- 사용자의 롤백하거나 커밋하지 않은 트랜잭션이 커밋될 때까지 대기
- 모든 트랜잭션이 완료되면, 데이터베이스를 닫고, 인스턴스 디스마운트, 인스턴스 종료 순

$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:36
반응형

# OracleInstanceShutdown

+ Shutdown normal
- 새로운 사용자 연결 불허
- 모든 사용자가 데이터베이스 접속을 끊을 때까지 대기
- 이미 연결된 사용자는 계속 작업 가능
- 모든 사용자의 접속이 끊기면 데이터베이스를 닫고 인스턴스를 디스마운트한 후에 인스턴스 종료

+ Shutdown immediate
- 새로운 사용자 연결 불허
- 모든 사용자의 데이터베이스 접속 종료
- 커밋되지 않은 트랜잭션들은 롤백
- 데이터베이스를 닫고, 인스턴스 디스마운트, 인스턴스 중료 순

+ Shutdown transactional
- 새로운 사용자 연결 불허
- 새로운 트랜잭션 불허. 사용자가 새로운 트랜잭션을 시도할 경우 세션 종료
- 사용자의 롤백하거나 커밋하지 않은 트랜잭션이 커밋될 때까지 대기
- 모든 트랜잭션이 완료되면, 데이터베이스를 닫고, 인스턴스 디스마운트, 인스턴스 종료 순

$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:29
반응형

<Optimization Approaches and Goals - Optimization  접근과 목적>                    
/*+ ALL_ROWS */                                                                    
        explicitly chooses the cost-based approach to optimize a statement         
        block with a goal of best throughput (that is, minimum                     
        total resource consumption)                                                
        가장 좋은 단위 처리량의 목표로 문 블록을 최적화하기 위해 cost-based        
        접근 방법을 선택합니다. (즉, 전체적인 최소의 자원 소비)                    
/*+ CHOOSE */                                                                      
        causes the optimizer to choose between the rule-based                      
        approach and the cost-based approach for a SQL statement                   
        based on the presence of statistics for the tables accessed by             
        the statement                                                              
        최적자(optimizer)가 그 문에 의해 접근된 테이블을 위해 통계의 존재에        
        근거를 두는 SQL 문을 위해 rule-based 접근 방법과 cot-based 접근 방법       
        사이에 선택하게 합니다.                                                    
/*+ FIRST_ROWS */                                                                  
        explicitly chooses the cost-based approach to optimize a statement         
        block with a goal of best response time (minimum                           
        resource usage to return first row)                                        
        가장 좋은 응답 시간의 목표로 문 블록을 최적화하기 위해 cost-based 접근     
        방법을 선택합니다. (첫 번째 행을 되돌려 주는 최소의 자원 사용)             
/*+ RULE */                                                                        
        explicitly chooses rule-based optimization for a statement block           
        rule-based 최적화를 고르는 접근방법을 선택합니다.                          
                                                                                   
<Access Methods - 접근 방법>                                                       
/*+ AND_EQUAL(table index) */                                                      
        explicitly chooses an execution plan that uses an access path              
        that merges the scans on several single-column indexes                     
        그만큼 실행 계획을 선택합니다. 그리고 여럿의 single-column 색인에          
        그 scan을 합병하는 접근 경로를 사용합니다.                                 
/*+ CLUSTER(table) */                                                              
        explicitly chooses a cluster scan to access the specified table            
        선택합니다. 그리고, 클러스터는 그 명시된 테이블을 접근하기 위해 살핍니다.  
/*+ FULL(table) */                                                                 
        explicitly chooses a full table scan for the specified table               
        그 명시된 테이블을 위하여, 전체 테이블 scan을 고르는                       
/*+ HASH(table) */                                                                 
        explicitly chooses a hash scan to access the specified table               
        선택합니다. 그리고, 해쉬는 그 명시된 테이블을 접근하기 위해 운율을         
         살핍니다.                                                                 
/*+ HASH_AJ(table) */                                                              
        transforms a NOT IN subquery into a hash antijoin to access                
        the specified table                                                        
        변환, 그 명시된 테이블을 접근하는 해쉬 antijoin으로의 NOT IN 부속 조회     
/*+ HASH_SJ (table) */                                                             
        transforms a NOT IN subquery into a hash anti-join to access               
        the specified table                                                        
        변환, 그 명시된 테이블을 접근하는 해쉬 anti-join으로의 NOT IN 부속 조회    
/*+ INDEX(table index) */                                                          
        explicitly chooses an index scan for the specified table                   
        그 명시된 테이블을 위하여, 색인 scan을 고르는                              
/*+ INDEX_ASC(table index) */                                                      
        explicitly chooses an ascending-range index scan for the specified         
        table 그 명시된 테이블을 위하여, ascending-range 색인 scan을 고르는        
/*+ INDEX_COMBINE(table index) */                                                  
        If no indexes are given as arguments for the INDEX_COMBINE                 
        hint, the optimizer uses whatever Boolean combination                      
        of bitmap indexes has the best cost estimate. If particular                
        indexes are given as arguments, the optimizer tries to use                 
        some Boolean combination of those particular bitmap indexes.               
        어떤 색인도 INDEX_COMBINE 암시를 위해 인수로서 주어지지 않는다면,          
        bitmap 색인의 결합이 어떤 부울의를 가장 좋은 수행 난이도 평가를 가지고     
        있든지 최적자는 이용합니다.                                                
        특별한 색인이 인수로서 주어진다면, 최적자는 그 특별한 bitmap 색인의        
        몇몇의 부울의 결합을 사용하려고 노력합니다.                                
/*+ INDEX_DESC(table index) */                                                     
        explicitly chooses a descending-range index scan for the specified         
        table                                                                      
        그 명시된 테이블을 위하여, descending-range 색인 scan을 고르는             
/*+ INDEX_FFS(table index) */                                                      
        causes a fast full index scan to be performed rather than a full           
        table scan                                                                 
        빠른 전체 색인 scan이 전체 테이블 scan이라기보다는 수행되게 합니다.        
/*+ MERGE_AJ (table) */                                                            
        transforms a NOT IN subquery into a merge anti-join to access              
        the specified table                                                        
        변환, NOT IN 부속 조회, 그 명시된 테이블을 접근하기 위해 anti-join을       
        합병합니다.                                                                
/*+ MERGE_SJ (table) */                                                            
        transforms a correlated EXISTS subquery into a merge semi-join             
        to access the specified table                                              
        변환, 관련된 EXISTS 부속 조회, 접근으로 semi-join을 합병합니다,            
        그 명시된 테이블                                                           
/*+ ROWID(table) */                                                                
        explicitly chooses a table scan by ROWID for the specified                 
        table                                                                      
        그 명시된 테이블을 위하여, ROWID에 의해 테이블 scan을 고르는               
/*+ USE_CONCAT */                                                                  
        forces combined OR conditions in the WHERE clause of a                     
        query to be transformed into a compound query using the                    
        UNION ALL set operator                                                     
        질의의 WHERE 문절에 있는 UNION ALL 집합 연산자를 사용하는 합성의           
        질의로 변형되는 OR 조건을 합쳤습니다.                                      
                                                                                   
<Join Orders>                                                                      
/*+ LEADING(테이블) */                                                             
      Driving 테이블 결정, 힌트에 명시된 테이블이 먼저 Driving됨                   
/*+ ORDERED */                                                                     
        causes Oracle to join tables in the order in which they appear             
        in the FROM clause                                                         
        오라클이 From 절 순서로 테이블을 결합시키게 합니다.                        
/*+ STAR */                                                                        
        forces the large table to be joined last using a nested-loops join         
        on the index                                                               
        큰 테이블이 최종 사용/회전율에 nested-loops를 결합시킨                     
        그 색인에 결합합니다.                                                      
                                                                                   
                                                                                   
<Join Operations>                                                                  
/*+ DRIVING_SITE (table) */                                                        
        forces query execution to be done at a different site from that            
        selected by Oracle                                                         
        오라클에 의해 선택된 사이트에 되는 실행을 질의합니다.                      
/*+ USE_HASH (table) */                                                            
        causes Oracle to join each specified table with another row                
        source with a hash join                                                    
        오라클이 테이블이 다른 행 자원으로 해시 접합으로 명시되면서 각자와         
        합치게 합니다.                                                             
/*+ USE_MERGE (table) */                                                           
        causes Oracle to join each specified table with another row                
        source with a sort-merge join                                              
        오라클이 테이블이 다른 행 자원으로 sort-merge 접합으로 명시되면서 각자와   
        합치게 합니다.                                                             
/*+ USE_NL (table) */                                                              
        causes Oracle to join each specified table to another row                  
        source with a nested-loops join using the specified table as the           
        inner table                                                                
        오라클이 그 명시된 테이블을 그 안의 테이블로 사용하는 nested-loops 집합과  
        각자와 다른 행 자원에 대한 명시된 테이블을 합치게 합니다.                  
                                                                                   
<Parallel Execution>                                                               
/*+ APPEND */ , /*+ NOAPPEND */                                                    
        specifies that data is simply appended (or not) to a table; existing       
        free space is not used. Use these hints only following the                 
        INSERT keyword.                                                            
        데이터가 테이블로 단순히 덧붙여진다는 (or not)것을 명시합니다;             
        현존하는 영역은 사용되지 않습니다.                                         
        단지 그 삽입 키 핵심어를 따르는 이 암시를 사용하시오.                      
/*+ NOPARALLEL(table) */                                                           
        disables parallel scanning of a table, even if the table was created       
        with a PARALLEL clause                                                     
        그 테이블이 PARALLEL 문절로 새로 만들어졌다면 테이블의 평행의 순차 검색을  
        무능하게 만듭니다.                                                         
/*+ PARALLEL(table, instances) */                                                  
        allows you to specify the desired number of concurrent slave               
        processes that can be used for the operation.                              
        DELETE, INSERT, and UPDATE operations are considered for                   
        parallelization only if the session is in a PARALLEL DML                   
        enabled mode. (Use ALTER SESSION PARALLEL DML to                           
        enter this mode.)                                                          
        당신이 그 연산을 위해 사용될 수 있는 동시의 슬레이브(slave) 프로세스의     
        요구된 수를 명시하는 것을 허락합니다.                                      
        그 세션이 가능하게 된 PARALLEL DML에 모드를 있다면, DELETE, INSERT, UPDATE 
        연산은 단지 parallelization에 대해 고려됩니다. (사용은 이 모드에 들어가기  
        위해 평행의 세션 DML을 변경합니다.)                                        
/*+ PARALLEL_INDEX                                                                 
        allows you to parallelize fast full index scan for partitioned             
        and nonpartitioned indexes that have the PARALLEL attribute                
        parallelize에 당신에게 빠른 가득한 색인 scan을 허락합니다. 그런데,         
        그것은 PARALLEL 속성을 가지고 있는 색인을 분할했고 nonpartitioned했습니다. 
/*+ NOPARALLEL_INDEX */                                                            
        overrides a PARALLEL attribute setting on an index                         
        병렬이 색인을 나아가는 것을 속하게 하는 대체                               
                                                                                   
<Other Hints>                                                                      
/*+ CACHE */                                                                       
        specifies that the blocks retrieved for the table in the hint are          
        placed at the most recently used end of the LRU list in the                
        buffer cache when a full table scan is performed                           
        그 블록이 찾아서 가져왔다는 것을 명시합니다. 그리고 그 테이블을 위해       
        그 암시에 놓여집니다. 그런데, 그것은 가장 요즈음 사용된 언제 그 버퍼       
        캐시, 가득한 테이블 scan에 있는 LRU 리스트의 끝입니다. 수행됩니다.         
/*+ NOCACHE */                                                                     
        specifies that the blocks retrieved for this table are placed at           
        the least recently used end of the LRU list in the buffer cache            
        when a full table scan is performed                                        
        그 명시합니다. 그리고, 그 블록은 이 테이블을 위해 검색되면서 요즈음 사용   
        된 언제 그 버퍼 캐시, 가득한 테이블 scan에 있는 LRU 리스트의 가장 작은     
        끝에 놓여집니다. 수행됩니다.                                               
/*+ MERGE (table) */                                                               
        causes Oracle to evaluate complex views or subqueries before               
        the surrounding query                                                      
        오라클이 그 둘러싸는 질의 전에 복잡한 뷰나 부속 조회를 평가하게 합니다.    
/*+ NO_MERGE (table) */                                                            
        causes Oracle not to merge mergeable views                                 
        오라클이 mergeable 뷰를 합병하지 않게 하지 않습니다                        
/*+ PUSH_JOIN_PRED (table) */                                                      
        causes the optimizer to evaluate, on a cost basis, whether or              
        not to push individual join predicates into the view                       
        개개 접합을 미는 것이 그 뷰 안으로 단정 하든 간에 비용 방식으로 최적자가   
        평가하게 합니다.                                                           
/*+ NO_PUSH_JOIN_PRED (table) */                                                   
        Prevents pushing of a join predicate into the view                         
        접합 술부 중에서 그 뷰로 밀면서, 막는                                      
/*+ PUSH_SUBQ */                                                                   
        causes nonmerged subqueries to be evaluated at the earliest                
        possible place in the execution plan                                       
        원인은 그 실행 계획에서의 가장 이른 가능한 장소에 평가되는 부속 조회를     
        nonmerged 했습니다.                                                        
/*+ STAR_TRANSFORMATION */                                                         
        makes the optimizer use the best plan in which the transformation          
        has been used.                                                             
        최적자가 그 변형이 사용된 가장 좋은 계획을 사용하는 제작    

출처 : Tong - atc17cjh님의 oracle통

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:28
반응형

oerr ora n

-----
현상 : Oracle Stored Procedure 호출이 제대로 되지 않음
원인 : Stored Procedure에 입출력되는 VARCHAR 변수의 초기화가 되지 않음
조치 : Stored Procedure 입력, 출력 VARCHAR 변수의 Length를 반드시 설정
(TMS에 문제를 일으키는 것으로 보임)
-----
현상 : exec TMS_ORACLE7 -A: Failed.
원인 : ORACLE에서 DB 사용자에게 GRANT(사용허가권)가 없어서 발생하는 문제임.
ORACLE LIB에서 문제가 생길 수도 있다.
조치 : ORACLE의 VIEW중에 V$XATRANS$라는 VIEW를 GRANT시켜주면 조치됨.
ORACLE의 DBA권한에서 실행가능함.
방법: grant all on V$XATRANS$ TO SCRJPCS
여기서 SCRJPCS는 DB USER-ID임.
-----
현상 : DataBase에 연결하지 못한다.
원인 : 1.해당 DataBase에 필요한 환경 설정이 잘못되어 있다.(INVAL Error발생)
2.환경 파일에 환경 설정이 잘못되어 있다.(INVAL Error)
3.DataBase에 권한이 없다.
4.DataBase가 기동되지 않았다.
조치 : 1.set 명령으로 필요한 환경변수 설정을 확인한다.
- Oracle : ORACLE_HOME, ORACLE_SID, ORA_NLS
- Informix : INFORMIXDIR, INFORMIXSERVER
2.구성파일에 설정되어 있는 ENVFILE을 확인한다.
3.해당 User에게 DataBase 권한을 부여한다.
- ORACLE : "v$xatrans$"라는 VIEW에 대하여 해당 User에게 권한을 부여한다.
- INFORMIN : 해당 DB를 사용할 수 있는 권한을 User에게 부여한다.
4.DataBase를 기동하고 Server를 새로 띄운다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PLS-00801: Message 801 not found; product=PLSQL; facility=PCM
22/9 PL/SQL: SQL Statement ignored
28/17 PLS-00201: identifier 'JWONRYO.JWONMAS' must be declared
62/9 PL/SQL: SQL Statement ignored
원인 : 현 Database의 Domain 밖에 있는 Table을 Handling하는 경우에 권한이 없는
경우에 발생
조치 : 접근할 수 있는 권한을 부여한다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
135/5 PL/SQL: Statement ignored
135/9 PLS-00365: 'AVSQLCODE' is an OUT parameter and cannot be read
원인 : OUT parameter를 IN parameter로 사용하고 그 값을 읽은 경우.
조치 : OUT parameter를 IN OUT parameter로 선언.
-----
현상 : ORA-0020
원인 : 프로세스 수를 프로세스를 초과한 경우.
조치 : 프로세스 수를 들여줌.
-----
현상 : ORA-00023: session references process's private memory; cannot detach session
원인 : XA library를 사용하는데 Oracle이 dedicator server로 설치된 경우 발생
조치 : XA library를 사용할려면 Oracle을 MTS mode로 설치되어야 한다.
-----
현상 : 1.ORA-0054 resource busy and acquire with NOWAIT specified
2.ORA-0054 WHEN DROP A TABLE(SESSION KILL)
원인 : 1.Oracle 사용자가 어떤 Row을 Lock를 했는데, 다른 Oracle 사용자가 NOWAIT문을 이용하여
동일한 Row를 Lock를 한 경우에 발생
2.TABLE에 LOCK이 걸려 DML 및 DDL 명령 사용시
조치 : LOCK을 걸고있는 SESSION들을 KILL
-----
현상 : ORA-0059
원인 : DB_FILES 값에 도달한 경우
조치 : init.ora 의 DB_FILES 를 늘려주고 DB 를 Restartup 하면 해결
-----
현상 : ORA-00210: cannot open control file '/dev/vx/rdsk/oracle/v_ctl1'
ORA-07368: sfofi: open error, unable to open database file.
원인 : Sequent Symmetry or NUMA-Q platform이 very large file (O/S에서 2GB
이상의 file system 지원)을 지원하기 위해 VLFS patch를 적용했거나
VLFS를 이미 지원하는 O/S Version일 경우 오라클 master node가 정상적으로
startup 되고 나서 다른 node가 startup parallel이 될 때 먼저 startup 된
master node가 shared disk 의 모든 오라클 관련 file을
none-shared mode로 open 하기 때문에 위의 현상이 발생됨.
조치 : 1.PTX/Cluster V1.3.2일 경우
* Oracle V7.3.x : O/S상에서 VLFS patch적용하지 않았을 경우는 관계
없으나, 이미 적용되었다면 추가적으로 O/S patch FP#23373
적용하여야 함
2.PTX/Cluster running DYNIX/PTX 4.4.x 일 경우
* Oracle V7.3.3 : 현재 fix된 patch는 없으며 다음과 같은
workaround 방법으로 해결이 가능함.

Workaround)
--- $ORACLE_HOME/rdbms/lib/ins_rdbms.mk file에 아래의 추가된 부분만
삽입하여 오라클 kernel relink 실시
(예:make -f ins_rdbms ioracle)
oracle: $(ORALIBD) $(CORELIBD) $(NETLIBD) $(KSMS) $(CONFIG)
$(PSOLIBLIST) opimai.o @$(ECHO) $(LINK) -o $@ $(LDFLAGS)
$(LDFLAGS_ORA) opimai.o $(CONFIG) \
-llkseqora \ ---> 추가된 부분
$(LLIBSERVER) $(LLIBORA) $(LLIBKNLOPT) $(LLIBSLAX)
$(LLIBPLSQL) \
$(LLIBSICX) $(LLIBSOWSUTL) \
$(LLIBSICX) $(LLIBSOWSUTL) \

...........
...........

* Oracle V7.3.4 :
Oracle V7.3.4 일 경우는 문제가 없으나 patchset을 적용할 경우
V7.3.4.2에서는 V7.3.3과 같은 방법으로 oracle kernel을 relink하면
문제가 해결됨.
-----
현상 : ORA-0376 : file %s cannot be read at this time
원인 : DBF가 파손됨.
조치 : Check the state of the file. Bring it online
-----
현상 : ORA-00376: file 29 cannot be read at this time
ORA-01110: data file 29: '/db/GICORP_4/axix01.dbf'
원인 : datafile의 size가 os에서 허용하는 filesize를 초과해서 발생.
조치 : unix의 ulimit filesize를 확인해 보시기 바랍니다.
그리고 datafile size 보다 크도록 수정해 주어야 합니다.
1.unix ulimit filesize를 증가 시킨다
C shell인 경우
% limit filesize <number>
Bourne 이나 Korn shell 인 경우
$ ulimit -f <number>
2.archivelog mode인지 확인합니다
SVRMGR> select * from v$database;

NAME CREATED LOG_MODE CHECKPOINT ARCHIVE_CH
--------- -------------------- ------------ ---------- ----------
GICORP 05/17/00 13:44:56 ARCHIVELOG 36290290 36284249
1 row selected.
3.media recovery가 필요한 datafiles를 찾습니다
SVRMGR> select * from v$recover_file;

FILE# ONLINE ERROR CHANGE# TIME
---------- ------- ------------------ ---------- --------------------
9 OFFLINE 36287415 12/20/00 23:30:55
23 OFFLINE 36289350 12/21/00 08:40:54
28 OFFLINE 36287415 12/20/00 23:30:55
29 OFFLINE 36287415 12/20/00 23:30:55
37 OFFLINE 36287415 12/20/00 23:30:55
5 rows selected.
4.각각의 datafile에 대해서 다음을 실행해 줍니다
SVRMGR> recover datafile '/db/GICORP_4/axix01.dbf';

Media recovery complete.

SVRMGR> alter database datafile '/db/GICORP_4/axix01.dbf' ONLINE;
Statement processed.

5.database를 restart합니다

SVRMGR> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 54578916 bytes
Fixed Size 69348 bytes
Variable Size 20783104 bytes
Database Buffers 33554432 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
SVRMGR>
-----
현상 : ORA-0312,0313 에러(ONLINE LOG CRASH)
원인 : 1.데이타베이스 STARTUP 시 발생
조치 : [ ONLINE LOG 가 손상되었을때 DB에 OPERATION 이 없었던 경우는 다음과 같은 절차로 DB을
OPEN 할수있다 - 확률 70% ]

1.CONTROLFILE 생성
-. 손상된 online log 는 포함시키지 않는다.
-.resetlogs option 으로 생성한다.
-.reuse option 은 생략하고 기존 controlfile 은 다른이름으로 move 시킴.

<V7 에서 CONTROLFILE 생성하는 방법 >
sqldba> startup mount
sqldba> alter database backup controlfile to trace;

위와 같이 명령을 입력하면 ORACLE_HOME/rdbms/log 디렉토리에 트레이스 화일이
생긴다. 그 트레이스 화일에서 create controlfile 명령부분을 남기고 삭제한다.
콘트롤화일 생성 문장 예 - <cnt.sql> : GROUP 1 이 ONLINE LOG 라고 가정
---------------------------------------------------------------------
CREATE CONTROLFILE DATABASE "RC722" RESETLOGS NOARCHIVELOG
MAXLOGFILES 32 ********
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 8
MAXLOGHISTORY 800
LOGFILE
GROUP 2 '/oracle/oracle/dbs/log2RC722.dbf' SIZE 5M,
GROUP 3 '/oracle/oracle/dbs/log3RC722.dbf' SIZE 5M
DATAFILE
'/oracle/oracle/dbs/systRC722.dbf',
'/oracle/oracle/dbs/rbsRC722.dbf',
'/oracle/oracle/dbs/toolRC722.dbf',
'/oracle/oracle/dbs/usrRC722.dbf',
'/oracle/oracle/dbs/tempRC722.dbf',
'/oracle/oracle/rcdata.dbf'
;
2.절차
$ sqldba lmode=y
SQLDBA> connect internal
SQLDBA> shutdown abort
SQLDBA> startup nomount
statement processed
SQLDBA> @cnt
SQLDBA> recover database using backup controlfile until cancel;
....
...
CANCEL (Return)
Recovery canceled
SQLDBA> alter database open resetlogs;

: 만일 정상적으로 open 되면 log file 추가
SQLDBA> alter database add logfile '?/dbs/log1ORA722.dbf' size 1M;
: 정상적으로 open 안되면 RC에 다시 연락
-----
현상 : ORA-0439
원인 : BITMAP INDEXES 생성 시 option 이 인스톨되지 않아서 발생
조치 : 반드시 Oracle 8 Enterprise Edition 에서만 사용이 가능하다.
Oracle 8i 에서도 동일하게 적용된다.
-----
현상 : ORA-0600[3339] DATA BLOCK CORRUPTION DETECTION
[3339] [arg1] [arg2] [] [] [] []
ORA-1578 : Data block corrupted in file # block #
원인 : 1.ORACLE이 직접 버퍼로 데이타를 읽어들일 때 읽은 블럭의 DBA(Data Block Address)가 잘못
되었음(INVALID)을 의미
2.ORACLE의 문제가 아니라 OS나 HW의 문제인 경우가 많다.
-----
현상 : ORA-0604: error occurred at recursive SQL level %s
원인 : 1.내부적으로 SQL명령이 실행될 때 발생(현재 할당된 익스텐트가 가득 차서 다음 익스텐트를
할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여 SELECT
명령을 내리게 되는 것과 같은 경우)
2.init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES 의 값이 너무
작게 설정
3.테이블 스페이스가 가득 차거나 Extent 갯수의 최대 허용값을 초과해서 에러가 발생하는
경우 ORA-604 에러가 함께 발생
조치 : 1.?/dbs/init<SID>.ora 화일에 지정된 open_cursors 의 크기를 알아보는 것이다. 이 값이
설정이 안되어 있으면 Default가 50이므로
open_cursors=255
----------------
2.DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES들의 값을 크게 설정
3.에러의 원인을 찾기 위해서 init.ora 화일에 다음과 같은 라인을 추가한다.
events = "604 trace name errorstack"
이렇게 init.ora를 변경하고 DB를 Shutdown 하고 Startup 하면 ORA-0604 에러가 발생하는
경우에 자세한 정보를 Trace 화일에 기록해 주므로 이 화일을 검사하여 에러의 원인을
찾을 수 있다.
-----
현상 : ORA-0901 invalid CREATE command
원인 : CREATE 뒤에 오는 KeyWord를 식별하지 못한 경우
-----
현상 : ORA-0902 invalid dadatype
원인 : Oracle에서 제공되지 않은 datatype를 사용한 경우
-----
현상 : ORA-0903 invalid table name
원인 : 테이블의 이름이 Oracle object 명명에 대한 필요조건을 만족시키지 못한 경우
-----
현상 : ORA-0904 열명이 부적합합니다.
원인 : 컬럼이 테이블에 존재하지 컬럼을 사용한 경우
-----
현상 : 083147.gold!stmkdjc.22031: LIBTUX_CAT:522: INFO: Default tpsvrdone() function
used
ORA-0904 : invalid column name
ORA-1003 : no statement parsed
원인 : 1.해당 Table에 존재하지 않은 Field를 사용한 경우
2.Host Variable 앞에 ":"를 덧붙지지 않은 경우
3.해당 Table를 변경하고 관련된 프로그램을 컴파일하지 않은 경우
조치 : 1.해당 Table에 Column이 존재하는지 확인
2.Host Variable 앞에 ":"를 덧붙인다.
3.해당 Table에 관련된 프로그램를 컴파일한다.
-----
현상 : ORA-0906 missing left parenthesis
원인 : 왼쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0907 missing right parenthesis
원인 : 오른쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0910 specified legth too long for its datatype
원인 : 특정 datatype의 길이가 허용 최대 길이를 초과한 경우
-----
현상 : ORA-0911 invalid character
원인 : Oracle이 뮤효 문자라고 간주하는 것을 만날 때 발생한 에러로 실제문제는 없어진 문자때문
-----
현상 : ORA-0913 too many value
원인 : INSERT문에서 지정된 열의 수보다 열 값의 수가 적으면 발생
-----
현상 : ORA-0917 missing comma
원인 : 1.Comma를 기대하고 있는 SQL문에 comma가 없는 경우
2.오른쪽 괄호가 없는 경우에도 발생
-----
현상 : ORA-0918 column ambiguously defined
원인 : 1.둘 이상의 테이블이 한 SQL문에서 참조될 때 발생
2.한개 이상의 지정된 테이블에 존재하는 어떤 열이 해당 테이블로 한정받지 못한 경우
-----
현상 : ORA-0920 invalid relational operator
원인 : 관계 연산자를 식별하지 못한 경우
-----
현상 : ORA-0921 unexpected end of SQL command
원인 : 불완전한 SQL문일 경우에 발생
-----
현상 : ORA-0922 missing or invalid option
원인 : option에 임의의 문자가 삽입됨(예:NOT NULL --> NOT_NULL)
-----
현상 : ORA-0932 inconsistent datatype
원인 : 1.어떤 연산자를 어떤 열에 적용시키려고 하는데 그것의 datatype을 연산자와 함께 사용한 경우
2.ORA-0997 illegal use of LONG datatype을 복귀시킬 가능성
-----
현상 : ORA-00933: SQL command not properly ended
원인:
-----
현상 : ORA-0934 group function is not allowed here
원인 : SQL문의 WHERE구나 GROUP BY구에서 Group function를 사용한 경우
-----
현상 : ORA-0936 missing expression
원인 : 1.Comma 기술 뒤에 열이나 표현식이 존재하지 않은 경우에 발생
2.ORA-0917 missing comma을 복귀시킬 가능성
-----
현상 : ORA-0937 not a single-group group function
원인 : 어떤 SQL문의 선택 list는 어떤 열이 GROUP BY구에서 참조되지 않으면 그열과 Group function를
포함할 수 없다.
-----
현상 : ORA-0938 not enough arguments for function
원인 : SQL문이 불충분한 수의 인수로 함수를 호출한 경우에 발생
-----
현상 : ORA-0942 : table or view does not exist(테이블 또는 뷰가 존재하지 않습니다.)
원인 : Oracle은 테이블이나 뷰가 존재하지만 사용자가 테이블이나 뷰를 위한 오브젝트 특권(Grant)을 부여하지 않음
조치 : Table 생성 및 권한부여
-----
현상 : ORA-0947 not enough values
원인 : INSERT문에서 지정된 열의 수가 열 값의 수보다 클때 발생
-----
현상 : ORA-0979 not GROUP BY expression
원인 : 어떤 query의 선택 list 안의 한 열이 GROUP BY구에 들어있고 다른 열은 들어있지 않은 경우에 발생
-----
현상 : ORA-0997 illegal use of LONG datatype
원인 : 1.어떤 기능들은 datatype이 LONG인 열에서 수행되지 않는다.
2.Long column은 2G까지 지원을 하지만,
SQL*Plus에서 insert into 문장을 이용하여 long column에 넣을 문자열을
single quote(') 안에 기술 시, 2000 characters가 넘으면 ora-1704 에러가 난다.
조치 : 1.TABLE의 COPY는 가능하지 않으므로,LONG COLUMN을 가진 테이블을 COPY하고자 할 때,
32KBytes 이하의 size라면 다음의 PL/SQL을 사용하면 가능하다.
2.PL/SQL을 이용해야 하며, 경우에 따라 Pro*C, SQL*Loader 등을 이용하여 insert해야만 한다.
-----
현상 : ORA-1001 Invalid Cursor
원인 : Typing 에러, 잘못된 메모리 관리 등의 여러가지 원인에 의해서 발생.
조치 : 1.환경에서 조치할 사항
- PRECOMPILE 옵션 가운데 MAXOPENCURSORS 를 늘려준다.
- init<SID>.ora 화일에서 OPEN_CURSORS 파라미터 값을 늘려준다.
- 사용되지 않는 CURSOR는 OPEN 상태로 두지 말고 CLOSE 시켜준다.
- 지금은 거의 사용되지 않지만 ORACLE V6 를 사용한다면 PRECOMPILE 옵션 가운데
AREASIZE를 512K 정도로 크게 늘려주도록 한다. 그리고 init<SID>.ora 에서
CONTEXT_AREA 값도 늘려준다 .
- TRACE FILE을 이용하면 문제의 원인을 찾는데 있어 유용할 때가 있다.
2.그 밖의 경우
- OPEN 되지 않은 CURSOR 에 대해서 작업을 할 때
- 존재하지 않는 OBJECT에 대해서 SQL 명령을 실행할 때
- CURSOR CACHE로부터 삭제된 경우
- CURSOR CACHE로부터 삭제된 또다른 경우
PRECOMPILE 옵션 가운데에서 MAXOPENCUSORS 를 늘려주거나
HOLD_CURSOR=YES, RELEASE_CURSOR=NO 로 설정
- XA/TUXEDO 환경에서 ORA-1001 에러가 발생하는 경우(일부 ORACLE 버젼에서 발생)
-----
현상 : ORA-1002 FETCH OUT OF SEQUENCE IN PRO*C(stop[<fltmsjaud>]:리스너를 중단합니다.
원인 : 1.user가 더이상 유효하지 않은 cursor로부터 fetch를 하려고 하기 때문
2.ORA-1403 등과 같이 NO DATA FOUND를 return하는 fetch작업을 수행할때
3.SELECT FOR UPDATE를 가진 cursor 의 fetch작업내에 commit이 있는 경우
조치 : 3.commit을 fetch loop의 바깥쪽으로 빼거나 select for update문을 사용하지 않아야 한다.
-----
현상 : ORA-1012 Error( not logged on )가 발생
원인 : 1.tpbegin()이 되어 있지 않음
2.PC쪽에서 NOTRAN Mode로 Service를 호출
조치 : 1.Program을 확인한다.
2.flag를 0으로 Setting한다.(TRAN Mode로 Service 호출)
3.Service절에 Default에 AUTOTRAN을 "Y"로 설정하고 해당 Service명을 기술한다.
-----
현상 : ORA-1027 bind variables not allowed for data definition operations
원인 : WHERE에 BIND_VAR 를 이용한 CREATE VIEW 는 불가능
조치 : 이 경우 EXEC SQL CREATE TABLE IMAGE
(EMPNO NUMBER(4) NOT NULL, BITMAP LONG RAW)
END-EXEC.
이 처럼 create 해야 한다.
-----
현상 : ORA-1031 insufficient privileges
원인 : 사용자가 테이블이나 뷰와 연관된 적어도 한 개의 object 특권을 부여받았지만 SQL문에서 지정된
특권을 부여받지 않았을 때 발생
1.ORACLE의 SYSTEM 유저에 POWERBUILDER의 BASE TABLE 5개가 생성이 되어 있지
않은 경우
2.SYSTEM 유저로 접속한 후에도 일반 유저가 접속이 되지 않을 경우
조치 : 1.5개 base table(pbcatcol, pbcattbl, pbcatfmt, pbcatvld, pbcatedt)을
drop한 다음 system 유저로 접속을 하고, 다시 일반 유저로 접속하는 방법.
2.system 유저로 들어가서 5개 base table에 대한 사용 권한을
일반 유저에게 주는 방법.
$sqlplus system/manager

SQL>grant all on pbcatcol to public;
SQL>grant all on pbcatedt to public;
SQL>grant all on pbcatfmt to public;
SQL>grant all on pbcattbl to public;
SQL>grant all on pbcatvld to public;
-----
현상 : ORA-1034, "ORACLE not available"
ORA-7320, "smsget: shmat error when trying to attach sga."
ORA-7429, "smsgsg: shmget() failed to get segment."
원인 : ORACLE DBA 사용자만 데이타베이스를 ACESS할수 있고 다른 사용자는 SQL*PLUS 등을 통하여
CONNECT를 하려고 할때 다음 에러가 발생 할경우
-----
현상 : TPFAILED ......................
sqlca.sqlcode ==> -1036
ORACLE에서 단독으로 실행하면 문제가 발생되지 않고 OUTPUT을 정확하게 출력하지만
TP/M와 함께 실행이 되면 SQL SELECT문을 수행하지 못하고 sqlca.sqlcode ==> -1036의
MESSAGE를 뿌리고 실행을 멈춘다.
원인 : ORACLE에서 Version간의 Segment 정의부분이 다르기 때문
조치 : makefile 혹은 proc.mk file에서
sqlcheck=semantic userid=scrjpcs/scrjpcs를 포함시킨다.
-----
현상 : ORA-1039: insufficient privileges on underlying objects of the view.
원인 : SYS user가 아닌 다른 user로 SQL Analyze에 로그인하여 SQL statement에 대한 explain plan 옵션을 사용할 때 다음과 같은 에러가 발생
조치 : 1.dictionary table/view들을 validate시켜 놓으려면 dba가 read 권한만 SQL Analyze를 수행하는 user에게 grant하면 충분하다.
2.SYS user로서 SQL explaining을 수행하는 것이다.
-----
현상 : ORA-9992 scumnt: failed to open <FILENAME>
ORA-9993 scumnt: failed to lock <FILENAME>
ORA-1102 cannot mount database in exclusive mode
원인 : 서로 독립적인 두개의 instance가 동일한 database file들을 동기화 (synchronisation)없이 access할 수 있기 때문에 database corruption을 유발시킬 수 있었다.
조치 : database의 db_name이 변경되면 각각의 lk<DB_NAME> file을 생성.
-----
현상 : ORA-01118: cannot add any more database files: limit of XXX exceeded
원인 : 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생
조치 : MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤
화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다
-----
현상 : ORA-1157 : cannot identify data file 11 - file not found
ORA-1110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
원인 : OS 명령으로 DATA FILE 을 삭제한 경우
조치 : DATABASE STARTUP시 STARTUP MOUNT 단계까지 실행한 후, 문제의 데이타 화일을 OFFLINE 시킨다.
데이타베이스를 오픈한다. 단 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타
화일을 포함하고 있는 TABLESPACE를 DROP하지 않을 경우에는 DATABASE STARTUP시 항상 데이타
화일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의
DROP전에 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.

$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
-----
현상 : ORA-01237 cannot extend datafile %s
원인 : O/S 레벨에서는 file size를 1TB 이상 지원한다고 하는데, oracle datafile을 2G 이상으로 resize하려고 한다거나 tablespace에 datafile을 추가하거나 생성할 때, 2G 이상 주면 file size limit에 걸리는 현상 발생
조치 : 화일 시스템에서 large file을 사용하기 위해서는 화일 시스템을 'largefiles' option으로 mount해야 한다.
-----
현상 : ORA-1400 primary key or mandatory(NOT NULL) column is missing or NULL during insert
원인 : 어떤 필수적인 열을 위한 값을 공급하지 않은 경우
-----
현상 : ORA-1401 inserted value too large for column(열에 입력한 값이 너무 큽니다.)
원인 : 문자열을 할당하고자 할때 길이가 최대치를 초과한 경우
-----
현상 : ORA-1403 no dada found
원인 : 사실상 전혀 Error가 아니다.
-----
현상 : ORA-1405 fetched column value is NULL
원인 : ERROR 가 아니고 WARNING MESSAGE 이다.
조치 : dbms=v6 를 PRECOMPILER OPTION 에 추가해준다. dbms=v6 로 SETTING 할경우는 HOST 변수에
NULL 이 RETURN 되더라도 sqlca.sqlcode 는 0 이 된다.
-----
현상 : ORA-1407 cannot update mandatory(NOT NULL) column to NULL
원인 : 필수적인 열의 값을 NULL에 설정한 경우에 발생
-----
현상 : ORA-1408 such column list already indexed
원인 : 이미 동일한 열 List에 기초한 Index를 갖고 있는 Table에서 Index를 작성하고자 하는 경우에 발생
-----
현상 : ORA-1410 invalid ROWID
원인 : 1.적절한 Format으로 ROWID를 상술하지 않은 경우에 발생
2.지정된 ROWID가 존재하지 않은 경우에 발생
-----
현상 : ORA-01438: 지정한 정도를 초과한 값이 열에 지정되었습니다.
원인 : 지정한 자릿수를 초과한 Column이 존재한 경우에 발생
-----
현상 : ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYS.STANDARD", line 648
ORA-06512: at "BETH.BETH", line 6
ORA-06512: at line 1
원인 : SELECT 문에서 조건에 해당하는 row가 2건 이상
return되었을 때 발생하는 TOO_MANY_ROWS 에러와 동일한 에러이다.
조치 : 확인한 결과 DUAL table에서는 비록 2개의 ROWID를 볼 수는 없지만,
실제 2개의 row가 DUAL table에 존재하는 상황이다.
따라서, 다음 명령을 이용하여 여분의 필요없는 row를 delete해야 한다.
-----
현상 : ORA-1449 column contains NULL values; cannot alter to NOT NULL
원인 : 어떤 열을 필수적인 것으로 변경하고자 하나 적어도 테이블 내의 한 행이 그 열을 위한 NULL값을
가질 때 발생
-----
현상 : ORA-1452 cannot CREATE UNIQUE INDEX; duplicate keys found
원인 : 값이 독특하지 않은 일련의 열에서 독특한 인덱스를 작성한 경우에 발생
-----
현상 : ORA-1453 SET TRANSACTION must be first statement of transaction
원인 : 모종의 다른 SQL문 이후에 SET TRANSACTION문을 기동할 때 발생
-----
현상 : ORA-01458 Invalid length inside variable character string
원인 : DB Table field의 길이와 Host Variable의 길이 차이가 있을때 발생한다.
그러므로 Table field의 길이와 Host Variable의 길이를 비교해 본다. 혹은 Stored
Procedure의 Input Parameter가 Null 값으로 넘겨질 때도 발생한다.
조치 : DB Table field와 Host Variable의 길이를 조정한다.
Stored Procedure의 Input Parameter에 Null값을 0의 값을 채워서 넘긴다.
주의 : Stored Procedure에서 Cursor를 사용할 때
FOR ... LOOP를 사용할 때 주의를 해야한다.
FOR i IN 1..batch_size LOOP
FETCH get_emp
INTO
emp_name( i )
,job( i )
,sql( i )
;

IF get_emp%NOTFOUND THEN -- if no row was found
CLOSE get_emp;
done_fetch := 100; -- indicate all none
EXIT;
ELSE
done_fetch := 900; -- indicate all none
found := found + 1; -- count row
END IF;
END LOOP;
에서 Fetch Array의 0번째에 Data를 저장할 때 문제가 생긴다.
그러므로, emp_name( 0 )이라고 하면 Error를 발생한다.
-----
현상 : ORA-01476: divisor is equal to zero
원인 : Zero값으로 임의의 수를 나누었을때 발생
-----
현상 : ORA-01480: trailing null missing from STR bind value
원인 : 1.해당 Column의 Size 보다 더 큰 값이 들어온 경우에 발생
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size 만큼의 변수길이를 선언한 경우 발생
조치 : 1.해당 Column의 Size와 해당값을 확인
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size에 1를 더해 주어야 한다.
(데이터의 마지막에 NULL 문자를 포함해야 하기 때문에)
-----
현상 : ORA-1481 invalid number format model
원인 : 어떤 숫자 Format Model이 미정의 문자를 포함한 경우에 발생
-----
현상 : ORA-1547 : Failed to allocate extent of size 'num' in tablespace 'TOOLS
원인 : TABLESPACE가 에러에 명시된 ORACLE block 수 만큼의 요청된 EXTENT를 할당할 충분한 FREE
SPACE를 갖고있지 못할 경우에 발생
조치 : 1.해당 TABLESPACE내에서 연속된 영역의 ORACLE block 할당할 수 있도록 데이타 화일을 추가
2.TABLE의 STORAGE PARAMETER에서 INITIAL EXTENT, NEXT EXTENT의 크기를 조정하여 TABLE을
재구축
3.다음의 방법으로는 관련 TABLESPACE를 재구성하는 것
-----
현상 : ORA-1552 (CANNOT USE SYSTEM ROLLBACK SEGMENT FOR NON-SYSTEM TABLESPACE '%S')
원인 : SYSTEM TABLESPACE 이외의 TABLESPACE를 포함한 OPERATION을 위하여 SYSTEM TABLESPACE의
ROLLBACK SEGMENT를 사용할 경우에 발생
조치 : SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 추가한 다음, 데이타베이스 오브젝트를
생성
-----
현상 : ORA-1555 Snapshot Too Old
원인 : 1.데이타의 변경이 심한 데이타베이스에서 롤백 세그먼트의 갯수와 크기가 작을 경우에 발생
2.롤백 세그먼트가 손상되어 읽을 수 없게 된 경우
3.Fetch Across Commit(테이블에 대하여 Query가 커서를 열고 루프 내에서 데이타를 Fetch
하고 변경하고 커밋하는 과정에서 발생)
4.Delayed Block Clean Out(데이타 블럭이 변경되고 커밋되면 오라클은 롤백세그먼트 헤더에
그 트랜잭션이 커밋되었다고 기록하지만 데이타 블럭을 바로 변경하지는 않는다 (Fast
Commit). 그리고 다음 트랜잭션이 변경된 블럭을 요구할 때야 비로소 변경 시키는것
조치 : 1.커서가 Open된 상태에서는 커밋을 자주하지 않고 롤백 세그먼트 크기를 키워 나가도록
2.커서를 사용하기 전에 Full Table Scan을 해주면 예방이 가능
-----
현상 : ORA-1562(Failed to extend rollback segment(id = %s))
원인 : 1.사용중인 ACTIVE 상태의 ROLLBACK SEGMENT가 다음 EXTENT를 할당하고자 할 경우
2.해당 ROLLBACK SEGMENT에 대하여 발생 가능한 최대 EXTENT 수를 초과할때 발생
조치 : ROLLBACK SEGMENT의 재생성
-----
현상 : ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
원인 :
조치 : 해당 objects를 drop하고 recreate하여 처리
-----
현상 : ORA-01578
원인 : data block 에 corruption 이 생긴 경우에 발생.
조치 : 1.최선의 해결책은 backup 받아둔 file 을 restore 한 후 recover 작업을 하는 것이다.
2.backup datafile 을 restore 하고 recover 하지 않을 것이라면 우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야 한다.
3.해당 segment 가 non-data dictionary index 라면, 해당 index 를 drop 한 후 재생성한다.
4.해당 segment 가 table 이라면, corruption 이 발생한 block 의 data 는 소실된 것이다.
5.만약 해당 table 에 대한 최근의 export dump file 이 존재한다면, 해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
6.corruption 이 발생한 non-clustered table 에서 corrupted block 을
access 하지 않고 나머지 data 들을 select 할 수 있도록 ROWID 를 이용할
수 있다.
7.만약 data dictionary 에 속하는 table, index 또는 rollback segment에
corrupted block 이 발생하였다면 Oracle Support 의 지원을 받는다.
8.일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다. 하지만 만약에
ORA-600[3374] 가 발생한다면 memory 상에서 corruption 이 발생한
경우이다. 이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
-----
현상 : ORA-1591(Pending Transaction의 처리)
원인 : 분산 트랜잭션의 경우 2 phase commit수행 단계중에 fail이 발생하게 되면 관여된 일부 database에서는 rollback 혹은 commit이 되고, 일부는 distributed lock이 걸린 상태로 계속 지속될 수 있다.
이렇게 pending된 transaction에 대해서는 기본적으로 Oracle의 background process인 RECO process가 자동으로 정리하여 주나, 경우에 따라 자동으로 정리가 되지 못하는 상황이 발생
조치 : STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
STEP 4: DBA_2PC_PENDING을 조회해 본다.
STEP 5: DBA_2PC_NEIGHBORS view를 조회해 본다.
STEP 6: commit point site를 확인한다.
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.
STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.

2PC에서 1st phase commit(xa_prepare)이 정상적으로 종료되면 Oracle의 dba_pending_transaction에 해당
Transaction에 대한 정보가 나타난다.

formatid 40
globalid 636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
branchid 0000006600000065

이 상태에서 일정한 시간 내에 2nd phase commit(xa_commit)에 끝나지 않으면 dba_2pc_pending에도 이
Transaction이 나타난다.

local_tran_id 4.24.3026
global_tran_id 40.636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
state prepared
mixed no
advice
tran_comment
fail_time
force_time
retry_time
os_user jun
os_termina
host chaeju
db_user
commit# 5332231

위에서 "일정한 시간"이란 용어를 사용했는데 Oracle의 문서에는 이에 관한 정확한 언급은 없다.
다만, 다른 Transaction에서 해당 레코드를 참조하려고 할 때 이미 lock이 걸려 있으므로 대기하는
시간에 대해서는 init.ora에서 지정하는 distributed_lock_timeout에 대해서만 언급하고 있다. 그런데
oracle 8.1.7에서는 distributed_lock_timeout을 설정하면 obsolete로 나온다.

이 시간 동안에 해당 레코드에 대한 lock이 풀리지 않으면 아래와 같은 에러를 만난다.

ORA-02049: time-out: distributed transaction waiting for lock

위의 에러가 발생한 이후에 이 레코드를 참조하려고 하면 1591 에러가 나타난다.

ORA-01591: lock held by in-doubt distributed transaction '4.24.3026'

보는 것처럼 ORA-01591 에러 메시지에는 local_tran_id가 있다. 이를 이용하여 dba_2pc_pending에서
global_tran_id를 조회하고, 이 데이터는 dba_pending_transaction의 formatid와 globalid로 이루어져
있으므로 이를 이용하여 dba_pending_transaction에서 branchid도 얻을 수 있다.

이들로 부타 아래와 같이 XID를 얻을 수 있다.

xid.formatid = dba_pending_transactions.formatid
xid.gtrid_length = len(dba_pending_transactions.globalid)
xid.bqual_length = len(dba_pending_transactions.branchid)
xid.data = dba_pending_transactions.globalid + dba_pending_transactions.branchid

여기까지는 Oracle로 부터 XID를 얻는 과정이다.

tpconvert(str, (char *)&xid, TPTOSTRING | TPCONVXID)를 이용하여 XID의 string 표현을 얻을 수 있고
이값을 이용하여 .TMIB 서비스를 호출하면 아래와 같은 정보를 얻을 수 있다.

TA_ERROR 0
TA_MORE 0
TA_OCCURS 1
TA_GRPCOUNT 2
TA_GRPINDEX 0
TA_GRPNO 102
TA_GRPNO 101
TA_TIMEOUT 9
TA_COORDGRPNO 102
TA_CLASS T_TRANSACTION
TA_STATE READY
TA_COORDLMID SITE1
TA_GSTATE READY
TA_GSTATE READY
TA_TPTRANID 0x0 0x3a6bec99 0xde8 0x28 0x0 0x0
TA_XID 0x0 0x3a6bec99 0xde8 0x28 0x66
TA_COORDSRVGRP APPGRP2
TA_LMID SITE1
TA_SRVGRP APPGRP2
TA_SRVGRP APPGRP1

위의 경우에는 아직 Tuxedo가 transaction에 대한 정보를 가지고 있기 때문에 별다른 조치가 필요없다.
하지만, Oracle의 dba_2pc_pending에는 있는데 Tuxedo에서 해당 Transaction에 대한 정보를 가지고
있지 않은 경우에는 Oracle에서 rollback force나 commit force를 이용하여 pending transaction을
정리해 주어야만 lock이 풀린다.
-----
현상 : ORA-1628, 00000, "max # extents (%s) reached for rollback segment %s"
ORA-1630, 00000, "max # extents (%s) reached in temp segment in tablespace %s"
ORA-1631, 00000, "max # extents (%s) reached in table %s.%s"
ORA-1632, 00000, "max # extents (%s) reached in index %s.%s"
원인 : 오브젝트의 익스텐트가 MAX # 에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는
STORAGE 의 MAXEXTENTS 파라미터에 의해 결정
조치 : ALTER TABLE .. STORAGE (MAXEXTENTS n)를 사용하여 최대 MAXEXTENTS 값보다 작은 수로
MAXEXTENTS를 늘려준다.
-----
현상 : ORA-1652, 00000, "unable to extend temp segment by 6144 in tablespace "VESSEL"
원인 : 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE 가 아닌 곳에서 ORA-1652(temp
tablespace가 부족함) 에러가 발생
조치 : 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment 가 생성될 만한
연속된 공간을 마련하여 주는 것
-----
현상 : ORA-1653
원인 : 특정 tablespace 에 space 가 부족해서 table의 extent가 일어나지 못해서 발생
조치 : user의 default tablespace 를 변환한 후, 이 default tablespace
안에 create table을 다시 한 후 sql*loader 를 실행한다
-----
현상 : ORA-1654 ERROR ON INDEX SEGMENT
원인 : tablespace가 적어 extent 영역을 할당할 수 없어서 발생
조치 : datafile을 추가 시 이전값 이상의 사이즈를 추가해야 함.
-----
현상 : ORA-1722 invalid number
원인 : 수치값이 불법일 경우
-----
현상 : ORA-1747 열명을 올바르게 지정해 주십시요.
원인 : 열명이 다른 경우(SQL문장 기술시 첫번째 열명 앞에 Comma를 삽입한 경우)
-----
현상 : tb_ra315 insert error ORA-02291: integrity constraint (SCRJAPPR.A315_E007_FK)
violated - parent ....
원인 : Table과 관련된 Reference 관계로 parent table의 data가 없는 관계로 data 입력불가
조치 : Reference 관계를 끈어주든지 아니면 관계된 Table에 Data를 모두 입력하는 방법.
-----
현상 : ORA-02303: cannot drop or replace a type with type or table dependents
원인 : Type이나 table의 dependency가 있는 type을 drop하거나 replace하고자 할 때 발생.
조치 : SQL Reference guide에 의하면 DROP TYPE FORCE 옵션은 recommend하지 않는다.
왜냐하면 이 옵션을 쓰게 되면 복구가 불가능하고 dependency가 있던 table들은
access하지 못하는 결과를 초래한다.
-----
현상 : ORA-03113: end-of-file on communication channel
원인 : 1.이전에 작동했던 해당 instance의 shared memory segment들이 아직 system에 남아있어서 발생.
2.서버의 Oracle 쉐도 프로세스가 예기치 않게 종료된 경우 발생.
3.SQL*NET 드라이버가 Unix의 ORACLE 실행 파일과 연결되지 않아 발생한 경우.
4.서버쪽의 기계 손상이나 네트워크 고장인 경우.
5.네트워크에서 두 서버가 같은 노드 이름을 가질 때에도 이 오류가 발생.
6.모든 원인은 결국 클라이언트가 서버로부터 어떤 정보를 읽으러 갔다가 거기서 더 이상 연결이 없음을 발견했다는 뜻임.
7.Oracle XA를 사용하는 AP 서버 혹은 TMS 서버가 떠 있는 상황에서 연결된 DB를 재기동 시키거나 혹은 다른 문제로 인해서 데이터베이스와의 연결이 끊어진 경우에 발생
조치 : shared memory를 check하여 oracle이 소유하고 있는 shared memory segment를 삭제하여 문제를 해결.
자동으로 재접속을 하기 위해서는 TUXWA4ORACLE(WorkAround For Oracle) 환경변수를 1로 설정하면 해당 서버가 오라클에 접근하여 3113 에러가 발생하는 순간에 재접속이 이루어진다.
(XA 서버에만 해당되며 Non-XA 서버의 경우는 사용자 coding에 의해서 동일한 기능을 구현할 수 있다.)
-----
현상 : ORA-3114 Error( not connected to ORACLE )가 발생
원인 : ORACLE이 Shutdown 되었다.
조치 : ORACLE이 떠 있는지 확인하고, Server를 새로 기동한다.
-----
현상 : ORA-3121
원인 : SQL*NET V2를 통해 연결하려 할 때 연결 스트링에 'tns:'net접두어를 사용하지 않은 경우
조치 : 구버전인 SQL*NET V1의 net 접두어 (SQL*Net TCP/IP에 대한 "t:"등)를 사용하지 않도록 주의
하십시요.
-----
현상 : ORA-4068 existing state of packages%s%s%s has been discarded
원인 : 응용프로그램 실행 중에 사용하고 있는 Stored Procedure를 Compile하는 경우에 발생
조치 : 응용프로그램을 재기동시킨다.
-----
현상 : ORA-4091 table name is mutating, trigger/function may not see it
원인 : DataBase Trigger가 Transaction 내에서 변경된 테이블에 대하여 Query를 기동할 때 발생
조치 : 1.PL/SQL table을 생성한다.
2.BEFORE STATEMENT trigger를 생성한다.
3.AFTER ROW trigger를 생성한다.
4.AFTER STATEMENT trigger를 생성한다.
5.data insert 및 확인
-----
현상 : ORA-4092 cannot COMMIT or ROLLBACK in a trigger
원인 : 1.Trigger가 COMMIT or ROLLBACK을 실행하고자 할 때 발생
2.Trigger가 내장 프로시저, COMMIT나 ROLLBACK될 함수, 패캐지 서브프로그램을 호출한 경우
-----
현상 : ORA-6106,ORA-6120 NETTCP : socket creation failure
원인 : WIN V1.X용 SQL*NET TCP/IP는 SQLTCP.DLL과 SQLTCP1.DLL들은 ORACLE용 연결 스트링이 TCP/IP
프로토콜 스트링으로 변환되면 OCI DLL에 의해 작업 진행중에 올려집니다. ORACLE INTERFACE
DLL은 SQLTCP.DLL을 먼저 올리려고 합니다. 이것이 실패하면 DOS TSR 버전의 드라이버를
찾습니다. 두 가지 모두 실패하면 ORA-3121 메세지가 나옵니다.
-----
현상 : ORA-6108
원인 : 1.부적절한 machine, 또는 machine는 맞지만 틀린 포트를 지정할 때 발생
2.TCP/IP 레이어는 모든 연결 요구를 Listener의 소켓 큐에 넣을 수 없을 경우 발생
3.네트워크가 아주 혼잡하고 호스트에 도달하려는 중에 시간이 종료할 경우
조치 : 1.클라이언트에서 호스트 Machine에 대해 ping을 실행하십시요. 대부분의 PC TCP/IP업체는
"ping" 유틸리티를 제공합니다. 클라이언트 Machine에서 다음을 입력하십시요
ping <host IP address>
이 방법으로 잘 되지 않으면 아마도 호스트 machine이 down된 것입니다. IP 주소를 사용
하여 호스트에 대해 ping을 성공적으로 실행할 수 없으면, 서버의 호스트 이름을 사용하여
ping을 실행해 보십시요.
ping <hostname>
호스트 이름을 사용하여 ping을 실할 수 없으면 TCP/IP 구성을 점검하십시요. 호스트 이름
을 가지고 ping을 실행할 수 없으면, 연결 스트링에 호스트 이름을 사용하여 SQL*NET와
연결할 수 없습니다.
2.SQL*NET TCP/IP Listener가 해당 서버에서 실행중인지 점검하십시요. 서버의 UNIX프롬프트
에서 다음을 입력하면 됩니다.
ps -al|grep "orasrv"
이 때 최소한 한 행이 표시되어야 합니다. 그렇지 않으면 UNIX 프롬프트에서 "orasrv"
또는 "tcpctl start"를 입력하여 수화자를 띄우십시요. SYSADMIN 특권을 가지고 해당 기계
에 로그인해야 합니다.
3.서버쪽에서 루프백을 할 수 있는 지, 다시 말해서 PC 클라이언트에서 지정한 것과 같은
연결 스트링을 사용하여 서버의 툴을 연결할 수 있는지 점검하십시요. 예를 들면, 서버의
SQLPLUS 또는 SQLDBA를 호출하고 서버의 SQLPLUS 또는 SQLDBA 프롬프트에서 다음을 입력
하십시요.
CONNECT USERNAME/PASSWORD@t:<servername>/<portnum>:<sid>
4.루프백 성사되면 호스트 서버의 ORASRV 포트 번호를 확인하십시요. (대부분의 기계에서
SERVICE 파일은 /etc 디렉토리에 있습니다.) 또한 "tcpctl" 유틸리티를 사용하면 대부분의
UNIX 기계에서 ORACLE Listener를 시작하거나 멈출 수 있습니다. "tcpctl stop"로 Listener
를 종료하십시요. "tcpctl start"으로 다시 시작하십시요. 이때 시작 포트에 관한 정보가
표시됩니다.
5.이것이 성공하면 포트를 지정하지 말고 포트를 연결해 보십시요.
t:<servername>:<sid>
연결되지 않으면 클라이언트에서 SERVICE 파일을 정확하게 설정하 않았기 때문입니다.
a)WINDOWS\WIN.INI를 점검하여 [Oracle] 부분의 ORA_CONFIG 매개 변수가 어떤 구성 파일을
지시하고 는지 알아보십시요. 이폴트는 다음과 같습니다.
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
b)ORACLE.INI 파일을 보고 TCP_SERVICES_FILE 매개변수가 설정되었고 SERVICES 파일을 지시
하고 있는 지 확인하십시요.
c)SERVICES 파일을 보고 다음 항목이 있는 지 확인하십시요.
orasrv 1525/tcp oracle
6.또한 서버가 SQL*NET V2가 아니라 SQL*NET V1을 실행중인지 확인하십시요.
7.결 스트링의 재시도 매개변수를 증가시켜 보십시요. 재시도 횟수를 지정하는 구문은 다음과
같습니다.
t:host[/service]:SID[,buffer-size][:conn-retries]
conn-retries의 디폴트는 1입니다.
8.VAX에 연결할 경우에는 VAX config.ora 파일에 다음행이 있는지 확인하십시요.
SQLNET USERNAMEMAP*=*
이것은 VAX account가 없는 PC가 디폴트 사용자 account을 사용하여 연결 할 수 있게 해
줍니다.
-----
현상 : ORA-6110 "NETTCP: message send failure"
원인 : Windows 클라이언트의 TCP/IP사이에 버퍼 조정문제가 있을 때 발생
조치 : 1.버퍼 크기를 연결 스트링에 포함시켜 일정한 크기로 고정하는 것
t:<servername>:<sid>,<buffersize>
연결 스트링에 버퍼 크기를 포함시킨 후에도 여전히 ORA-6110이 발생하면 더 작은 값을
사용해 보십시요. WINDOWS용 SQL*NET TCP/IP의 기본 버퍼 크기는 4096입니다. 이것을
1024로 사용하면 대개 ORA-6110에러가 없어집니다.
2.서버쪽
1)서버에서 루프백을 수행할 수 있습니까? 다시 말해서 PC 클라이언트에서 지정한 것과
같은 연결 스트링을 사용하여 서버의 툴을 연결할 수 있습니까? 예를 들어 서버에서
SQLPLUS 또는 SQLDBA를 호출하고 에러가 없어집니다.
CONNECT USERNAME/PASSWORD@t:<servername><portnum>:<sid>
루프백을 실행하면 실제 문제를 더 잘 보여주는 다른 에러가 나타나는 수도 있습니다.
2)ORA-6110은 Oracle실행 파일에 사용 권한이 정확하게 설정 되어 있지 않으면 Unix 서버에
연결할 때도 발생할 수 있습니다. Oracle과 orasrv의 사용권한은 다음과 같이 설정되어야
합니다.
>chmod 6755 oracle
>chmod 6755 orasrv
이 때, Permission는 다음과 같이 설정됩니다.
-rwsr-xr-x 1 oracle dba ...size ...date oracle
-rwsr-xr-x 1 root dba ...size ...date oracle

3)ORA-6110과 틀린 네트워크 주소
TCP/IP 네트워크에서 중복 IP주소가 살아 있으면 ORA6110이 발생할 수 있습니다. 네트
워크의 모든 IP주소가 고유의 것인지 확인하십시요.
-----
현상 : ORA-6122 "NETTCP: setup failure
원인 : SQL*NET 구성이 적절하게 설정되지 않은 상태에서 WINDOWS용 SQL*NET TCP/IP를 가지고 연결
하려 할 때 발생
조치 : 1.WINDOWS\WIN.INI를 조사해 보십시요. ORA_CONFIG 매개 변수를 정의하는 ORACLE 부분이
있어야 합니다
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
2.ORACLE.INI(또는 ORA_CONFIG 매개변수가 지시하는 파일)을 보십시요. ORACLE_HOME이
WINDOWS용 SQL*NET TCP/IP와 다른 Oracle Windows 응용 프로그램이 설 된 디렉토리를
지시하는 지 확인하십시요. 디폴트는 다음과 같습니다.
ORACLE_HOME=\ORAWIN
3.또한 ORACLE.INI에 TCP_VENDOR를 정확하게 설정했는지도 확인하십시요.
4.경로에 C:\ORAWIN\BIN(또한 ORACLE_HOME을 설정한 BIN 디렉토리)이 있는지 확인하십시요.
DOS프롬프트에서 SET을 입력하고 <return>을 누르면 됩니다. 이명령은 경로를 보여줍니다.
5.ORAWIN\BIN 디렉토리에 SQLTCP.DLL과 SQLTCP1.DLL이 모두 있는지 확인하십시요.
6.경로의 다른 어떤 디렉토리에도 SQLTCP.DLL이 없는 것을 확인하십시요.
7.ORAWIN\BIN 디렉토리와 경로의 다른 디렉토리에 MSOCKLIB.DLL이 있는 지 확인하십시요.
또한 파일의 두 복사본을 가지고 있지 않도록 하십시요. 복사본이 둘일 경우, 이전 복사본
의 이름을 바 면 문제가 줄어들 수 있습니다.
8.WINDOWS 디렉토리에 VSL.INI 파일이 있는지 확인하십시요. 만약 없으면 ORACLE INSTALLER
를 통해 SQL*NET를 다시 입력하십시요.
-----
현상 : ORA-6136, 00000, "NETTCP: error during connection handshake"
원인 : 1.Client and Server 환경에서 간혹 SQL*NET으로 Server에 접속하려고 할 경우
2.Unix Server에서 $tcpctl stop 으로 orasrv의 Process를 정지시키려고 해도 아무런 반응
없이 Holding되는 경우가 발생
조치 : 1.TCPCTL Utility를 이용하여 다음의 Option을 부여하여 Start하는 방법.
$tcpctl start listen=30 timeout=30 forkon listen=<queue size>이며, 청취자 열의
크기를 지정.
timeout=<seconds>이며, 지정된 시간에 orasrv와의 응답 확인 시간을 나타냄.
forkon SQL*net이 orasrv process에 접근하는 방법을 나타냄.
System에 따라서 forkon option이 적용 않되는 경우도 있음.
2.Client에서 접속을 하여 사용 다가 비정상 종료(Session이 맺어진 상태에서 Client의
Power Off)를 하여 Server에 Processor가 남아 있고, orasrv를 통해 접속할 수 있는
Session의 수가 점점 줄어들 경우가 있는 데 이러한 경우에는 orasrv를(tcpctl stop or
UNIX kill command를 이용)강제로 종료 시고 다음과 같이 Start 시켜 주십시오.

#nohup tcpctl start ( Client의 비정상 종료가 Orasrv에는 영향을 미치지 않음)
또는
#orasrv (ORACLE_HOME\bin directory에서 직접 orasrv processor를 띄운다)
-----
현상 : ORA-06502 : PL/SQL : 값(수치) 오류입니다.
원인 : DB Column과 Host variableㅇ의 길이가 맞지 않은 경우.
조치 : DB Column과 Host variableㅇ의 길이를 확인하고 길이를 동일하게 한다.
-----
현상 : ORA-06533: Subscript beyond count
원인 : VARRAY는 default 로 3개의 element 이상을 가져 올수 없기 때문.
조치 : EXTEND method를 이용하여 해결할 수 있다.
-----
현상 : ORA-06571
원인 : SQL문 안에서 Stored function을 call하여 사용하는 경우 발생.
조치 : 기본적으로 stored function이나 procedure, package에서의
DML 문장의 사용은 보장이 되는 기능이나, sql list에서의 stored function의
사용은 몇 가지 제약 조건을 가지고 수행이 가능합니다.
-----
현상 : ORA-1119: error in creating database file
ORA-7515: sfccf UIC GROUP <= MAXSYSGROUP - file operations not allowed
원인 : VMS에서만 발생하는 에러로 DATAFILE을 생성하려는 Directory의 Owner가 DBA user가 아닐때 발생.
조치 : Datafile을 생성하려는 Directory의 Owner를 Oracle DBA user로 변경시켜 주어야 한다.
-----
현상 : ORA-9241, ORA-9301
원인 : 개발툴이 해당 툴 또는 SQL*NET에 필요한 메세지 화일을 찾을 수 없을 때 발생
조치 : ORACLE.INI 파일에 LOCAL = <V2 service name>을 추가한다. 만일 ORACLE.INI 파일에 LOCAL
파라미터를 추가한 후에도 계속 ora-9301 에러가 계속 발생한다면 autoexec.bat 파일에 SET
CONFIG = <PATH> \ORACLE.INI를 추가한다.
[주의 1]CONFIG가 ORACLE.INI를 지시하도록 설정하면 나중에 다시 설치할 문제가 발생할 수
있다. 그럴 때는 AUTOEXEC.BAT 에서 SET CONFIG 행을 삭제하고 다시 Booting 한후
설치를 시작한다.
[주의 2]MS ACCESS를 이용하여 ORACLE의 데이타를 질의할 경우는 환경변수를 다음과 같이
설정한다.
SET CONFIG_FILES = <path> \ORACLE.INI
[주의 3]SET 다음의 CONFIG 나 CONFIG_FILES 은 반드시 대문자 이어야 한다.
-----
현상 : ORA-9352
원인 : nt 에서 service 의 problem 발생.
조치 : 1.background services and processes 를 띄우기
dos>oradim80 -startup -sid SID -starttype srvc,inst -usrpwd password -pfile filename
2.여러 개의 instance 를 띄우고자 하는 경우
- ORACLE_SID 를 setting 한다.
c:\> set oracle_sid =sid
- server manager 실행
c:\>svrmgr30
svrmgr>connect internal/passwd
-----
현상 : ORA-12004/ORA-12034
원인 : master table의 snapshot log가 있는 table에 대해서, snapshot이 추가로
생성되고 나면 snapshot을 생성하기 시작한 시간과, 기존의 snapshot이 log를
refresh해간 시간을 비교하여 새로운 snapshot 생성시작 시간이 더 빠르면
ora-12004가 발생
조치 : 생성하고자 하는 snapshot에 대한 master table의 다른 snapshot들을 refresh하지 못하도록 하거나, refresh하지 않는 시간에 새로운 snapshot을 생성하여야 한다.
refresh 못하도록 막는 방법으로는 일시적으로 snapshot job을 broken시킨 후 snapshot이 생성된 후 다시 broken을 false로 하면 된다.
-----
현상 : ORA-12154
원인 : tnsnames.ora 파일의 Alias처럼 정의된 Connect String으로 사용하는 db_alias를 찾지 못할 경우 발생
-----
현상 : TNS-12203 "TNS:unable to connect to destination"
원인 : 1.WINDOWS용 TCP/IP 어댑터를 설치하지 않은 상태에서 연결하려 할
2.TNS-12203 에러는 WINDOWS용 ORACLE SQL*NET소프트웨어가 ORACLE 홈 디 렉토리를 찾을 수
없다는 의미일 수 있습니다.
3.TNSNAMES.ORA가 ORACLE 홈 디렉토리 아래의 NETWORK\ADMIN에 있는지 확인하십시요.
4.서버쪽에서 실행중인 SQL*NET V2 TCP/IP Listener가 없어도 TNS-12203이 발생
5.연결할 SERVICES 이름에 대해 CONNECT DESCRIPTOR에 정확한 ADDRESS 매개변수를 지정했는지
확인하십시요.
6.JSB VSL 소켓이 초기화되지 않으면 TNS-12203 이 발생할 수 있습니다.
7.TNS-12203에 이어 실제 문제가 무엇인지 더 자세하게 나타내 주는 또 다른 에러가 발생할 수
있습니다.
조치 : 1.SQL*NET TCP/IP V2는 SQL*NET V2와 V2 TCP/IP 어댑터 등 두가지 제품으로 구성됩니다.
이들은 별도의 두 키트로 되어 있는데, 반드시 두 키트를 모두 설치해야 합니다.
2.WIN.INI파일의 ORACLE 부분에 다음 항목이 있는지 확인하십시요.
[ORACLE]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
WINDOWS디렉토리가 C:\WINDOWS가 아니면, 위 행의 C:\WINDOWS 부분을 그 이름으로 바꾸십시요
그런 다음, ORACLE 소프트웨어를 다시 설치하십시요. ORACLE.INI 파일이 있으면 ORACLE.INI
파일에 다음 행이 있는지 확인하십시요.
ORACLE_HOME=C:\ORAWIN
ORACLE 홈 디렉토리가 C:\ORAWIN이 아니면 위 행의 C:\ORAWIN 부분을 이름으로 바꾸십시요.
3.ORACLE 홈 디렉토리는 ORACLE.INI(또는 WIN.INI의 ORA_CONFIG매개변수가 지시하는 파일)의
ORACLE_HOME 에 의해 정의됩니다.
4.서버쪽에서 실행중인 SQL*NET V2가 있는지 확인하십시요. 서버쪽에서 Listener Control 유틸
리티(LSNRCTL)를 사용하면 서버의 V2 Listener가 실행중인지 확인할 수 있습니다. 서버에서
"LSNRCTL STATUS"명령을 실행하십시요. Listener Control이 유틸리티 대해서는 SQL*NET
Administrator's Guide를 참조하십시요.
5.정확한 ADDRESS 매개변수를 사용중인지 확인하는 방법은, WINDOWS 클라이언트에서 사용 할 것
과 같은 ADDRESS 매개 변수를 가진 TNSNAMES.ORA를 사용하여 서버에서 루프백을 해 보는 것
입니다. 루프백을 수행한다는 것은 데이타베이스와 같은 기계에서 SQL*DBA 등을 호출하고
연결 스트링을 지정함으로써 SQL*NET V2를 통해 연결한다는 뜻입니다.
6.문제를 해결하려면 다음 사항을 점검하여 JSB VSL 레이어가 정확하게 초기화되었는지 확인
하십시요.
1)ORACLE.INI 파일(또는 WIN.INI의 ORA_CONFIG 매개변수가 지시하는 파일)의 업체키 매개
변수 TCP_VENDOR가 정확하게 설정되었는 지 확인하십시요
2)ORACLE_HOME\BIN 디렉토리에 MSOCKLIB.DLL이 있는지 확인하십시요.
3)ORACLE_HOME\BIN 디렉토리에 선택된 JSB 업체 특유의 DLL이 있는지, 또는그 JSB 업체 특유
의 TSR 파일이 실행되는 지 확인하십시요.
4)WINDOWS 홈 디렉토리에 VSL.INI 파일이 있는 지 확인하십시요.
7.화면에서 다른 에러가 보이지 않으면 ORACLE_HOME\NETWORK\LOG 디렉토리의 SQLNET.LOG 파일을
점검하십시요.
-----
현상 : TNS-12533

출처 : Tong - atc17cjh님의 oracle통

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:26
반응형

ERROR_CODE,DESCRIPTION
ORA-00000   

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:24
반응형

쿼리를 통해 오라클 데이터베이스의 정보를 조회할때 사용하세요.

구분 테이블명 설명
오브젝트 USER_OBJECTS (OBJ) 모든 오브젝트에 대한 정보를 지원 오즈젝트 유형, 작성시간, 오브젝트에 사용된 최종 DDL 명령, alter, grant 및 revoke 등
테이블 USER_TABLES (TABS) 테이블에 대한 정보
USER_TAB_COLUMNS (COLS) 컬럼에 대한 정보
USER_VIEWS 뷰에 대한 정보
동의어 USER_SYNONYMS (SYN)
시퀀스 USER_SEQUENCES (SEQ)
제약조건 USER_CONSTARINTS  
제약조건열 USER_CONS_COLUMNS 제약 조건을 가진 열에 대한 정보
제약조건의 예외사항 EXCEPTIONS 제약조건을 활성화시 에러사항에 대한 정보
테이블 주석 USER_TAB_COMMENTS 테이블/뷰에 대한 주석
열 주석 USER_COL_COMMENTS 열에 대한 주석
인덱스 USER_INDEXES (IND) ( 인덱스에 관한 정보)
인덱스 열 USER_IND_COLUMNS 인덱스열에 대한 정보
클러스터 USER_CLUSTERS (CLU) 클러스터와 관련된 정보
데이터베이스 링크 USER_DB_LINKS 링크에 관련된 정보
스냅샷 USER_SNAPSHOTS  
스냅샷 로그 USER_SNAPSHOT_LOGS  
트리거 USER_TRIGGERS  
프로시저, 함수 및 패키지 USER_SOURCE  
코드 오류 USER_ERRORS  
테이블스페이스 USER_TABLESPACES  
영역 할당량 USER_TS_QUOTAS 테이블스레이스 단위로 사용자가 이용할 수 있는 영역의 최대크기와 할당된 영역의 크기 파악에 대한 정보
세그먼트와 익스텐트 USER_SEGMENTS
USER_EXTENTS
 
여유 영역 USER_FREE_SPACE 현재 여유로 표시된 영역이 얼마인지에 대한 정보
사용자 USER_USERS  
자원 제한량 USER_RESOURCE_LIMITS  
테이블 권한 USER_TAB_PRIVS  
열 권한 USER_COL_PRIVS  
시스템 권한 USER_SYS_PRIVS  

EX)

그럼 SEQUENCE정보를 알고 싶을때는 어떻하면 될까요?

SELECT * FROM USER_SEQUENCES

 

참고)  

DICTIONARY(DICT) 뷰

     - 데이터 사전 및 동적 성능 뷰에 대한 정보를 알고 싶으면 DICTIONARY 뷰나

         DICT_COLUMNS 뷰를 조회하면 됩니다.

 

      - 조회 할 수 있는 모든 데이터사전의 테이블이름과 설명을 조회 할 수 있습니다.

         물론 설명은 영문으로 되어 있습니다.

 

      - 동의어인 DICT를 이용해서도 똑같은 정보를 조회 할 수 있습니다.

 

     SQL> SELECT * FROM DICTIONARY WHERE table_name LIKE '%INDEX%';

     SQL> SELECT * FROM DICT WHERE table_name LIKE '%INDEX%';

 

 

DICT_COLUMNS 뷰

       - 뷰를 질의하면 해당 데이터사전의 컬럼에대한 정보를 조회 할 수 있습니다.

        SQL> SELECT * FROM DICT_COLUMNS WHERE TABLE_NAME LIKE '%INDEX%';

        SQL>SELECT * FROM dict WHERE table_name LIKE UPPER('%&데이타사전%');

출처 : Tong - atc17cjh님의 oracle통

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:14
반응형

Linux Oracle 설치와 활용(Ⅰ)



서  론

    인터넷 서버로서의 많은 가능성을 보여주고 있는 Linux는 사실상 미묘한 문제가 있었다. Apache는 웹서버로서의 더할 나위 없는 정상의 고지에 있었고, Samba는 많은 작업들을 MS WINDOWS로부터 해방시켜 주었으며 X WINDOW는 MS의 그것과 못지 않은 많은 윈도우 매니저들로 치장되었다. 문제는 좀더 신뢰성 있는 서비스들이었고 그것은 대체로 D/B 시스템과의 밀접한 관계를 가진다. 물론 Linux에서도 아주 훌륭한(그것도 공개의) D/B 들이 존재하는데 MiniSQL이나 Postgresql등이 그것이고 MySQL같은 조금 특별한(반 공개/반 상용) 것들도 있다. 하지만, 이것들이 아무리 훌륭하다고 해도 사용자의 입장에서는 누구하나 책임져주지도, 기술지원 해주지도 않는 이러한 D/B 시스템들에 자신의 귀중한, 혹은 상업적인 목적의 자료를 담아두고 맘 편해 하는 이는 별로 없을 것이다. 그러나 지금은 여러 우여 곡절 끝에 Linux는 Oracle 을 위시한 대형 D/B시스템 업체들로부터 지원을 받게 되었다. 대형 상용 D/B시스템 업체들의 지원과 엔터프라이즈급 성능을 갖춘 커널 2.2의 발표로 인터넷 서버 시장을 넘어 이제는 국내에서도 엔터프라이즈 플랫폼으로 Linux 가 강력하게 등장하고 있다.

 

목  적

    이 글의 목적은 간단하다. 여러 D/B벤더들의 제품중에서 유독 한국에서 초강세를 보이고 있는 Oracle (server for Linux 8.0.5)를 Linux상에서 설치하는 방법과 운용 방법, 그리고 간단한 pro-c 사용법, 그리고 한참 주가를 올리고 있는 php3와의 연동을 약 3회분에 걸쳐 살펴본다. Test에 사용된 Oracle server는 정품이 아니고 Oracle Home Page에 가면 쉽게 구할 수 있는 개발자 버전임을 알려둔다.

    ◎ 시스템 요구사항

    메모리 : 활용의 목적이 아닐 경우 32메가도 가능

    스왑영역 : 일반적으로 RAM의 3배 크기의 스왑영역이 권장. 1GB이상의 RAM을 가진
                   시스템에서는 2배 크기의 스왑영역이 권장된다.

    디스크 : 최소한 4개(At least four devices) : Oracle 소프트웨어 설치를 위해 하나, 나머지
                세개는 OFA호환 데이터베이스를 생성하기 위해 사용된다.
                - 활용의 목적이 아닐 경우 한 개의 디스크라도 상관없다.
                - 활용의 목적이라면 최소 2개의 물리적 디스크 추천 (리눅스, 오라클 )
                - 다운로드 받은 파일과 압축을 풀고 설치할 용량으로 최소 1기가 이상이 필요하다.

    Operating System : Linux 2.0.34
    - 오라클의 리눅스 팀은 실제 2.0.33 이상이라고 한다.
    - 필자는 참고로 국내에서 유명한 알짜 리눅스 5.2를 사용하였으며 커널은 2.0.36을
       사용하였다.

    System Libraries : GNU C Library, version 2.0.7
    - 문서상에서는 2.0.7이상을 요구하고 있으나 오라클의 리눅스 개발 팀으로부터의 설명으로는
       실제 2.0.6이상이면 된다고 한다.
       GLIBC 2.1.x 용으로는 패치 파일이 따로 나와 있다. 아직 테스트는 해보지 못했다.

    Window Manager : 어떤 X 윈도우 시스템도 가능
    -솔라리스에서는 X-window 상에서 관리할 수 있는 svrmgrm 이 있지만 Linux에서는 현재
      커맨드 라인 모드에서만 작동하는svrmgrl 만이 존재한다.

 

가. root 로 하여야 할일

    1. 다운로드 http://technet.oracle.com에서 오라클 리눅스를 다운 받는다.

    2. /usr/src 에 다운로드 받은 805ship.tgz 파일을 옮긴 후 /usr/src/ora에서 압축을 푼다.
       /usr/src/ora 상에 다음과 같은 파일과 디렉토리가 생성되었을 것이다.

        # ls
        DST.LST          network/           plsql/
        nlsrtl/              precomp/          RELDESC.TXT
        ocommon/       rdbms/             bin/
        oemagent/       slax/                oracore/
        sqlplus/           jdbc/                orainst/
        svrmgr/           lib/                   ord/
        unix.prd          otrace/              unixdoc/

    3. Create Mount Points
        이제 오라클을 설치할 위치를 정하는 단계이다. 여기서는 /home/oracle에 오라클을 설치
        하는 것으로 가정하겠다. 이 위치에 오라클을 설치할 하드 디스크 파티션을 마운트 시켜야
        한다.
    - 대부분의 사용자가 하나의 파티션에 리눅스를 설치할 것이다. 그렇지만 만일 두개 이상의
       하드디스크 파티션을 이용할 것이라면 /etc/fstab의 내용을 적합하게 고쳐야 한다.
       각 파티션의 내용을 다음에 설명하도록 하겠다.

    4. DBA group 생성
       /etc/group 파일에 dba라는 그룹을 생성한다.

       # groupadd dba
       혹은 직접 vi edit로 /etc/group을 편집할 수도 있다.

    5. 리눅스 커널 설정
        오라클8 서버의 SGA 구조를 수용하기 위해 리눅스 커널의 Interprocess Communication
        (IPC) 파라메터들을 설정해야 한다. 시스템이 SGA를 수용하기에 충분한 shared 메모리를
        가지지 않았다면 데이터베이스를 실행할 수 없을 것이다.

    다음에 상응하는 커널 파라메터를 설정한다.

    maximum size of a shared memory segment(SHMMAX)
    maximum number of shared memory segments in the system(SHMMNI)
    maximum number of shared memory segments a user process can attatch(SHMSEG)
    maximum amount of shared memory that can be allocated system-wide(SHMMNS)
    SHMMAX*SHMSEG에 의해 허용되는 전체 shred 메모리 크기가 결정된다.

    ㄱ) SHMMAX = 4294967295 : 단일 공유 메모리 세그먼트의 최대크기(바이트단위)
    ㄴ) SHMMIN = 1 : 단일 공유메모리 세그먼트의 최소크기(바이트)
    ㄷ) SHMIMNI = 100 : 공유메모리 지시자(identifiers)의 갯수
    ㄹ) SHMSEG = 10 : 각 프로세스에 부여될 수 있는 공유메모리 세그먼드의 최대 갯수
    ㅁ) SEMMNS = 200 : 시스템 내의 세마포어 갯수
    ㅂ) SEMMNI = 70 : 세마포어 지시자(identifiers)의 갯수. SEMMNI은  동시에 생성될 수 있는
                               세마포어 갯수를 결정한다.
    ㅅ) SEMMSL = PROCESSES 초기화 파라메터의 값과 같거나 크도록, 하나의 세마포어 안에
                                            존재할 수 있는 세마포어들의 최대 갯수.
                                            오라클 프로세스들의 최대 갯수와 같아야 한다.

    솔라리스의 경우에는 다음의 값들을 /etc/system 파일에서 설정해 주어야 하지만, 설정을 하지 않아 문제가 발생한적은 없었다. 기본 커널 상태로 놓고 인스톨하여도 무방하다. (레드헷의 디폴트 커널이든 다시 컴파일한 커널이든)

    6. 오라클 관리자 계정 생성
        adduser 혹은 useradd 로 dba그룹에 속하는 유저 oracle을 생성한다.

      ㄱ) adduser 명령으로 oracle user를 생성한다.
           # adduser oracle
      ㄴ) vi /etc/passwd 명령을 사용하여 oracle user 의 설정 값을 위에서
          설명한 것대로 바꾼다. - dba gid와 같아야 한다.

    7. oratab 파일 생성
       오라클 인스턴스에 대한 정보는 oracle 소유의 oratab 파일에 저장된다.
       하지만 이 스크립트를 root로 실행해서 /etc 디렉토리에 oratab 파일이 생성되도록 한다.

       실제 인스톨과정에서 oratab.sh을 실행하면 ORACLE_OWNER환경변수가 설정되어 있는지
       묻고 있다. 따라서 ORACLE_OWNER을 다음과 같이 설정한다.

      #export ORACLE_OWNER=oracle

 

나. oracle user 로 할 일

    1. ~/.bash_profile의 수정
       ( sh을 사용할 경우 .profile을 수정한다. redhat 리눅스를 기준으로 설명한다.)
       oracle로 접속하여 다음과 같이 .profile을 만든다. RedHat에서는 .bash profile 이다.

      export
      ORACLE_HOME=/home/oracle/app/oracle/product/8.0.5
      export
      LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/jdbc/lib
      export ORACLE_SID=linux
      export ORACLE_TERM=386
      export
      ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
      export PATH=$PATH:$ORACLE_HOME/bin
      export TMPDIR=/tmp
      export
      CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
      umask 022
      (위에서 export 다음의 줄을 export 뒤에 나와야 한다.)

    위의 경우는 “root 작업 4”의 “Create Mount Points”에서 이야기한 오라클을 설치할 경로로 /home/oracle인 경우이다.

각 설정에 대한 설명

    ORACLE_HOME :
    오라클을 /home/oracle에 설치하기로 하였으므로 /home/oracle/app/oracle/product/8.0.5로 지정된다.

    LD_LIBRARY_PATH :
    오라클의 동적/정적  라이브러리의 경로를 나타내는 환경변수로 Pro*C나 PHP등을 사용할 때 중요하게 적용된다.

    ORACLE_SID :
    오라클 인스턴스의 이름이다. 영문자로 3-4글자로 정해준다. 필자는 인스턴트의 이름을 linux 라고 지었다.

    그 외의 환경변수는 예제에 나와 있는 데로 하면 된다.

    지역언어설정 환경변수 NLS_LANG은 모든 인스톨이 끝나고 설명하도록 하겠다.

환경변수 갱신

    위와 같이 .profile내용을 변경하였다면

      # . .bash_profile 혹은
      # source .bash_profile 하여 환경변수 내용을 업데이트한다. 또는 oracle계정으로 다시 로그인한다.

 

다. 실제적인 Oracle 의 설치

    1. 인스톨러 실행

      ㄱ) oracle로 로그인 한다. - 절대 root로 인스톨로를 실행하면 안된다.
      ㄴ) oracle 설치 디렉토리로 이동
           # cd /usr/src/ora/orainst
      ㄷ) orainst를 실행한다.
           # ./orainst 를 실행한다.

    화면에서 [TAB]키, 화살표키, 스페이스 바를 이용하여 항목을 선택할 수 있다.

    2. 검은 배경의 설치화면이 나오면 Custom Install을 선택한다.

    3. 처음 설치하는 것이므로, (o) Install, Upgrade, or De-Install Software을 선택한다.

    4. 새롭게 인스톨 할 것이므로  Install New Product - Create DB Objects을 선택한다.

    5. Mount Point를 설정한다. root user로 할 일 5. 번에서 설정한 것처럼 mount point를
        /home/oracle로 설정한다.

    6. .bash_profile에서 설정한 것처럼 $ORACLE_HOME 디렉토리를 설정한다.

    7. ORACLE_BASE 와 ORACLE_HOME을 설정한다.

    8. log 파일이 남을 위치를 설정한다.

    9. Install from CD-ROM을 선택하여야 한다.

    10. ORACLE_SID를 .bash_profile에서 설정한 것과 같이 linux로 선택한다.

    11. NLS 의 설정 - 여기에서는 일단 ALL language를 선택한다.

    12. install 이 끝이 난 후 root.sh을 실행하라는 메시지가 출력된다. 반드시 install 후에는
         root.sh을 실행하여야 한다.

    13. Software Asset Manager에서 설치한 부분을 선택한다.여기에서는 모든 부분을 설치
         한다고 가정을 한다.

    14. 13)에서처럼 Install을 선택한 후 몇 가지 사항에 대하여 OK를 한 후 OSOPER group (dba)
          를 설정한다.

    15. 생성할 DB Object를 선택한다. - Filesystem-Based Database을 선택한다.

    16. Database Mount Points를 정한다. 설치도중에 3개의 mount points를 기입하라고 하는데
         물리적으로 분리된 하드가 3개 존재하면 가장 좋지만 실제 PC에서는 힘든 일이다.
         이렇게 3곳으로 데이터를 분리하는 이유는 데이터베이스가 하드 디스크로의 읽기/쓰기를
         하는 과정에서 경합을 줄이고 에러 및 문제의 발생시 자연스런 복구를 위한 것이다.
         하지만 오라클 프로그램과 동일한 하드디스에 밖에 인스톨 할 공간이 없다면 여기에 모두
         동일한 경로를 적어주면 된다.

         필자도 오라클을 설치할 때  /home/oracle에 오라클 프로그램을 설치하고 데이터 파일을
         위한 3개의 마운트 포인트도 /home/oracle로 설정하였다.

    17. Character Set 설정 - 한글을 쓰기 위해서KO16KSC5601로 설정한다.

    18. National Character Set 설정

    19. System password 의 설정 (보통 manager라고 password를 입력한다. )

    20. sys password 의 설정 ( manager로 password를 설정. )

    21. dba password 의 설정 ( no라고 설정한다. )

    22. TNS Listener Password 의 설정

    23. Configure MTS and start SQL*Net listener 설정은 no로 한다.

    24. Control files 의 위치 확인.

    25. 기본적인 데이터베이스 관련 파일의 위치와 용량의 확인

    26.  JDBC 셋의 선택 (default로 선택을한다.)

    27. CTX Temporary Tablespace을 선택한다.

    28. CTX demo table을 설치할 것을 선택한 후에, Oracle Document를 설치할 것에 대하여
         셋팅한다. 디렉토리를 설정한 후 pdf, html, both 어떤 형식으로 설치할 것인지 묻는데
         그때에는 자신이 원하는 항목 중에서 한가지를 선택하면 된다.

    29. 이제 인스톨이 시작되기 시작하고 그래프가 올라가기 시작한다. 하염없이 기다리자 -_-;

    30. 설치완료 화면.

    31. 설치 검증
         설치가 모두 끝났다면 $ORACLE_HOME/orainst 디렉토리에 생성된 root.sh을 root 계정
         으로 실행 시킨다.

       ㄱ) root로 로그인한다.
       ㄴ) cd $ORACLE_HOME/orainst
       ㄷ) ./root.sh

      # ./root.sh
      - /etc/oratab 아래에 다음과 같은 내용이 추가되었다.

      *:/home/oracle//app/oracle/product/8.0.5:N
      linux:/home/oracle/app/oracle/product/8.0.5:N

 

라. Oracle Database 의 구동

    1. oracle user로 login.

    2. svrmgrl을 실행시킨 후 database를 가동한다.

      $ svrmgrl   - svrmgrl 의 실행

      SVRMGR> connect internal - internal 접속
      Connected.
      Oracle Server Manager Release 3.0.5.0.0 - Production

      (c) Copyright 1997, Oracle Corporation. All Rights  
           Reserved.

      Oracle8 Release 8.0.5.0.0 - Production
      PL/SQL Release 8.0.5.1.0 - Production

      SVRMGR> connect internal - internal 접속
      Connected.

      SVRMGR> startup;
      ORACLE instance started.
      Total System Global Area    4754704 bytes
      Fixed Size                         48400 bytes
      Variable Size                     4222976 bytes
      Database Buffers               409600 bytes
      Redo Buffers                     73728 bytes
      Database mounted.
      Database opened.

      SVRMGR> exit - svrmgrl 의 종료
      Server Manager complete.

    3. lsnrctl 명령을 이용하여 Oracle listener을 가동시킨다.
        - lsnrctl start : Oracle listener 의 가동
        - lsnrctl stop  : Oracle listener 의 멈춤
       $ lsnrctl start

    LSNRCTL for Linux: Version 8.0.5.0.0 - Production on 26-APR-99 21:56:51
    (c) Copyright 1997 Oracle Corporation.  All rights reserved.

    Starting /home/oracle/app/oracle/product/8.0.5/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 8.0.5.0.0 - Production
    System paramete rfile is
    /home/oracle/app/oracle/product/8.0.5/network/admin/
    listener.ora
    Log messages written to
    /home/oracle/app/oracle/product/8.0.5/network/log/
    listener.log
    Listening on:
    (ADDRESS=(PROTOCOL=ipc)(DEV=6)(KEY=linux))
    Listening on:
    (ADDRESS=(PROTOCOL=ipc)(DEV=10)(KEY=PNPKEY))
    Listening on:
    (ADDRESS=(PROTOCOL=tcp)(DEV=11)(HOST=192.168.1.1)(PORT=1521))

    Connecting to
    (ADDRESS=(PROTOCOL=IPC)(KEY=linux))
    STATUS of the LISTENER
    ------------------------
    Alias                       LISTENER
    Version                   TNSLSNR for Linux: Version 8.0.5.0.0 - Production
    Start Date                26-APR-99 21:56:56
    Uptime                    0 days 0 hr. 0 min. 1 sec
    Trace Level              off
    Security                   OFF
    SNMP                      OFF
    Listener Parameter File  
    /home/oracle/app/oracle/product/8.0.5/network/admin/
    listener.ora
    Listener Log File        
    /home/oracle/app/oracle/product/8.0.5/network/log/
    listener.log
    Services Summary...
    extproc               has 1 service handler(s)
    linux         has 1 service handler(s)
    The command completed successfully

    - 오라클 리스너가 제대로 실행이 되지 않을 경우 listener.ora, tnsnames.ora을 알맞게
       편집한다.
     (/home/oracle/app/oracle/product/8.0.5/network/admin 위치하여 있다.)

    다음은 tcp/ip 프로토콜을 기준으로 하여서 listener.ora를 알맞게 편집한 것이다.

    #
    # Installation Generated Net8 Configuration
    # Version Date: Jun-17-97
    # Filename: Listener.ora
    #
    LISTENER =
    (ADDRESS_LIST =
    (ADDRESS= (PROTOCOL= IPC)(KEY= linux))
    (ADDRESS= (PROTOCOL= IPC)(KEY= PNPKEY))
    (ADDRESS= (PROTOCOL= TCP)(Host= 192.168.1.1)
    (Port= 1521))
    - database 가 설치되어 있는 ip를 적어준다.
    )
    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (GLOBAL_DBNAME= 192.168.1.1.)
    - database 가 설치되어 있는 ip를 적어준다.
    (ORACLE_HOME=
    /home/oracle/app/oracle/product/8.0.5)
    (SID_NAME = linux)
    - linux sid , 설치도중 적어준 sid를 적어준다.
    )
    (SID_DESC =
    (SID_NAME = extproc)
    (ORACLE_HOME =
    /home/oracle/app/oracle/product/8.0.5)


    (PROGRAM = extproc)
    )
    )
    STARTUP_WAIT_TIME_LISTENER = 0
    CONNECT_TIMEOUT_LISTENER = 10
    TRACE_LEVEL_LISTENER = OFF

    #
    # Installation Generated Net8 Configuration
    # Version Date: Oct-27-97
    # Filename: Tnsnames.ora
    #  
    extproc_connection_data =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = linux))
    (CONNECT_DATA = (SID = extproc))
    )
    linux =
    - oracle alias
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL= TCP)(Host= 192.168.1.1)
    (Port= 1521))
    - database 가 설치되어있는 database 의 ip
      (CONNECT_DATA = (SID = linux))
    - oracle sid
    )

    linux_BEQ =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = BEQ)(PROGRAM =
    /home/oracle/app/oracle/product/8.0.5)
    (argv0 = oraclelinux)
    (args = ‘(DESCRIPTION =
    (LOCAL=YES)(ADDRESS=(PROTOCOL=BEQ)))’)
    (envs =
    ‘ORACLE_HOME=/home/oracle/app/oracle/product/8.0.5,ORACLE_SID=linux’)
    )
    )

    4. 이제 다시 lsnrctl start 명령으로 실행하여 Oracle listener을 실행한다.
        이제 sqlplus을 실행하여 접속이 되나 확인을 하자. test 용으로 id : scott password : tiger
        가 제공됨을 알 수 있다. 이미 설치 중에 system과 sys의 password는 직접 입력하였으므
        로, system 혹은 sys로 접속이 가능한지 확인할 수 있다.

    5. sqlplus로 접속이 확인되었으면 이제 listener을 종료한 후 database를 종료시켜 보자.

    - listener 의 종료
    $ lsnrctl stop

    LSNRCTL for Linux: Version 8.0.5.0.0 - Production on 26-APR-99 22:18:35

    (c) Copyright 1997 Oracle Corporation.  All rights reserved.

    Connecting to
    (ADDRESS=(PROTOCOL=IPC)(KEY=linux))
    The command completed successfully

    - oracle database 의 shutdown
    $ svrmgrl
    Oracle Server Manager Release 3.0.5.0.0 - Production

    (c) Copyright 1997, Oracle Corporation.  All Rights Reserved.

    Oracle8 Release 8.0.5.0.0 - Production
    PL/SQL Release 8.0.5.0.0 - Production

    SVRMGR> connect internal
    Connected.
    SVRMGR> shutdown
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SVRMGR> exit
    Server Manager complete.

    $

 

마. Oracle Database 의 사용자 등록

    system/manager라는 Oracle 사용자 계정은 UNIX시스템에서의 root를 사용하는 것과 유사하기 때문에 우리는 문제를 발생시키는 것을 최소화하기 위해 되도록 적은 권한을 갖는 사용자를 생성할 필요가 있다.

    SQL*PLUS에 연결하고 사용자를 생성한다.

    $ sqlplus system/manager

    SQL*Plus: Release 8.0.5.1.0 - Production

    Copyright (c) Oracle Corporation 1997.  All rights reserved.

    Connected to:
    Oracle8 Server Release 8.0.5.0.0 - Production Release
    PL/SQL Release 8.0.5.0.0 - Production

    SQL> create user <user> identified by <psw>
    2  default tablespace users
    3  temporary tablespace temp;

    User created.
    SQL> grant connect, resource to <user>

    Grant succeeded.

    SQL> exit

    Disconnected from Oracle8 Server Release 8.0.5.0.0 -
    Production Release
    PL/SQL Release 8.0.5.0.0 - Production

    시스템에 새로운 사용자계정을 생성하였기 때문에 새로운 계정을 가지고 시스템에 로그인 할수 있다. Oracle 데이터베이스에 로그인 하기 위해서는 다음과 같다.

    $ sqlplus <user>/<password>

    이 부분이 에러 메시지 없이 수행된다면, 성공적으로 Oracle 데이터베이스를 설치한 것이다.

 

바. Oracle 데이터 베이스의 자동 실행

    Oracle 데이터베이스의 자동 시작과 중지는 Oracle에서 제공하는 파일인 dbstart와 dbstop를 이용하여 설정할 수 있다. 이러한 파일들은 etc/oratab 파일의 존재여부에 의존한다.

    /etc/oratab 파일의 형식은 다음과 같다.

    SID:ORACLE_HOME:AUTO

설정  예

    #
    # This file is used by ORACLE utilities.  It is created by root.sh
    # and updated by the Oracle8 and SQL*Net install procedures.
    #
    # A colon, ‘:’, is used as the field terminator.  A new line terminates
    # the entry.  Lines beginning with a pound sign, ‘#’, are comments.
    #
    # Entries are of the form:
    # $ORACLE_SID:$ORACLE_HOME:<N|Y>:
    #
    # The first and second fields are the system identifier and home
    # directory of the database respectively.  The third field indicates
    # to the dbstart utility that the database should, “Y”, or should not,
    # “N”, be brought up at system boot time.
    #
    # Multiple entries with the same $ORACLE_SID are not allowed.
    #
    #
    linux:/oracle8/app/oracle/product/8.0.5:Y

    init.d & rc.d

    리눅스 시스템의 시작과정이나 종료과정을 변형하여 데이타베이스를 시작시키고 종료 시킬 수 있다. 이것은 매우 쉽지만, 어떠한 Linux(slackware, debian, redhat, etc)시스템을 사용하느냐에 따라  변경될 수 있다는 것을 필자는 지적한다. 이 문서에서는 Redhat Linux 5.2 에서 동작하는 예를 보여줄 것이다. 자신의 Linux 시스템에 따라 수정하기 위해서는 자신의 Linux 시스템 문서 자료를 참고한다. 우선, 우리는 /etc/rc.d/init.d 디렉토리에 있는 dbshut와 dbstart를 실행할 스크립트를 생성할 필요가 있다.

    #!/bin/sh
    #
    # /etc/rc.d/init.d/oracle
    # Description: Starts and stops the Oracle database and listeners
    # See how we were called.

    case “$1” in
    start)
     echo -n “Starting Oracle Databases: “
     echo “----------------------------------------” >> /var/log/oracle
     date +”! %T %a %D : Starting Oracle Databases as part of system up.”  >> /var/log/oracle
     echo “--------------------------------------------” >> /var/log/oracle
     su - oracle -c dbstart >> /var/log/oracle
     echo “Done.”
     echo -n “Starting Oracle Listeners: “
     su - oracle -c “lsnrctl start” >> /var/log/oracle
     echo “Done.”
     echo “”
     echo “--------------------------------------------” >> /var/log/oracle
     date +”! %T %a %D : Finished.” >> /var/log/oracle
     echo “--------------------------------------------” >> /var/log/oracle
     touch /var/lock/subsys/oracle
     ;;
    stop)
     echo -n “Shutting Down Oracle Listeners: “
     echo “-----------

    ---------------------------------” >> /var/log/oracle
     date +”! %T %a %D : ShutDown Oracle Databases as part of system down.” >> /var/log/oracle
     echo “--------------------------------------------” >> /var/log/oracle
     echo “Done.”
     rm -f /var/lock/subsys/oracle
     echo -n “Shutting Down Oracle Databases: “
     su - oracle -c dbshut >> /var/log/oracle
     echo “Done.”
     echo “”
     echo “--------------------------------------------” >> /var/log/oracle
     date +”! %T %a %D : Finished.” >> /var/log/oracle
     echo “-------------------------------------------” >> /var/log/oracle
     ;;

    restart)
     echo -n “Restarting Oracle Databases: “
     echo “-------------------------------------------” >> /var/log/oracle
     date +”! %T %a %D : Restarting Oracle Databases as part of system up.” >> /var/log/oracle
     echo “-------------------------------------------” >> /var/log/oracle
     su - oracle -c dbstop >> /var/log/oracle
     su - oracle -c dbstart >> /var/log/oracle
     echo “Done.”
     echo -n “Restarting Oracle Listeners: “
     su - oracle -c “lsnrctl stop” >> /var/log/oracle
     su - oracle -c “lsnrctl start” >> /var/log/oracle
     echo “Done.”
     echo “”
     echo “--------------------------------------------” >> /var/log/oracle
     date +”! %T %a %D : Finished.” >> /var/log/oracle
     echo “-------------------------------------------” >> /var/log/oracle
     touch /var/lock/subsys/oracle
     ;;

    *)

    echo “Usage: oracle {start|stop|restart}”
    exit 1
    esac

    이 파일이 실제적으로 정확히 당신의 시스템에서  데이터베이스를 중지하고 실행시키는지를 확인해야 한다. 에러메세지를 위한 /var/log/oracle인 log 파일을 확인하라.
    다음 명령들은 실행수준 2,3,4에 해당하는 데이테베이스를 실행시는 것을 확인 시켜줄 것이다.

    $ ln -s ../init.d/oracle /etc/rc.d/rc2.d/S99oracle
    $ ln -s ../init.d/oracle /etc/rc.d/rc3.d/S99oracle
    $ ln -s ../init.d/oracle /etc/rc.d/rc4.d/S99oracle

    시스템을 재 부팅하거나, 재 실행 시킬 때에 데이터베이스를 중지시키기 위해서 우리는 다음과 같은 연결(link)이 필요한다.

    $ ln -s ../init.d/oracle /etc/rc.d/rc0.d/K01oracle          # Halting
    $ ln -s ../init.d/oracle /etc/rc.d/rc6.d/K01oracle          # Rebooting

 

마치는 글

    이상으로 간략하게나마 Linux 상에서의 Oracle 데이터베이스 설치와 구동법에 대해서 알아보았다.
    그림과 함께 좀 더 명확한 설치법을 소개해 줄 수도 있었지만, 이제 간단한 설치법 정도는 기타 책이나 오라클사 세미나에 가면 쉽게 구할 수 있으므로 기본 설치법에 사용자 등록, 자동 시작/종료를 추가해 첫 글을 마친다. 다음에는 간단한 sqlplus 사용법, Oracle SQL, pro-c 에대해서 알아보고 마지막으로 PHP3와 연동하는 것으로 이 글을 마칠까 한다.

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:05
반응형

Oracle Database 10g (10.1.0.2)

Installation On Fedora Core 2 (FC2)

In this article I'll describe the installation of Oracle Database 10g (10.1.0.2) on Fedora Core 2. The article is based on a Fedora Core 2 Server Installation with a minimum of 2G swap and the following package groups installed:
  • X Window System
  • GNOME Desktop Environment
  • KDE Desktop Environment
  • Editors
  • Graphical Internet
  • Text-based Internet
  • Server Configuration Tools
  • Windows File Server
  • Network Servers
  • Development Tools
  • Kernel Development
  • Administration Tools
  • System Tools

Alternative installations may require additional packages to be loaded in addition to the ones listed below.

Download Software

Download the following software:

Unpack Files

First unzip the files:
gunzip ship.db.cpio.gz
Next unpack the contents of the files:
cpio -idmv < ship.db.cpio
You should now have a single directory (Disk1) containing installation files.

Hosts File

The /etc/hosts file must contain a fully qualified name for the server:
<IP-address>  <fully-qualified-machine-name>  <machine-name>

Set Kernel Parameters

Add the following lines to the /etc/sysctl.conf file:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
Run the following command to change the current kernel parameters:
/sbin/sysctl -p
Add the following lines to the /etc/security/limits.conf file:
*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536
Add the following line to the /etc/pam.d/login file, if it does not already exist:
session    required     /lib/security/pam_limits.so
Note by Kent Anderson: In the event that pam_limits.so cannot set privilidged limit settings see Bug 115442.

Setup

Install the following packages:
# From Fedora Core 2 Disk 1
cd /mnt/cdrom/Fedora/RPMS
rpm -Uvh setarch-1.4-1.i386.rpm
rpm -Uvh tcl-8.4.5-7.i386.rpm

# From Fedora Core 2 Disk 2
cd /mnt/cdrom/Fedora/RPMS
rpm -Uvh openmotif-2.2.3-2.i386.rpm

# From Fedora Core 2 Disk 3
cd /mnt/cdrom/Fedora/RPMS
rpm -Uvh compat-libstdc++-7.3-2.96.126.i386.rpm
rpm -Uvh compat-libstdc++-devel-7.3-2.96.126.i386.rpm
rpm -Uvh compat-db-4.1.25-2.1.i386.rpm
rpm -Uvh compat-gcc-7.3-2.96.126.i386.rpm
rpm -Uvh compat-gcc-c++-7.3-2.96.126.i386.rpm
Create the new groups and users:
groupadd oinstall
groupadd dba
groupadd oper

useradd -g oinstall -G dba oracle
passwd oracle
Create the directories in which the Oracle software will be installed:
mkdir -p /u01/app/oracle/product/10.1.0/db_1
chown -R oracle.oinstall /u01
Login as root and issue the following command:
xhost +<machine-name>
Edit the /etc/redhat-release file replacing the current release information (Fedora Core release 2 (Tettnang)) with the following:
redhat-3
Login as the oracle user and add the following lines at the end of the .bash_profile file:
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1; export ORACLE_HOME
ORACLE_SID=TSH1; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
LD_ASSUME_KERNEL=2.4.1; export LD_ASSUME_KERNEL

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

Installation

Log into the oracle user. If you are using X emulation then set the DISPLAY environmental variable:
DISPLAY=<machine-name>:0.0; export DISPLAY
Start the Oracle Universal Installer (OUI) by issuing the following command in the Disk1 directory:
./runInstaller
During the installation enter the appropriate ORACLE_HOME and name then continue with a "software only" installation.

Post Installation

As the oracle user issue the following commands:
cd $ORACLE_HOME/bin

mv oracle oracle.bin

cat >oracle <<"EOF"
#!/bin/bash
 
export DISABLE_HUGETLBFS=1
exec $ORACLE_HOME/bin/oracle.bin $@
EOF
 
chmod +x oracle
This should prevent the "ORA-27125: unable to create shared memory segment" being produced by the DBCA.

Edit the /etc/redhat-release file restoring the original release information:
Fedora Core release 2 (Tettnang)
Finally edit the /etc/oratab file setting the restart flag for each instance to 'Y':
TSH1:/u01/app/oracle/product/10.1.0:Y
For more information see:
Hope this helps. Regards Tim...
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:01
반응형

======================================================================
ORA-00030 : ALTER SYSTEM KILL SESSION에 대하여
======================================================================

◈ 현상 사용자는 다음과 같은 상황에서 session 을 kill 하려는 시도를 하게 된다. 1. os 에는 process 가 존재하지 않지만, v$session 에는 active 로 존재하고 있을 경우 2. shadow process 는 살아 있는데, client machine 을 rebooting 한 경우 3. session 이 걸고 있던 lock 을 release 해야 할 경우 4. OS 나 Oracle 의 자원을 지나치게 많이 사용하여 성능을 저하시키는 process 그런데, alter system kill session ('sid, serial#'); 후에 다음과 같은 에러가 발생할 경우가 있다. ora-00030, 00000, "user session ID does not exist" // *Cause: The user session id no longer exists, probably because the // session was logged out. // *Action: Use a valid session ID. ◈ 원인 kill session을 할 수 없는 이유는 PMON이 이미 이 session을 delete하고 있는 중이기 때문이다. 즉, PMON 이 dead session 을 clean-up 하고 있는 중에는 serial number의 값이 증가한다. 문제는 PMON이 process를 kill하는 시간인데, transaction의 크기에 따라, PMON의 rollback 시간이 결정된다. 먼저 PMON은 dead process를 찾아내어, 이 process가 사용한 resource 를 release하는 시도를 한다. PMON은 계속 이 작업을 시도하다가 마침내, free buffer의 부족으로 더 이상 resource를 free-up 하지 못하게 된다. 이 때, 이 process를 delete하고 있다는 message를 trace file에 출력하는데, 이것은 process를 delete하는 데 필요한 resource(data cache 내의 free buffer)의 부족으로 위의 작업이 지연되고 있다는 의미이다. ◈ 조치 PMON이 process 를 clean-up 할 때 걸리는 시간은, 5분에서 24 시간까지 소요될 수 있다. 문제는 이 process가 hold 하고 있는 lock으로 인해 특정 작업이 수행되지 못하는 데 있다. MTS 를 사용할 때는 configuration MTS setting, sqlnet.expire_time 사용)에 따라 다르지만, clean-up 작업을 하는데 72 시간 이 소요된 경우도 있다. 아직까지는 PMON이 작업을 마칠 때까지 기다리는 방법 또는 db를 restartup하는 방법 밖에는 없다. --- PMON 의 작업 PMON은 network failure 나 기타의 원인으로 생긴 old process connection을 clean-up하는 역할을 한다. 그런데, PMON 은 clean-up 해야 하는 connection 중에 정해진 개수 만큼의 transaction 을 rollback 할 수 있는데, 이 값은 initSID.ora 의 cleanup_rollback_entries(default = 20) 에 의해 결정된다. 예를 들어, 1000 개의 uncommitted update가 있다면, 일정한 시간마다 cleanup_rollback_entries의 개수 만큼의 record만 rollback 할 수 있으므로 이 작업 동안에 lock 은 그대로 유지된다. PMON 은 위의 작업 이외에 DB maintenance 역할이 있으므로, 위의 rollback 이 비교적 빠르게 처리 되지 못할 수도 있다. 이러한 rollback을 빠르게 처리하기 위하여 cleanup_rollback_entries 를 늘릴 수도 있다. 그러나, 그 만큼 일정시간 동안 PMON의 작업이 많아지게 되므로, 다른 사용자들의 작업 요청이 느려지게 되는 trade-off가 있으므로, 신중히 고려한 후에 수정하는 것이 바람직하다. alter system kill session 에 의해서도 위와 같이 rollback 이 이루어지는데, 이 session 이 완전히 clean-up 되기 전까지 v$session, v$process에 남아 있게된다. --- ALTER SYSTEM KILL SESSION 을 하기 전에 ... kill session 을 원할 경우는 다음의 순서대로 작업하는 것이 좋다. 1. kill the user process first 2. wait for 3 - 4 minutes 3. query v$session 4. if any information find in v$session, query v$lock like select count(*) from v$lock where SID ='sid'; 위의 count(*) 가 0 이 아니라면, 아직 PMON 이 rollback을 끝내지 못한 경우이므로 다시 얼마후에 v$lock 을 조회하여 lock 의 개수가 감소하였는지 반복적으로 확인한다. 만약, 이 값이 전혀 변하지 않았다면, ALTER SYSTEM KILL SESSION 을 수행하고 v$session, v$lock을 query 하여 변화가 있는지 확인하여 변화가 있다면, 좀 더 기다린다. 그래도, v$lock 의 count(*) 가 0 이 되지 않을 경우, 마지막으로 수행할 수 있는 유일한 방법은 instance 를 restartup 하는 것이다.

======================================================================
ORA-00054 : TABLE에 TRANSACTION이 종료되지 않은 경우
======================================================================

TABLE 을 DROP 하려고 할때 그 TABLE에 TRANSACTION이 종료되지 않아 ORA-54 ERROR가 나오는 경우가 있다. DB를 RESTART하면 되지만 더 효율적인 해결 방법은 다음과 같이 할수 있다. * 참고 : Serial Number 가 Negative 인 경우 그 값에 65536 을 더해야 함. rem sqlplus system/manager rem rem prompt Enter table name accept tname CHAR col type format a6 col object_name format a20 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=upper('&amp;tname'); Prompt Enter session ID(SID) ? accept sid Prompt Enter serial number(serial#) ? prompt -- if serial number < 0, prompt -- then serial number #=Serial number + 65536 accept serial alter system kill session '&amp;sid,&amp;serial'


==================================================================================
ORA-00060 : DEADLOCK과 INITRANS (같은 TABLE내의 다른 범위의 DATA처리시 ORA-60)
==================================================================================

 deadlock에  관한  일반적인  사항은  <Bul:11742>에  정리되어  있다.  같은  data를  동시에   변경하는
 transaction의 경우  deadlock이 발생하는  것은 application  logic을 수정하여  해결해야 하는  경우가
 대부분이다.

 그런데 같은 table에 대해서 동시에 수행되는  transaction이 각자 서로 다른 data를 처리하는  경우에도
 ora-60(deadlock detected while waiting for resource)이 발생할 수 있다.

 예를 들어 한 transaction은 A table의 1월 data를 처리하고, 동시에 다른 transaction은 같은 A  table의
 2월 data를 처리하는 것과 같은 경우이다.

 이러한 경우에도 initrans가  작게 설정되어 있으면,  ora-60이 발생할 수  있는데, 이 자료에서는  이와
 같이 다른 data를 처리하는 transaction들 사이에서의 ora-60이 발생하는 경우와 조치사항을 확인한다.

  1. transaction entry에 대해서
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 table이나 index에 포함된 모든 block에 update/delete/insert와 같은 dml을 수행하기 위해서는 일단  그
 block에 transaction정보를 저장시킬 transaction entry를 확보한 후에 원하는 작업이 수행가능하다.

 이  transaction entry의  크기는 os  dependent하기는 하나  대부분 23  bytes이며, table이나   index의
 initrans  option에 의해,  미리 확보되는  block당 transaction  entry의 갯수가  결정된다. default는
 table이 1, index가 2이다.

 이  transaction  entry가  특정 transaction에  할당되면  그  transaction이 commit이나   rollback되기
 전까지는 다른 transaction에서  사용할 수 없다.  같은 block에 다른  transaction이 dml을  수행하려면,
 남은 공간중에서 23 bytes의 transaction entry를 새로 할당하거나, 공간이 없으면 앞에서 먼저 사용중인
 transaction이 commit/rollback되기를 기다려야 한다.

  2. ORA-60이 발생하는 경우
  ~~~~~~~~~~~~~~~~~~~~~~~~~
 deadlock을 유발시키는 transaction이 서로간에 완전히 다른 data(같은 table)를 처리하더라도 그  data가
 같은 block에  함께 들어가  있는 경우라면  ORA-60이 발생할  수 있다.  즉, transaction  entry를  잡는
 과정에서  block내에 남은  space가 부족한   경우, 서로  상대방의 transaction이  종료되기를  기다리는
 deadlock이 발생가능하다는 것이다. 아래에 실제 예를 들어 자세한 발생 시나리오를 정리하였다.

① ORDER table은  날짜별로 data가 추가,    변경, 삭제되는 100만건  이상의 data를 가진  table이다. 이
 table에   대해서   월별로   통계작업을  수행하는데,   6개월씩   처리하기   위해  6개  transaction을
 동시에 수행하였다. 즉, T1은 1월 data, T2는 2월 data, T6는 6월 data를 처리하는 식이다.

② ORDER table은 initrans값이 1로 지정되어 있고 현재 1000개의 block이 이 table에 할당되어 있다.

③  100번지  block에  2월,  3월,  5월  data가  함께  저장되어  있다.  200번지  block에는  2월,   3월
 data가 저장되어 있다.

④ T2  transaction이  100번지  block에  이미  확보되어  있는  1개의  transaction   entry를  사용하여
 transaction정보를 저장하였다. 그리고, 2월달 data에 대한 작업을 수행하였다.

⑤ T3 transaction이 200번지 block에 initrans  1에 의해 확보되어 있는 23 bytes의  transaction entry를
 이용하여 transaction정보를 저장한 후 3월달 data에 대한 처리를 수행하였다.

⑥ T2 transaction이 2월달 data중 나머지 부분을  처리하기 위해 200번지를 access하여 23 bytes의 T2  를
 위한   transaction     entry를   확보하려고      하였으나,   block에     남은   공간이      없어서,
 T3 transaction이  commit할때까지   기다린다.   5번  단계에서,    initrans에  의해  미리    확보되어
 있는 공간을  사용하는 T3 transaction이 종료되면, 그 부분을 T2가 사용할 수 있게 되는 것이다.

⑦ T3  transaction도  100번지에  있는 3월  data를  처리하기  위해  100번지내에 transaction   entry를
 추가적으로   확보하려 하였으나,    공간이 없어서,    마찬가지로  미리   100번지 block을    사용하고
 있는 T2 transaction이 종료되기를 기다리게 된다.

⑧ 6과 7상황에  의해 T2와 T3  transaction은 서로 상대방이  종료되기를 기다리는, deadlock이  발생하게
 되므로   deadlock상황을  유발시킨     T3   transaction이   ORA-60을    발생시키면서   종료   되고,
 T3  transaction은   rollback된다.  200번지에   확보한    transaction   entry부분도  반환하여   다른
 transaction이 사용가능한 상태가 된다.

⑨ 8번에서 release된 200번지  block내의 transaction entry 23  bytes를 6번 단계에서 기다리고  있던 T2
  transaction이 확보하고 작업을 진행한다.

  3. deadlock을 피하기 위한 방법
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

결론적으로,  같은  table에 대해서  다른  data를 처리하는  transaction이라  하더라도 동시에  수행하는
transaction이 많은 경우라면 initrans 값이 작은 경우 ora-60이 발생할 수 있게 된다.

하나의 table에 대해서  performance등의 이유로 동시에  다른 data를 처리하는  transaction을 수행하고자
한다면,  table의  initrans  값을  크게하여,  하나의  block에  여러  개의  transaction이  dml  처리를
수행하더라도 space가 부족하여 기다리는 상황은 없도록 하여야 한다.

initrans를 n으로 지정한다면 23*n bytes가 항상 transaction entry로 미리 확보되어 있는 것이다.  이렇게
transaction entry로 초기에 확보된  공간은 data를 저장할 수  없는 공간이 되므로, 너무  크게 하는 것은
space 낭비가 초래된다. 하나의 block에 대해서  동시에 여러 transaction이 처리되지 않는 경우라면  미리
확보된  transaction entry는  사용도 되지  않고 낭비되어,  full table  scan 등의  작업에 성능  악화만
초래하게 된다.

initrans값은 하나의 table에 대해서 동시에  처리하는 transaction의 갯수 이하로 지정하도록  한다. 해당
table에  대한  동시  transaction의  갯수만큼 initrans를  지정하면  앞에서  설명한  상황의 deadlock은
발생하지 않는 것이 보장되나 space를 고려할 때 그 보다는 약간 작게 하는 것이 일반적인다.

initrans는 table이나 index에  대해서 create나 alter문장시  지정, 변경이 가능하나,  alter의 경우 이미
확보된 block에는 영향을 미치지 못하므로 export/import를 이용하여 새로 지정하는 것이 필요하다.

다음에 scott.dept table에 대해서 예를 들었다. column정의 storage등은 임의의 값을 예로 사용한 것이며,
initrans도 예로 3을 지정하였다.

  os> exp scott/tiger file=test.dmp tables=dept

  os> sqlplus scott/tiger
  SQL> drop table dept;
  SQL> create table dept (deptno number(2), dname varchar2(10))
	   initrans 3
	   storage(initial 10m next 2m pctincrease 0);

  os> imp scott/tiger file=test.dmp tables=dept ignore=y




======================================================================
ORA-00210 : TABLE에 TRANSACTION이 종료되지 않은 경우
======================================================================

Sequent Symmetry  or NUMA-Q  platform의 Oracle  7.3.2, 7.3.3,  7.3.4 OPS  Product 설치  및 DB 생성후
Master node startup parallel 후 다른 node를 startup parallel 시 다음과 같은 현상이 발생할 경우.

◈ 현상
  SVRMGR> startup parallel

     ORACLE instance started.
     Total System Global Area     546275472 bytes
     Fixed Size                       39108 bytes
     Variable Size                210167756 bytes
     Database Buffers             327680000 bytes
     Redo Buffers                   8388608 bytes

  ORA-00210: cannot open control file '/dev/vx/rdsk/oracle/v_ctl1'
  ORA-07368: sfofi: open error, unable to open database file.
  SEQUENT DYNIX/ptx Error: 16: Device busy

  발생하면서 startup fail 발생

◈ 원인
  Sequent Symmetry or NUMA-Q platform이 very large file (O/S에서 2GB 이상의 file system 지원)을
  지원하기 위해  VLFS patch를  적용했거나 VLFS를   이미 지원하는  O/S Version일  경우 오라클  master
  node가 정상적으로  startup  되고  나서  다른  node가  startup  parallel이  될  때  먼저 startup 된
  master node가 shared disk 의 모든 오라클 관련 file을 none-shared mode로 open 하기 때문에 위의 현상
  이 발생됨

◈ 조치
  1) PTX/Cluster V1.3.2일 경우
     * Oracle  V7.3.x : O/S상에서 VLFS patch적용하지 않았을 경우는 관계 없으나, 이미 적용 되었다면
       추가적으로 O/S patch FP#23373 적용하여야 함
  2) PTX/Cluster running DYNIX/PTX 4.4.x 일 경우
     * Oracle V7.3.3 : 현재 fix된 patch는 없으며 다음과 같은 workaround 방법으로 해결이 가능함.

  (Workaround)
     $ORACLE_HOME/rdbms/lib/ins_rdbms.mk file에 아래의 추가된 부분만 삽입하여 오라클 kernel relink 실시
     (예:make -f ins_rdbms ioracle)
     oracle: $(ORALIBD) $(CORELIBD) $(NETLIBD) $(KSMS) $(CONFIG)
             $(PSOLIBLIST) opimai.o @$(ECHO) $(LINK) -o $@ $(LDFLAGS)
             $(LDFLAGS_ORA) opimai.o $(CONFIG) \r
             -llkseqora  ---> 추가된 부분
             $(LLIBSERVER) $(LLIBORA) $(LLIBKNLOPT) $(LLIBSLAX)
             $(LLIBPLSQL) \r
             $(LLIBSICX) $(LLIBSOWSUTL) \r
             $(LLIBSICX) $(LLIBSOWSUTL) \r

                ...........
                ...........

  * Oracle V7.3.4 :
    Oracle V7.3.4 일 경우는 문제가 없으나 patchset을 적용할 경우 V7.3.4.2에서는 V7.3.3과 같은
    방법으로 oracle kernel을 relink하면 문제가 해결됨.

======================================================================
ORA-00312, ORA-00313 : ONLINE REDO LOG CRASH
======================================================================

[ ONLINE REDO LOG가 손상되었을 때 DB에 OPERATION 이 없었던 경우는 다음과
같은 절차로 DB 을 OPEN 할 수 있다. - 확률 70% ]
-------------------------------------------------------------------------
1. CONTROLFILE 생성

-. 손상된 online log 는 포함시키지 않는다.
-. resetlogs option 으로 생성한다.
-. reuse option 은 생략하고 기존 controlfile 은 다른 이름으로 move 시킴.

<V7 에서 CONTROLFILE 생성하는 방법>
  sqldba> startup mount
  sqldba> alter database backup controlfile to trace;

  위와 같이 명령을 입력하면 ORACLE_HOME/rdbms/log 디렉토리에 트레이스 화일이다. 그 트레이스 화일에서
  create controlfile 명령부분을 남기고 삭제한다.

  (7.3 이상에서는 cd $ORACLE_HOME
                  cd ../../admin/SID dir/udump 에 있습니다)

콘트롤화일 생성 문장 예 - <cnt.sql> : GROUP 1 이 ONLINE LOG 라고 가정
--------------------------------------------------------------------------
 CREATE CONTROLFILE DATABASE 'RC722' RESETLOGS NOARCHIVELOG
 MAXLOGFILES 32        ********
 MAXLOGMEMBERS 2
 MAXDATAFILES 30
 MAXINSTANCES 8
 MAXLOGHISTORY 800
 LOGFILE
 GROUP 2 '/oracle/oracle/dbs/log2RC722.dbf' SIZE 5M,
 GROUP 3 '/oracle/oracle/dbs/log3RC722.dbf' SIZE 5M
 DATAFILE
 '/oracle/oracle/dbs/systRC722.dbf',
 '/oracle/oracle/dbs/rbsRC722.dbf',
 '/oracle/oracle/dbs/toolRC722.dbf',
 '/oracle/oracle/dbs/usrRC722.dbf',
 '/oracle/oracle/dbs/tempRC722.dbf',
 '/oracle/oracle/rcdata.dbf'
 ;

2.절차

$ sqldba lmode=y
 SQLDBA> connect internal
 SQLDBA> shutdown abort
 SQLDBA> startup nomount
 statement processed
 SQLDBA> @cnt
 SQLDBA> recover database using backup controlfile until cancel;
 ....
 ...
 CANCEL (Return)
 Recovery canceled
 SQLDBA> alter database open resetlogs;

 : 만일 정상적으로 open 되면 log file 추가
 SQLDBA> alter database add logfile '?/dbs/log1ORA722.dbf' size 1M;

======================================================================
ORA-00600 : BLOCK 손상 해결 방법
(ORA-600[3339], ORA-600[3398], ORA-600[4519], ORA-1578)
======================================================================

◈ 개요 
 블럭의 손상 원인은 여러가지가 있는데, 메모리내의 블럭이 손상된 경우와 디스크상의 물리적인 블럭이
 손상되는 경우가 있다.

 (1)  오라클  오류  블럭  손상과  관계된 오라클  오류는  internal error인  ORA-600중  첫번째 인수가
 3339,3398, 4519인  경우와 ORA-1578이  있으며, 이중  Ora-600[3398]은 메모리  블럭만 손상된 경우이고,
 ORA-1578은 물리적 블럭이 손상된 경우 발생한다. ORA-600[3339]와 ORA-600[4519]는 메모리와 디스크 손상
 모두가 연관될 수 있다. 각각의 오류에 대한 자세한 설명은 아래의 3번에서 기술하였다.

 (2) DBA (database address)  ORACLE 데이타  블럭은 블럭의 정보를 담은 Fixed Header를  갖고   있으며
 이 정보를 이용하여 각각의 블럭과  데이타베이스 전체의 INTEGRITY를 유지한다. DBA는  Fixed   Header의
 한  부분으로 32bit 길이의 정수이며  데이타베이스의 화일 번호와 파일에서 블록위치를  나타낸다.  블럭
 손상이  발생하면  오라클은 오류  메시지에  이 DBA를  나타내거나  파일 번호와  블럭  위치를
 십진수로 나타내기도 한다.

◈ 블럭 손상의 원인 
 오라클은 화일에 블럭을 읽고  쓸 때 lseek(), read(),  readv(), write(), writev()와 같은  OS의 system
 function  call을 이용한다.  블럭이 이러한  시스템콜을 이용하여  읽혀지거나 씌여진  후, 혹은  직전에
 오라클은 DBA에  대한 검사를  하여 블럭이  손상되었는지 확인하게  된다. 그러나  대개 블럭의 데이타가
 손상될 당시에는 그  사실이 드러나지 않다가  손상된 부분의 데이타가  사용될 때 비로소  손상된 사실이
 알려지게 되므로 대부분 블럭 손상은 OS나 HW에 의해 손상된 블럭을 이후 오라클이 사용하고자 검사하는
 과정에 발견하는 것이 대부분이다.

 블럭 손상이 야기될 수 있는 주된 상황은 다음과 같이 요약될 수 있다.

 (1) ORACLE 블럭내의 첫번째 OS 블럭이 디스크상의  문제로 해서 이상이 있는 경우, OS 또는  디스크 복구
  프로그램이 해당 블럭을 복구하려는 과정에서 블럭의 값이 모두 비정상적적으로 0이 되어 버릴 수 있다.

 (2) 매우 드문  경우이긴 하지만, 메모리상에서  이미 손상된 블럭을  디스크상에 그대로 기록하는  경우
  물리적 블럭의 DBA가 틀리게 된다

 (3)  블럭이   데이타  화일상에   기록될  위치를   잘못  찾아   손상이  발생하기도   하는데,  이러한
  경우를 'write blocks   out  of  sequence'  라고   불리운다. 이것은   ORACLE이  lseek()을  호출했을
  때 OS가 블럭을 잘못된 곳에 기록해서   생기는  경우가 많다.  이러한   예는 4.2G를  넘는 큰   화일을
  다룰 수  있는   기능을 제공하는  HW/OS의   경우  발생한다.   4.2G를   넘는  화일의  경우,    32bit
  unsigned number로 다룰   수 있는 범위를  벗어나기   때문에 OS는offset   값을  ORACLE이  사용할  수
  있도록 적절히 변환시켜야  한다. ORACLE은  OS의 지원  여부와  관계없이 2G  이상의  화일을  지원하지
  않으며 위와  같은  큰   파일을 다룰    수 있는   환경에서는 lseek()   시스템콜이 정확한   위치로의
  변환을 시켜주지 못함에 따라 보다 작은 크기의 화일에서도 문제가 발생하는 경우도 있다.

 (4) 네번째 원인은  I/O기능이 전혀 작동하지  않는 경우이다. ORACLE은  lseek(), read() 시스템  콜이
  리턴하는 에러 코드를 검사하며 read()가   읽어들인 바이트수가 BLOCK SIZE의 정수배인지를   검사한다.
  이 검사를   통과하면  ORACLE은  성공적으로  READ가   수행되었다고 가정한다.   만약  DBA가 정확하지
  않다고 체크되면 DATABASE에 대한 읽기 요구는 실패하기 때문에 실제의 블럭 읽기는 일어나지 않는다.

 (5)  다른  원인은  동일한  디바이스에서  다른 블럭을  읽어온  경우이다.  이것은  작업이  메우  바쁜
  디스크에서  발생하곤  한다.   어떤 경우에는   수백개  이상  떨어진  곳의   블럭을 읽어오는  경우도
  있다. 이러한 경우와 위의   (4)번의 경우에는 다시  한번  동작을 반복함으로써  문제는 해결  수 될 수
  있으며 이것은 일반적으로 ORACLE의 문제가 아니라 OS나 HW의 문제인 경우가 많다.

◈ 블럭 손상과 관계된 오류의 종류와 가능한 조치방법
 (1) ORA-600[3339] 
  ORA-600[3339]에러는  ORACLE이  직접  버퍼로  데이타를 읽어들일  때  읽은  블럭의  DBA (Data  Block
  Address)가 잘못되었음(INVALID)을  의미한다. 실제로  읽어들인 블록의  DBA와 ORACLE이  읽고자 하였던
  블럭의 DBA가  다르면 위에서와  같은 에러가  발생하며 주로  OS나 HW의  문제가 그 원인이 되는 경우가
  많다.  만약  메모리에  문제가  있다고  생각된다면  다음과  같은  Event  Parameter를  initSID.ora에
  추가함으로써 블록 검사를 할 수 있다. 이것은 ORA-600[3398], ORA-600[4519]에서도 마찬가지이나 이러한
  event를 사용하기전에 먼저 한국오라클에 지원을 요청하는 것이 바람직하다.

  event = '10210 trace name context forever, level 10'
  event = '10211 trace name context forever, level 10'

 ORA-1578이 함께  발생하는 디스크  블럭 손상이  발생하였다면, 아래의  (4)의 ORA-1578해결 방법과 같이
 조치 하면 된다.

 (2) ORA-600[3398]
  DBWR가 디스크에 데이타를  쓰기 전에 캐쉬에서  손상된 블럭을 발견하면  OERI(3398) 메시지를 출력하고
  인스턴스를 정지시킬 것이다. 따라서 문제의 블록은 디스크에 저장되지 않으므로, 실제 디스크상의  블럭
  손상은 야기시키지 않는다. 이때 DBA를 포함한 많은 인수들이 OERI(3398) 내부 에러 처리기에 전달되므로
  이것을 확인하여 한국 오라클에 지원을 요청한다.

 (3) ORA-600[4519] 
  메모리내의 블럭을 update/delete가 아닌 consistent  read를 위해 읽고자 할때 블록이  손상됨을 발견한
  경우, ORA-600[4519]가  발생한다. 이  오류는 메모리  손상과, 디스크  손상 모두의 경우 발생가능하며,
  오류가 발생하는 즉시 한국오라클에 지원을 요청하는 것이 바람직하다.

 (4) ORA-1578 ORA-1578 에러는 ORA-600[3339] 에러와 함께 발생하곤 하며 디스크상에 물리적으로  블럭이
  손상되었음을 의미한다. 이러한 디스크 블럭 손상의 복구방법을 살펴보자.

(a)손상된  블럭을  포함하고  있는  세그먼트  확인  ORA-1578  에러가  발생하면  Corruption이 발생한
  화일번호와 블럭번호를  알려준다. 여기서는  이 때의  파일번호를 f,  블럭번호를 b라고 부르기로 한다.
  우선 해야할 일은 어떠한 오브젝트가 Corrupt되었는가를 알아내는 것으로써, 다음의 스크립트를 이용하면
  알 수 있다.

 SQL> select  segment_name, segment_type
        from  dba_extents
    where  file_id = f
         and  b between block_id and block_id + blocks - 1;

(b) 해당 세그먼트가 인덱스이면 Drop 시키고 다시 생성하면 된다.

(c) 해당  세그먼트가 테이블이면  Corrupt 된  블럭의 데이타는  손상된 것이다.이렇게 테이블이 손상된
  경우, 만약  해당 테이블이 들어있는 엑스포트 화일이   있다면 손상 된 테이블을  Drop 시키고  임포트
  받는것이 제일  간단한 방법이다. 하지만 만약  엑스 포트 받은 화일이  없거나 백업해 둔 화일도 없다면
  해당 테이블에 인덱스가 생성되어 있는 경우에 한해서 다음의 방법을 사용해서 복구를 하도록 한다.

 예를 들어 다음과 같은 에러 메시지가 떨어졌다고 하자.
 01578, 00000, 'ORACLE data block corrupted (file # 10, block # 4)

<1> 먼저 (a)번의 script를 이용하여 손상된 블럭을 포함하는 세그먼트를 확인한다.
   SQL> select  segment_name, segment_type  
        from  dba_extents  
       where  file_id = 10
            and  4 between block_id and block_id + blocks - 1;

         SEGMENT_NAME        SEGMENT_TYPE
         ------------        ------------
             EMP                 TABLE

<2> Rowid를 이용하여 손상된 블럭내의 데이타를 찾아낸다.
 위의 결과값이 EMP table이 empno, ename,  deptno 를 컬럼으로 가지며, empno 컬럼에  인덱스가 생성되어
 있다고  하자.클러스터화되지  않은   모든  테이블은  유니크한Rowid를   가진다.  Rowid는  총   18자로
 블럭어드레스(8자), 점(1자),  로우 어드레스(4자),  점(1자), 화일  어드레스(4자)로 구성되어  있다. 이
 rowid를 이용하여 다음과 같이 손상된 블록에 있는 employee 에 대한 empno를 구할 수 있다. 이때 empno가
 char type 이라면 [where empno > 0] 대신 [where empno > ‘ ‘]를 사용하여 empno에 대한 인덱
 스를 사용하도록 유도한다. 

    SQL> select  empno  
           from  emp
          where  empno > 0 
            and  rowidtochar(rowid) like '00000004.%.000A';  

        EMPNO           ROWID  
    ------------  ------------------------------
        500      00000004.0000.000A
        501      00000004.0001.000A

<3> EMP 테이블과 같은 구조를 갖는 새로운 테이블을 만든다.
    SQL> create table temp 
             as select * from emp 
          where 1 = 2;  

<4> 손상된 부분을 피해서 새로운 테이블에 손상된 테이블의 데이타를 추가한다.
    SQL> insert into temp select * from emp where empno < 500; 
    SQL> insert into temp select * from emp where empno > 501;

<5> 손상된 테이블인 EMP테이블을 Drop시키고 Temp테이블의 이름을 EMP로 변경한다.
    그리고 백업된 자료나 문서자료를 통하여 손상된 부분에 대한 정보를 추가한다.
    SQL> drop table emp;  
    SQL> rename temp to emp;

<6> 손상된 블럭에 대부분의 로우가  존재하고 있다면 다음의 방법을 이용한다.
   SQL> create table empnos as  
         select empno from emp
         where empno > 0  
          and rowidtochar(rowid) not like '00000004.%.000A';

   이 스크립트를 이용하면 손상된  블럭에 포함되지 않은 empno 들을 알 수 있다.
   다음의 스크립트를 계속 실행시켜 복구를 한다.

    SQL> create  table temp  as select * from emp  where 1 = 2;
    SQL> insert  into temp
         select  emp.empno, emp.ename, emp.deptno
       from  emp, empnos
     where  emp.empno > 0
       and  emp.empno = empnos.empno;

<7>  만약  데이타  딕셔너리의  테이블이나 인덱스에서  손상된  블럭이  발생했다면  지원 을  요청해야
 한다

======================================================================
ORA-00604: 익스텐트가 가득 찬 경우
======================================================================

 이 에러는 내부적으로 SQL명령이 실행될 때 발생한다. 예를 들어 현재 할당된 익스텐트가 가득 차서  다음
 익스텐트를 할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여  SELECT명령을
 내리게 되는 것과 같은 경우이다.

 * 이 문제가 발생하면 우선 alert.log 화일을 검사하여 ORA-600 과 같은 에러가 발 생했는가를  확인한다.
 ORA-600 에러가 발생했다면 오라클측에 지원을 요청 하도록 하고 그렇지 않다면 다른 원인을 검사해 봐야
 한다.

 * 가장 먼저 고려할 사항은 init.ora 화일에 지정된 open_cursors의 크기를 알아보는  것이다.
 이 값이 설정이 안되어 있으면 Default가  50이므로 open_cursors=255 와 같이 설정하도록 한다.  이 값은
 단지 커서의 최대 값을 지정하는 것이므로 커서를  적게 쓰 는 프로그램에 아무런 영향을 끼치지  않는다.
 open_cursors를 변경하고 DB를 tdown 하고 Startup 시키면 된다.

 * 만약 이 방법으로  해결이 안되면 다음의 방법을  따른다. 정확한 에러의 원인을  찾기 위해서 init.ora
 화일에 다음과 같은 라인을 추가한다. events = '604 trace name errorstack' 이렇게 init.ora를 변경하고
 DB를 Shutdown 하고 Startup  하면 ORA-604 에러가 발생하는 경우에 자세한 정보를  Trace 화일에  기록해
 주므로 이 화일을 검사하여 에러의 원인을 찾을 수 있다.

 * 에러의 다른 원인으로는 init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS나 ROW_CACHE_ENQUEUES의  값
 이 너무 작게 설정된 경우를 생각해 볼 수 있다. 이와같은 경우는 이들 값을 크게 설정해 주도록 한다.

 * 테이블 스페이스가 가득 차거나 Extent  갯수의 최대 허용값을 초과해서 에러가 발생하는  경우 ORA-604
 에러가 함께 발생할 수가 있는데 이와같은 경우에는 이들 문제를 먼저 해결하면 ORA-604 에러는 함께 해결
 된다. 

======================================================================
ORA-01046, ORA-01050, ORA-01051 : CONTEXT SIZE & CURSORS
======================================================================

1. Context size 에 관련한 error message
.ora-1046 :can't acquire space to extend context area.
.ora-1050 :can't acquire space to open context area.
.ora-1051 :maximum context area extents exceeded.

2. Context size란 무엇인가?

(1) 쉽게 말하면 Cursor의 initial size이다 .
즉, Cursor 에 allocate 되는 user memory 이다.
(2) 이는 init.ora 의 CONTEXT_SIZE 에 의해 결정된다.
(3) Cursor 에 할당되는 additional space 는 CONTEXT_INCR 에 의하며 50 extents를 갖는다.
(4) Recommended context size 와 increment 는 4096 bytes(4K) 이다.
(5) SQL statement가 수행시마다 cursor 가 open 되며,같은 cursor가 reuse 되도록 design 되어 SQL*PLUS
    session은 2-3 개 이상 open 되어지지 않는다.
    그러나 SQL*FORMS 는 여러 다른 task 를 수행하므로 많은 cursor를 open한다. (100 or more)

(6)Cursor 가 hold 하는 item
* the SQL statement
* the parsed SQL statement
* one row of the result

3 ORA-1051 은 무엇이 문제인가?
(1) cursor 의 size 를 줄인다
(2) CONTEXT_SIZE,CONTEXT_INCR 를 늘린다.

4 OPEN_CURSORS 수를 줄이는 전략 .
(1) Commit을 자주한다.
(2) Synonym이나 view 를 사용하지 않음으로써 implicit cursor 수를 줄인다.
(3) SQL*FORMS 에서 select 문대신 #COPY 로 바꿔 사용한다.
(4) SQL*FORMS 에서 large forms를 여러개의 작은 forms 로 나눈다
(5) ASAP, EXEC SQL CLOSE C1; 을 수행한다.
(6) HOLD_CURSOR=NO &amp; RELEASE_CURSOR=YES 를 사용한다.

======================================================================
LK FILE에 대하여 (ORA-1102에 대한 원인 설명)
======================================================================

> Unix 용 Oracle7.3.3  이전의 version에서는 parallel  server mode(OPS)로 운용하지  않더라도 서로 다른
 ORACLE_SID를 이용하는  두개의 instance가  하나의 database를  동시에 mount하는  것이 경우에 따라서는
 가능할  수도  있었다 (<Bug:272030>).  이  경우, 서로  독립적인  두개의 instance가  동일한  database
 file들을 동기화  (synchronisation)없이 access할  수 있기  때문에 database  corruption을 유발시킬 수
 있었다.

 Unix system에서의 이러한 문제를 회피하기 위하여  7.3.3부터 'mount lock' file이 이용된다. 이  file은
 그 size가 0 byte, 생성되는 위치는 $ORACLE_HOME/dbs 이며 그 이름은 lk<DB_NAME> 이다.

 Oracle이 database를 mount할 때 lk<DB_NAME> file과 관련하여 다음과 같은 절차를 수행한다.

 1.  file name의  'DB_NAME' 부분은  db_name parameter를  이용한다. 예를  들어, db_name=V803  이라면
 사용되는 lock file의 위치와 이름은  '$ORACLE_HOME/dbs/lkV803'이 된다. 2. 만약 해당  file이 존재하지
 않는다면 생성한다. 존재한다면 file을 open한다. 3. 이 file에 exclusive Unix file lock을 설정한다.

 위의 과정 상에서 문제가  발생된다면 해당 instance는 db를  mount할 수 없으며 ORA-1102('cannot  mount
 database in exclusive mode')가 return된다.

 Releasae  7.3.3  이전에서는  동일한  $ORACLE_HOME, 동일한  db_name을  이용하는  두  개의 database를
 $ORACLE_SID만 다르다면 동시에 open하여 사용할  수 있었다. 그러나 lock file이  사용되는 7.3.3부터는,
 lock  file의 이름에  db_name이 이용되기  때문에 어느  한쪽의 db_name을  변경해야만 동시에  open하여
 사용할  수가  있다.(db_name의  변경은  controlfile을  재생성함으로써  가능하다.)  이렇게 database의
 db_name이 변경되면 각각의 lk<DB_NAME> file을 생성하여
이용하게 된다.


참고 사항
--------

1. database를 구동하고 있는 instance가 있을 때에는 lk<DB_NAME> file은
   삭제하지 않도록 한다.

2. database가 shutdown되더라도 lk<DB_NAME> file은 삭제되지 않고 존재한다.
   따라서 이 file의 유무를 가지고 database의 구동 유무를 판단할 수 없다.

3. lk<DB_NAME>의 DB_NAME은 SID와는 다를 수 있다. SID가 아닌 DB_NAME을 이용함에 주의.

4. lock file과 관련하여 다음의 error들이 발생될 수 있다.
   ORA-9992 scumnt: failed to open <FILENAME>
   ORA-9993 scumnt: failed to lock <FILENAME>
   ORA-1102 cannot mount database in exclusive mode

======================================================================
ORA-1118 조치 방법 : MAXDATAFILES와 DB_FILES PARAMETER
======================================================================

 테이블 스페이스를  만들거나 데이타  화일을 추가하다  보면 ORA-01118:  cannot add  any more database
 files: limit of XXX exceeded와 같은 에러가 발생하는 경우가 있다. 오라클의 데이타 화일의 최대 갯수는
 MAXDATAFILES와 DB_FILES 에  의해서 제한을  받는데 여기서는  이 에러를  해결하는 방법을  알아보기로
 한다.

  * 데이타베이스를  처음 만들  때 사용되는  CREATE DATABASE  명령에서 MAXDATAFILES  라는 파라미터를
 찾아볼 수 있다.  여기서 지정된 값(명시를  안하면 디폴트로 설정)은  콘트롤 화일에 기록된다.  이 값은
 데이타 베이스에  대해서 설정된  최대 데이타화일  갯수이다. 이  값을 변경하려  면 콘트롤 화일을 다시
 만들어야 한다. 

  * 한편, init.ora(UNIX에서는 init<SID>.ora, VMS에서는 <node>_<ora_sid>_init.ora)  에는 DB_FILES라는
 파라미터가 있는데 이 값은 해당 인스턴스에 대해서 지정된 최대 데이타화일 갯수이다. DB_FILES는 단순히
 에디터 상에서 init.ora 화일을 수정한 다음 에DB를 Restartup 하면 새로운 값이 적용된다.

 1. 왜 MAXDATAFILES 와 같은 한계값을 설정하는가?    
 * O/S는 오라클 화일의 갯수를 지정하기  위하여 특정한 갯수의 bit를 사용하며 이 값은 Platform에 따라
 다르다. MAXDATAFILES는 이 값의 영향하에 있게 된다. 일반적인 최대 값은 다음과 같다. 

 V6 V7
 UNIX 62 1022
 VMS  254 1022
 DOS  254 NA 
[참조]일부 유닉스 Platform상의 V7.0.16 이전 버전의 경우 1022보다 작은 경우도 있다.

2. 왜 MAXDATAFILES 값을 가능한 최대로 설정해 두지 않는가? 
  * MAXDATAFILES 를 크게 지정하면 그만큼 콘트롤 화일의 크기도 늘어나기 때문이다.

3. 왜 DB_FILES를 MAXDATAFILES 의 크기만큼 크게 설정해 두지 않는가? 
 * DB_FILES를 늘리면 각 User Process 에 할당되는 PGA(Program Global Area)의 크기가 커지기 때문이다. 

4. 사용하는 시스템의 MAXDATAFILES를 알 수 있는 방법은? 
  * 시스템에 따라서 다르므로 Installation Guide 를 참조해야만 한다. 

5. 콘트롤 화일의 위치를 아는 방법은? 
  * SQLDBA> show parameter control_files;
      또는 
   SQLDBA> select * from v$controlfile; (7.0.16 이상)
  위의 Query 를 이용하거나 $ORACLE_HOME/dbs/config.ora 화일을 보면 알 수 있다.

 [ORA-1118 해결방법] 
 * ORA-1118 에러는 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생한다. DB_FILES 값에 도달한
 경우라면 ORA-59 에러가  발생한다. ORA-59 에러는  init.ora 의 DB_FILES  를 늘려주고 DB  를 Restartup
 하면 해결 되지만 ORA-1118 에러는 이와같이  간단하게 해결되지는 않는다. 다음과 같은 방법이  있다. 
 
 1. 여러개의 데이타화일로 구성된 테이블 스페이스가  있으면 이를 Export 받고 테이블 스페이스를 Drop한
 다음 하나의 큰 데이타화일을 갖도록 테이블 스페이스를 만들고 Import를 한다.  
 
 2. V6.0.33 이전 버젼을 사용중이라면 MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며  그 이후 
 버전을 사용중이라면 콘트롤 화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다.

 <V7에서 콘트롤화일을 만드는 방법>
 * DB가 mount 또는 open 된 상태에서
  SQLDBA>alter database backup controlfile to trace;  
 와 같은 명령을 내리면 <user_dump_dest>에 지정된  디렉토리에 트레이스 화일이 하나 생긴다. 이  화일을
 찾으려면  해당 디렉토리에서  가장 최근에  생긴 트레이스  화일을 찾으면  된다. 
 
 * 이 화일을 다른 이름으로   복사한 다음   에디터로 열어서   CREATE CONTROLFILE 명령부분 외의 불필요
 한 부분은  지우고 MAXDATAFILES를  늘려  준다. 이  화일의  이름을 newctl.sql로  하기로 한다. 
 
 * DB를 NORMAL 또는 IMMEDIATE로 Shutdown하고, 콘트롤 화일 생성시 DB 영향을 줄 수 있기 때문에 만약을
 위해서 DB 전체를 백업 받도록 한다. 
 
 * 현재 사용중인 콘트롤 화일을 다른 이름으로 옮기고 다음을 실행한다. 

 SQLDBA> startup nomount  
 SQLDBA> @newctl  
 SQLDBA> alter database open noresetlogs;

 * 이제 필요한 모든 작업은 끝났지만 여기서 다시 한번 Full Bakcup 을 받는 것이 좋다.

[ 참고 ]  다음은 콘트롤 화일을 생성하는 명령의 예이다.

 SQLDBA> CREATE CONTROLFILE
      DATABASE ORACLE
      LOGFILE '/users/oracle/dbs/log1ORACLE.dbf',       
                 '/users/oracle/dbs/log2ORACLE.dbf',       
                 '/users/oracle/dbs/log3ORACLE.dbf'   
         NORESETLOGS  
         DATAFILE '/users/oracle/dbs/systORACLE.dbf',       
                  '/users/oracle/dbs/rbsORACLE.dbf',       
                  '/users/oracle/dbs/tempORACLE.dbf',       
                  '/users/oracle/dbs/toolORACLE.dbf',       
                  '/users/oracle/dbs/usrORACLE.dbf'
         MAXDATAFILES 121;
</p>
<p align="right"><A target='_blank'  class='con_link' href="#top"><img src="../images/top.gif" width="33" height="37" border="0"></a></p>
</td>
</tr>

<tr>
<td width="578">
<p>
======================================================================<br />
<b><A target='_blank'  class='con_link' name="ORA-01157">ORA-01157</a>,
<A target='_blank'  class='con_link' name="ORA-01110">ORA-1110</a></b>
:OS 명령으로 DATAFILE을 삭제한 경우<br />
======================================================================<br />
</p>

<PRE><XMP>
 DATABASE RECOVERY에 앞서  ORACLE INSTANCE(즉, ORACLE  RDBMS)의 STARTUP단계를 우선  살펴보기로 하자.
 첫번째 단계로 INSTANCE를 START시키며,  여기서는  initORACLE_SID.ora 화일의 파라미터를 참조하여 SGA
 (SYSTEM GLOBAL AREA)를 할당하고 백그라운드 프로세스를 START 시킨다. 두번째 단계로 DATABASE의 MOUNT
 이며 파라미터 화일에 명시된 CONTROL  FILE을 오픈한다. CONTROL FILE로부터 DATABASE  NAME과 REDO LOG 
 FILE의 이름을 읽는다.
 세번째 단계로 CONTROL FILE 내의 정보를 이용하여 모든 데이타 파일을 오픈한다.

 SVRMGR> CONNECT INTERNAL;
 Connected.
 SVRMGR> STARTUP;
 ORACLE instance started.
 Database mounted.
 Database opened.
 Total System Global Area 1913196 bytes
 Fixed Size 27764 bytes
 Variable Size 1787128 bytes
 Database Buffers 65536 bytes
 Redo Buffers 32768 bytes

 RDBMS의 STARTUP시 문제의 데이타 화일이 CONTROL FILE 정보에서는 존재하지만, 실제로 O/S상에서는 존재하
 지 않으므로 DATABASE OPEN 단계에서 삭제된 데이터 화일을 OPEN할 수 없다. 따라서 다음과 같은 데이타 화
 일 오픈에 관련된 에러가 발생된다 :

 SVRMGR> STARTUP;
  ORACLE instance started
  Database mounted
  ORA-01157 : cannot identify data file 11 - file not found
  ORA-01110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
  Attempting to dismount database .... Database dismounted
  Attempting to shutdown instance .... ORACLE instance shut down

 DATABASE OPEN단계에서 CONTROL FILE에서는 ORA-1157에러에서 나타난 11번  데이타 화일이 존재하는 것으로 
 인식하지만, 실제로 O/S상의 데이터 화일 (ORA-1110에러에 명시된 '/user1/oracle7/dbs/user2.dbf' 파일)이
 삭제된 상태이다.

 이러한  경우에는  DATABASE  STARTUP 시  STARTUP  MOUNT  단계까지 실행한  후,문제의  데이  터 화일을
 OFFLINE시킨 다음 데이타베이스를 오픈한다. 단, 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한
 데이타 파일을 포함하고  있는 TABLESPACE를 DROP하지  않을 경우에는 DATABASE  STARTUP 시 항상  데이타
 파일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의 DROP 전에
 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

 데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
 먼저 SVRMGR을 Line Mode로 기동시킨다.

 $ svrmgrl
 SVRMGR> CONNECT INTERNAL;
 SVRMGR> STARTUP MOUNT;
  ORACLE
  instance started.
  Database
  mounted.

 SVRMGR> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf' OFFLINE DROP;
  Statement processed.

 SVRMGR> ALTER DATABASE OPEN;
  Statement processed.

 SVRMGR> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
  Statement processed.

 (이와 같이 offline  drop된 datafile을 포함하는  tablespace는 drop하여야 한다.  이 tablespace에 다른
  datafile도 포함되어 있다면 export를 받아낸 후 tablespace를 drop하고 재 생성 후 import하도록 한다.)

 정상적으로 DATABASE가 Open된 후 CONTROL FILE로부터의 데이타베이스 정보를 갖는 DATA DICTIONARY TABLE
 인 V$DATAFILE(SYS USER에서 액세스 가능)의  내용과 데이타베이스 화일에 관한 정보를  가지고 있는 DATA 
 DICTIONARY VIEW인 DBA_DATA_FILES(SYSTEM USER)을 조회하면 아래와 같은 내용을 확인할 수 있다 :

(1) SQL> SELECT * FROM V$DATAFILE ;
    FILE#   STATUS                 NAME
    -----  --------   --------------------------------------
      9     ONLINE      /user1/oracle7/dbs/tools.dbf
      10    ONLINE      /user1/oracle7/dbs/user1.dbf
      11    RECOVER     /user1/oracle7/dbs/user2.dbf

(2) SQL> SELECT * FROM DBA_DATA_FILES ;
          FILE_NAME              FILE_ID     TABLESPACE_NAME STATUS
   ----------------------------  --------   --------------------------
   /user1/oracle7/dbs/tools.dbf    9         TOOLS AVAILABLE
   /user1/oracle7/dbs/user1.dbf    10        TEST AVAILABLE
   /user1/oracle7/dbs/user2.dbf    11        TEST AVAILABLE

====================================================================== ORA-01403 조치 방법 : EXPORT 실행시 ======================================================================

 EXPORT 실행시 ORA-1403이 발생되는 경우가 있는 데,  이 에러는 테이블 혹은 인덱스에 문제가 있는  경우
 발생할 수 있다. 여기서는 ROWID를 사용하여 테이블을 복구시키는 방법을 소개한다.

1. 기존 테이블과 같은 구조를 갖는 테이블을 만든다.

SQL> CREATE TABLE TEMP 
2>   AS SELECT  * 
3>        FROM EMP 
4>       WHERE 1=2; 

2. 기존 테이블에서 RECORD를 FETCH하여 새로운 테이블에 입력.
이 때, INDEX가 설정되어 있는 COLUMN을 WHERE 조건에 부여함. 

<CREATE.SQL>
 declare 
 row_id char(18); 
 cursor c1 is select rowid 
                from emp 
               where empno > 0; --empno에 index 
 begin 
   open c1; 
   loop 
     fetch c1 into row_id; 
     insert into temp select * from emp where rowid=row_id; 
     exit when c1%notfound; 
   end loop; 
 end; 
/ 

3. create.sql file실행 
sql> @create
</XMP</PRE>

<p align="right"><A target='_blank'  class='con_link' href="#top"><img src="../images/top.gif" width="33" height="37" border="0"></a></p>
</td>
</tr>


<tr>
<td width="578">
<p>
======================================================================<br />
 <b><A target='_blank'  class='con_link' name="ORA-01547">ORA-01547</a></b>
조치방법 :ORACLE 블럭을 할당받지 못할 경우<br />
======================================================================<br />
</p>

<PRE><XMP>
 ORA-1547 에러 발생의 원인으로는,  TABLESPACE가 에러에 명시된 만큼의  연속된 ORACLE BLOCK 수의  FREE
 SPACE를 갖고있지 못해서 새로운 EXTENT를 할당하지 못 하기 때문이다.

 ORA-1547 에러는 일반적으로 다음과 같은 과정에서 발생할 수 있다. 

 1) 데이타 INSERT나 UPDATE시 DATA SEGMENT가 차지하게될 연속적인 ORACLE 블럭을 할당 받지 못할  경우에
 발생한다. 

 2) 인덱스를 생성할 경우에 발생한다. -  ROLLBACK SEGMENT가 사용할 RBS 또는 USER  TABLESPACE의 영역이
 부족 하여 발생할 수 있다. -  인덱스 생성시 SORT 영역으로 사용되는 TEMPORARY  TABLESPACE내의 SPACE의
 부족 으로 발생할 수 있다. 

 3) SQL*FORMS30, SQL*REPORTWRITER등의 프로그램을  데이타베이스에 [SAVE]시 관련 테이  블들을 포함하고
 있는 SYSTEM 또는 TOOLS TABLESPACE등의 영역이  부족한 경우에 발생 된다. 이러한 경우  EXTENT에 관련된
 DATA DICTIONARY VIEW인 USER_TABLES, USER_EXTENTS, USER_SEGMENTS와 DBA_FREE_SPACE등을 조회해서  관련
 내용을 확인한다. 예를 들어, 데이타 INSERT시 ORA-1547  : Failed to allocate extent of size  'num' in
 tablespace 'TOOLS' 에러가 발생될 경우를 고려해 보자. 

1) [USER_TABLES]에서 INSERT에 관련된 테이블의 NEXT_EXTENT 크기를 확인한다. 
SQL> SELECT  initial_extent, next_extent, pct_increase, min_extents, max_extents
       FROM  user_tables 
      WHERE  table_name = 'EMP'; 

 INITIAL_EXTENT   NEXT_EXTENT   PCT_INCREASE   MIN_EXTENTS   MAX_EXTENTS 
----------------  -----------  -------------- ------------- ------------- 
     10240          190464           50            1            121

(A) 
(A) : 다음에 할당되는 EXTENT의 크기를 나타내며 BYTES 단위이다. 
2) [DBA_FREE_SPACE]에서 현재 TABLESPACE에 존재하는 FREE SPACE 중 가장 큰 연속된 영역을 확인한다. 

SQL> SELECT  MAX(bytes) MAX_CONTIGUOUS_SPACE 
       FROM  dba_free_space 
      WHERE  tablespace_name = 'TOOLS'; 

     MAX_CONTIGUOUS_BYTES 
    ----------------------
          19730432 
(B) 

(B) : 현재 TABLESPACE에 남아있는 FREE SPACE 중 가장 큰 연속된 영역으로 BYTES 단위로 나타난다. 

3) 위에서 살펴본바와 같이 2)-(B)의 MAX(BYTES) 크기가 1)-(A)의 NEXT_EXTENT 크기보다 작기 때문에 
   ORA-1547이 발생하게 되는 것이며 이를 해결하는 방법으로는 다음의 몇 가지가 있다. 

① 최소 1)-(A)의 NEXT_EXTENT크기 이상의 데이타 화일을 'TOOLS' TABLESPACE에 추가한다.
  ALTER TABLESPACE tools ADD DATAFILE *file_name* SIZE integerM ; 

② TABLE의 STORAGE  PARAMETER에서 INITIAL EXTENT,  NEXT EXTENT의 크기를 조정하여 TABLE을 재구축할 수 
 있다.  즉, TABLE의 STORAGE PARAMETER 중에서 NEXT를 현재 TABLESPACE에 남아있는 FREE SPACE 중 가장 큰 
 연속된 영역( DBA_FREE_SPACE의 MAX(BYTES))보다 작게 변경할 수 있다. 
  SQL> ALTER TABLE emp STORAGE ( NEXT 100K ); 

③ 다음으로는 관련 TABLESPACE내의 OBJECT들을 EXPORT후 TABLESPACE를 재생성하고 IMPORT하여 DISK 
 FRAGMENTATION을 없애서 결과적으로 해당 TABLESPACE에 활용공간을 확보할 수 있다.

======================================================================
ORA-01552 조치방법 : SYSTEM ROLLBACK SEGMENT를 사용할 경우
======================================================================

<PRE> 본 내용은 ORACLE 7.3 이전의 VERSION에 해당하는 내용입니다. SYSTEM ROLLBACK SEGMENT 는 SYSTEM TABLESPACE에서 발생하는 ROLLBACK 정보들만을 가질수 있으므로, SYSTEM TABLESPACE 이외의 TABLESPACE에 대해서 발생하는 OPERATION (TABLE의 생성 등)을 위하여 SYSTEM ROLLBACK SEGMENT를 사용할 경우에는 ORA-1552가 발생한다. ORA-1552 발생 원인을 해소하기 위해 우선, SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 임시로 추가한 다음, NON-SYSTEM TABLESPACE에 ROLLBACK SEGMENT를 생성하고, 다른 데이타베이스 오브젝트(TABLE등 )를 생성하는 작업을 진행하여 이들 NON-SYSTEM TABLESPACE의 ROLLBACK SEGMENT를 이용하도록 유도한다. CREATE ROLLBACK SEGMENT 문에서 PRIVATE/PUBLIC으로 ROLLBACK SEGMENT를 생성한 후, ORACLE 데이타베이스를 SHUTDOWN, STARTUP 한다. PRIVATE으로 생성된 ROLLBACK SEGMENT는 INITSID.ORA 화일의 'ROLLBACK_SEGMENTS' PARAMETER에 등록한다. 1) SQLDBA> CONNECT INTERNAL; 2) SQLDBA> CREATE ROLLBACK SEGMENT r0 TABLESPACE SYSTEM ; 임시로 사용할 ROLLBACK SEGMENT를 SYSTEM TABLESPACE에 생성 3) SQLDBA> ALTER ROLLBACK SEGMENT r0 ONLINE ; 생성한 ROLLBACK SEGMENT를 ONLINE시킨다. 4) SQLDBA> CREATE ROLLBACK SEGMENT r1 TABLESPACE rbs ; 계속해서 사용할 ROLLBACK SEGMENT를 NON-SYSTEM TABLESPACE에 생성한다. 5) $ORACLE_HOME/dbs/initSID.ora 화일의 'ROLLBACK_SEGMENTS' PARAMETER에 생성된 ROLLBACK SEGMENT 이름을 등록한다. 6) ORALCE 데이타베이스를 SHUTDOWN 및 STARTUP을 수행한다. SYSTEM TABLESPACE에 임시로 추가해 주었던 ROLLBACK SEGMENT는 NON-SYSTEM TABLESPACE의 ROLLBACK SEGMENT를 생성하기 위해 필요한 것이었으므로 작업이 끝난 후 DROP한다. SQLDBA> ALTER ROLLBACK SEGMENT r0 OFFLINE ; SQLDBA> DROP ROLLBACK SEGMENT r0 ;

======================================================================
ORA-01555 : Rollback segment의 정보가 다른 transaction에 의해 overwrite된 경우
======================================================================

 변경을 일으킨 트랜잭션 슬롯이 재사용되었을 때, 롤백 세그먼트의 이전 이미지가 다른 트랜잭션에 의해 겹
 쳐 쓰여졌을때, 01555, 00000, 'snapshot too old: rollback segment number %s with name '%s' too small'
 // *Cause: rollback records needed by a reader for consistent read are
 // overwritten by other writers
 // *Action: Use larger rollback segments
 ORA-1555가 발생하는 원인은 여러가지가 있지만 기본적으로는 사용자가 필요로 하는 롤백 세그먼트의 정보가 
 다른 트랜잭션에 의해 overwrite되어, 존재하지 않을 때 발생한다.  

 이 문서를 읽기 전에 기본적으로 알아야 하는 오라클의 read consistency와 관련된 다음 내용들은 이 문서의 
 마지막에 별첨으로 용어 및 개념에 대해 설명하였으므로 참고할 수 있다.  
  (1)  SCN (System Change Number)  
  (2)  statement-read level read consistent  
  (3)  read consistent snapshot  
  (4)  rollback segment의 wrap around/overwrite  

 ORA-1555에  관한  자세한  설명에  앞서,  데이타 블럭과  롤백  세그먼트  사이의  구조에  대해 간단히
 알아보도록 한다. 데이타 블럭 헤더에는, 이  블럭내에 포함된 데이타를 변경한 트랜잭션의 정보와,  롤백
 세그먼트내의 해당 active transaction을 가리키는 영역이 존 재한다. 롤백 세그먼트는 세그먼트의 첫번째
 블럭을 헤더 블럭으로 사용하는데, 그 안에 이 롤백세그먼트를 최근에 사용한 트랜잭션들의 정보와,  undo
 record들이 저장되어 있는 롤백 세그먼트내의 주소가 저장되어 있는 트랜잭션 테이블이 포함되어 있다.  

 다음 예의 그림을 통해 다음과  같은 사항을 알 수 있다.   
 (1) 데이타 블럭 500번지의 row 2를  변경한 xid1 트랜잭션은 아직 commit되지 않은 상태이다.    
 블럭의 헤더에는 트랜잭션이 아직 cimmit되지 않았다는 정보와 5번 롤백 세그먼트 헤더내의 3번째 엔트리에
 트랜잭션의 정보와, undo record를 얻을 수 있는 자세한 정보가 있음을 알려준다.   
 (2) 롤백 세그먼트 5번의 3번째 슬롯은 이 트랜잭션이 변경한 undo record가 롤백 세그먼트내의 7109번지에 
 저장되어 있음을 나타낸다. 2,4,nn번 엔트리의 경우는 이미 트랜잭션이 commit되었으므로, 다른 트랜잭션이 
 이 엔트리를  overwrite 할 수 있다.  
 (3) xid1트랜잭션에 의해 변경된 undo record가 포함되어 있는 6900, 7109블럭은 link로 연결되어 있어 xid1 
 트랜잭션이 변경한 모든  record들의 before image를 구성할 수 있다. ORA-1555가 발생하는 주요 원인과, 이 
 오류 발생을 최소화할 수 있는 방법은 다음과 같다. 

1. 데이타베이스에 변경을 가하는 트랜잭션은 많고, 롤백 세그먼트는 크기도 작고, 갯수도 적은 경우  
다음과 같은 상황을 가정할 수 있다.  

 (1) 약 30분이 걸려서 A 테이블의 대부분을 읽어야 하는 긴 query 하나를 수행시켰다. 
 이때의 SCN이 10이었다. 
 (2) 위의 query가 결과값을 찾고 있는 동안, xid1 트랜잭션은 A 테이블에 대해서 update 작업을 수행하고 
 commit하여 A table이 저장되어 있는 블럭 중 하나인  500번지 블록의 SCN이 20으로 변경되었다  
 (3) query가 진행중인 동안 매우 많은 트랜잭션들이 database를 변경하고 commit하였다.
 (4)  이 query가 500번지 블럭을 읽고자 할 때 SCN이 20임을 확인하고, xid1 트랜잭션에 의해 변경된 undo 
 record를 찾기 위해 롤백 세그먼트를 참조하였다.  
 (5)  그러나 xid1  트랜잭션은 이미  commit된 상태이고,  query가 진행되는  동안 매우많은  트랜잭션이
 데이타베이스 변경작업을 수행한 결과 롤백 세그먼트내의 xid1 트랜잭션의 undo record가 저장되어 있는 
 블럭이 다른 트랜잭션들에 의해 overwrite 된 상태였다.
 (6) ORA-1555가 발생한다.

해결 방법:  
(1) 롤백 세그먼트의 크기를 크게 하고 갯수를 늘리면, 롤백 세그먼트가 wrap around /overwrite되는 주기가 
늦추어진다.  
(2) 트랜잭션의 수행이 많은 때에는 수행시간이 오래걸리는 query문은 수행시키지 않도록 한다.

2. fetch across commit  
 프로그램내에서  cursor를  선언하고  loop를  수행하면서  fetch하고  데이타를  변경하는  경  우  많은
 프로그래머들은 롤백 세그먼트의 사용량을 줄이기 위해서 매 loop시마다 commit 을 한다. 그러나 cursor의
 loop내에서 commit하는 것은 ANSI standard에서는  제공하는 것이 아니며, ORA-1555를 발생시킬  가능성이
 있다.  

 ORA-1555가 발생하는 경우는 (1)의 경우와 유사하다.  cursor는 선언하고, open시에 데이 타를 읽는  것이
 아니고  fetch  때마다 읽게  되므로  fetch를 수행하는  것은  long query를  시작하는  것과 같다.  즉,
 fetch문의 loop를 수행하는 동안, 처음 fetch문  수행시점의 SCN보다 작거나 같은 SCN의 데이타를  읽어야
 한다. 그런데  loop 수행시마다  데이터를 변경하고  commit하게 되면,  commit한 block의 SCN은 증가되고
 변경된 정보도 다른 트랜 잭션에 의해 재사용되어질 수 있다. 이렇게 블럭은 변경되었으나, 변경된 정보가
 이미 다른 트랜잭션에 의해 overwrite된 블럭의 데이타를 fetch하고자 하면, 오라클은 read consistent 
 snapshot을 구성할 수 없게 되므로 ORA-1555가 발생하게 된다.  

해결 방법:  
 (1) cursor내에서  commit하는 횟수를  줄인다. 예를  들어 첨자를  이용해 5만건에  한번씩 commit할  수
 있으며, 이렇게 되면 5만건의 데이타를 저장할 수 있는 큰 롤백 세그먼트가 있어야 한다.  
 (2) cursor 선언시 구성될 active set의 범위를 줄인다. 즉 한번에 모든 데이타를 읽어 처리하기 보다는, 
 where절을 이용하여 데이타를 나누어, 여러번에 걸쳐 수행한다.  
 (3) 1번의 경우와  마찬가지로,  commit된 정보가  overwrite되는 주기를 늦추기  위해서 롤백 세그먼트의
 갯수를 증가시키고 그 크기도 크게하면 도움이 된다.  

3. delayed block clean out  
 오라클은 기본적으로  transaction이 commit하면,  fast commit을  수행한다. 즉,  트랜잭 션이  데이타를
 변경시키고 commit하면, 변경된  데이타 블럭의 header부분에  트랜잭션이 commit되었음을 기록하는  것이
 아니고  일단 롤백세그먼트의  헤더부분에만 commit되었음  을 기록한다.  이후 그  데이타 블럭을  다른
 트랜잭션이 access하게 되면,  그때 롤백 세그  먼트의 정보를 이용하여  데이타 블럭에 commit된  상태를
 반영하여 clean  out시키는 것을  delayed block  clean out이라고  한다. 이  delayed block clean out이
 어떻게 ORA-1555를 발생하게 되는지 다음의 상황을 살펴보면 된다.  

 (1)  다음과 같은 초기 상태를 가정할 수 있다. 500번지 데이타 블럭의 데이타를 변경하는 트랜잭션은 존재
  하지 않고, rollback segment 5번 header의 3, 4, nn번째 트랜잭션 엔트리는 다른 트랜잭션에 의해 재사용
  되어 질수있다.  
 (2) xid1 트랜잭션이 update문을 이용하여 500번지 데이타 블럭의 2번째 데이타를 변경 하였다.   500번지
 데이타 블럭의 헤더에는 xid1 트랜잭션의 정보가 저장되고, 롤백 세그먼트 5번의 트랜잭션 슬롯 3 (5,3)을
 가리키게 된다. COMMITTED로 표시되었던 트랜잭션 슬롯 3번은 이제 ACTIVE 상태로 변경되었다.  

(3) xid1 트랜잭션이 commit을 수행하였다.  
 오라클은 롤백 세그먼트 헤더의 트랜잭션 테이블에서 xid1 트랜잭션의 정보를 찾아서 commit되었다고 기록
 하였다. 그러나 500번지 블럭의 헤더에는 commit  되었다는 정보를 기록하지 않는다. (fast commit)  
(4)  데이타베이스에 변경을 가하는 매우 많은 트랜잭션이 수행되었다.  
 매우 많은 트랜잭션이 수행되어 롤백 세그먼트 헤더내에 있는 트랜잭션 테이블의 엔트리가 대부분 재사용되
 었다. 트랜잭션  xid50이 롤백  세그먼트 5번의  3번째 슬롯이  COMMITTED로 표시되어  있으므로, 비어있는 
 엔트리로 인식하여 xid50에 관한 정보를 저장하였다.  

(5) 다른 트랜잭션이 데이타 블럭 500번지를 방문하였다.  
 새로운  트랜잭션인 xid70   트랜잭션이 500번지  블럭을 읽고자  하였다. (3)번의  그림 에서 보듯이,
 500번지 블럭 헤더에는 아직 commit되지 않은 트랜잭션이 이 블록을 변경하였으며, before image를 구성할
 수 있는 정보가 롤백 세그먼트 5번, 엔트리  3번에 있음을 나타낸다. 그러나 5번 롤백 세그먼트  헤더내에
 있는 트랜잭션 테이블의 3번 슬롯은 xid1번이 아닌 xid50번의 정보가 저장되어 있다. 즉, delayed block 
 cleanout이 이루어지기 전에 롤백 세그먼트 헤더가 overwrite 된 것이다.  
(6) xid7 트랜잭션은 read consistent snapshot을 구성할 수 없으므로 ORA-1555가 발생한다.  

해결 방법:  
 (1) ORA-1555를 발생시킬 상황 이전에 읽고자 하는 테이블에 대해 full scan을 실시한 다면, 롤백 세그먼트
 안의 정보가 overwrite되기 전에 delayed block cleanout이 이루어지도록 할 수 있다.  
 (2) 1 ~ 4번의 모든 원인에 대해서 롤백 세그먼트를 크게 유지하면, 롤백 세그먼트의 정보가 overwrite되는
 주기를 늦출 수 있어 ORA-1555를 피하는데 도움이 될 수 있다.

 4.  OPTIMAL  크기가 아주  작을  때 롤백  세그먼트는  트랜잭션의 사용에  의해  한번 크기가  늘어나면
 기본적으로 그 롤백세그먼트를 지우고 다시 만들기 까지는 크기가 줄어들 지 않는다. 그러나 optimal size
 를 지정하게 되면, 롤백 세그먼트에서 새로운  extent 를 요구하는 시점에, 현재 할당된  롤백 세그먼트의
 크기와  optimal에 지정된  크기를 비교하게  된다. 할당된  공간이 optimal  크기보다 큰  경우, 할당된
 extent중 active  한 트랜잭션이  사용하고 있지  않은 extent들은  release시켜, 롤백  테이블스페이스의
 공간으로 환원된다.   그러므로 이  optimal size가  지나치게 작다면,  트랜잭션이 commit되자마자 롤백
 세그 먼트내의 정보는 잃게 될 것이다. 그러나, 위의 1 ~ 4번에서 살펴보았듯이 이미 commit된 트랜잭션의
 정보라 하더라도 이후에 필요하게  되는 경우가 발생하므로 이렇  게 빈번히 commit된 트랜잭션의  정보가
 포함되어 있는 롤백 세그먼트의 extent를 release시키는 것은 바람직하지 않을 수 있다.  

해결 방법:  
 (1) optimal을 지정할 때는 20개의 extents정도의 크기정도로 지정하는 것이 적당하며, 그것보다 더 작게 
 지정하지 않도록 한다.  
 (2) 롤백 세그먼트를 많이 필요로 하는 batch job의 경우 
   set transaction  use rollback  segment rollback_segment_name 
 구문을 이용하여 특정 롤백  세그먼트를 사용하게 하고 나머지 롤백  세그먼트들은 OLTP job이 사용하도록 
 한다.
 이렇게  하면 OPTIMAL을 지정하지  않아도 모든 롤백  세그먼트가 불필요하게 확장되는 일을 막을 수 있다.  

별첨: 용어 및 기본 개념 설명-----------------------------------------------------
 (1) SCN(System Change Number)  
 오라클은 특정한 시점의 데이타베이스 상태를  SCN으로 관리한다. 트랜잭션이 commit 되면,  SCN은 최근의
 SCN보다 크고 유일한 값이 할당되며, 이 값은 그 트랜잭션이 변경시킨 블록에 반영되고, 그 데이타화일의 
 가장 최근의 SCN은 데이타화일의 헤더 (header)에 기록된다.

 (2) statement-level read consistent  
 하나의 query는 그 query가 시작되어 데이타를  읽기 시작하면, 모든 데이타를 읽어 query가  끝날 때까지
 일관된 상태를 유지한다. 즉 query가 진행되는 동안 다른 트랜잭 션이 읽고자하는 데이타를  변경하더라도
 그 query는  변경 이전의  데이타 값을  읽게 된다.   데이타들이 query가  시작될 때와 같은 시점인지는
 SCN을 통해 관리된다. 즉 SCN이 10인  상태에서 query가 시작되었다면 query가 진행되는 동안  항상 SCN이
 10이하  상태의  데이  타만을  읽게되며,  이것은  롤백  세그먼트(rollback  segment)를  이용하여 read
 consistent snapshot을 구성함으로써 가능하다.  

(3) read consistent snapshot (read consistent view)  
 트랜잭션이 변경작업을 수행할 때 마다, 오라클은 변경 작업이 이루어지기 전의 before image(snapshot)을
 롤백 세그먼트에 저장해둔다.  한 트랜잭션이 commit되기  전에 변경된 데이타를  다른 트랜잭션이 읽거나
 수정하고자 한다면, 롤백 세그먼트의 정보를 이용하여 read consistent snapshot을 구성한 후 이 데이타값
 을 이용하여 operation을 수행한다. 또한 (2)에서 설명한 statement-level read consistent를 이루기 위해
 서도 query가 진행되는동안 읽고자 하는 블럭의 SCN이 증가하면, 롤백 세그먼트의 정보를 이용하여 원하는
 SCN상태의 read consistent snapshot을 구성한 후 데이타를 읽게 된다.  

(4)  rollback segment의 wrap around/overwrite  
 롤백 세그먼트는 하나의 롤백 세그먼트를 여러개의 트랜잭션이 함께 사용하며, 하나의 extent도  여러개의
 트랜잭션이 동시에  사용가능하다. 단  각 블럭은  하나의 트랜잭션에  할당된다. 트랜잭션들이 사용 중인
 extent에 정보를  저장하고 다음  extent가 필요하면,  해당 롤백  세그먼트에 이미  할당되어 있는  다음
 extent가 active한 undo 정보를  가지고 있는지를 검사한다. active한  undo 정보를 담고 있지  않은 다음
 extent가 current extent가 되며,  트랜잭션들은 이 extent에 undo  image를 저장한다. 할당된 맨  마지막
 extent를 확인하게 되면, 다시 첫번째 extent부터 extent로 돌아와 다시 사용하는 것을 wrap  around라고,
 모두  commit된 트랜잭션의  정보만 담고  있는 extent는  overwrite된다. 이렇게  롤백 세그먼트의  undo
 image를  담고있는   블럭뿐  아니라   롤백  세그먼트   헤더내의  트랜잭션   테이블의  엔트리도  wrap
 around/overwrite될 수 있다. 트랜잭션 테이블은  고정된 수의 엔트리를 가지고 있으며,  트랜잭션이 이미
 COMMITTED된 엔트리는 비어있는 것으로 인식하여 다음 트랜잭션이 사용 가능하게 된다.


 01560 : tablespace에 충분한 공간이 없을때
 01560, 00000, 'global hash table size mismatch for %s (%s != %s)'
 // *Cause: The specified 'gc_' INIT.ORA parameter was incompatible
 // with that of another instance which already has the database mounted.
 // *Action: Fix the 'gc_' parameter and restart.

======================================================================
ORA-01562 조치방법 : MAXEXTENTS (DEFAULT 121)에 도달한 경우
======================================================================

 ROLLBACK SEGMENT는 TRANSACTION을 수행하면 필요한 만큼의 EXTENT를 발생하여 그 크기가 증가된 이후에는
 그 TRANSACTION이  COMMIT혹은 ROLLBACK되더라도  SIZE가 줄  어들지 않는다.  (OPTIMAL을 지정하지  않는
 경우)  이것은 DB를  SHUTDOWN후 다시  STARTUP 하여도  마찬가지이며, ROLLBACK  SEGMENT가 자신이  속한
 TABLESPACE로 부터  EXTENT를 할  당받다가 더  이상 할당받을  EXTENT가 없을  때, 혹은 이미 MAXEXTENTS
 (DEFAULT 121)에 도달한 경우에 ORA-1562가 발생한다. 

1. 현재 ROLLBACK SEGMENT가 포함되어 있는 RBS TABLESPACE의 크기 확인 

sqlplus system/manager 
SQL> SELECT  file_name, bytes 
       FROM  dba_data_files 
      WHERE  tablespace_name = 'RBS'; 

         FILE_NAME                 BYTES
------------------------------- ------------ 
/oracle/pms/dbs/rbsPMS01.dbf      20971520 
/oracle/pms/dbs/rbsPMS02.dbf      10485760 

 여기에서 나타난 결과값이 절대적으로 작은 경우 RBS TABLESPACE에 DATAFILE을 ADD 시켜줄 필요가 있다. 

2. 각 ROLLBACK SEGMENT의 SIZE및 발생한 EXTENT의 수 확인 

sqlplus system/manager 
SQL> SELECT  segment_name, initial_extent, next_extent, maxextents, rssize, extents, xacts 
       FROM  dba_rollback_segs a, v$rollstat b 
      WHERE  a.segment_id = b.usn; 

결과는 다음과 같은 형태로 나온다. 
 (1) INITIAL_EXTENT는 ROLLBACK SEGMENT가 필요한 경우 처음으로 자신의 SPACE를 잡는 크기이며, 이 크기만
  큼의 연속된 공간을 RBS TABLESPACE로 부터 잡는다. 
 (2) NEXT_EXTENT는 INITIAL_EXTENT를 잡은 후에 추가적으로 SPACE가 필요한 경우 이 크기만큼씩 SPACE를 잡
  게 된다. 
 (3) MAXEXTENTS는 각 ROLLBACK SEGMENT에 지정된 최대 발생가능한 EXTENT의 갯수이다.
  여기에 설정된 값 이상의 EXTENT를 발생시킬 수 없다. 
 (4) RSSIZE는 현재 각 ROLLBACK SEGMENT가 잡고 있는 RBS TABLESPACE내의 ROLLBACK SEGMENT의 크기이다. 
 (5) EXTENTS는 현재 각 ROLLBACK SEGMENT별로 발생한 EXTENT의 갯수이다. 
 (6) XACTS는 현재 각 ROLLBACK SEGMENT를 잡고 있는 ACTIVE ROLLBACK TRANSACTION의 갯수이다. 
  ROLLBACK SEGMENT를 OFFLINE하거나 DROP할 때는 이 XACTS가 0인지 확인하고 작업하여야 한다. 

 (컬럼 이름은 편의상 축소하였다.) 
  SEGMENT   INITIAL    NEXT      MAX    RSSIZE    EXNTENTS    XACTS 
 --------- --------- -------- -------- --------- ---------- -------- 
 SYSTEM      262144   262144     121    407552        8         0
 R01         262144   262144     121    530432        2         0
 R02         262144   262144     121    3192832      12         0 
 R03         262144   262144     121    5056512      19         0 
 R04         262144   262144     121    11180032     42         1 

 이때 ORA-1562발생시  표시된 message에  나타난 ROLLBACK  SEGMENT이름의 EXTETNS가  MAX_EXTETNS의 수와
 같으면, 이것은 그 ROLLBACK SEGMENT가 MAXEXTENT에 도달하여 이 오류가 발생한 것이고, 그렇지 않은 경우
 는 TRANSACTION에 필요한 SPACE가 더 이상 RBS TABLESPACE에 FREE SPACE로 남아 있는 것이 없어서 발생한 
 것이다. 

3. 가능한 조치 방법 

 (1) 2번의  QUERY 결과  MAXEXTENT에 도달하지도  않았고, 오류가  발생한 TRANSACTION을  처리할 만큼 큰
 크기의 RSSIZE가 있는 ROLLBACK SEGMENT도 없는  경우에는 1번의 조회 결과 나타난 RBS의  DATAFILE이외에
 추가적으로 RBS TABLESPACE에 새로운 DATAFILE을 추가하여야 한다. 

 sqlplus system/manager 
 SQL> ALTER TABLESPACE rbs ADD DATAFILE '/oracle/pms/dbs/rbsPMS03.dbf' SIZE 50M; 

 (2)  2번의 조회를  확인한 결과,  오류가 발생한  ROLLBACK SEGMENT의  RSSIZE보다 큰  RSSIZE를 가지는
 ROLLBACK  SEGMENT가 존재하여  이 TRANSACTION을  수행하기에 충분  하다고 판단되는  경우 그  ROLLBACK
 SEGMENT를  지정하여 사용할  수 있다.  RSSIZE가 매우  큰 ROLLBACK  SEGMENT가 R04라고  할때, SQLPLUS
 상에서는 다음과 같이 하면된다. 

 SQL> SET TRANSACTION USE ROLLBACK SEGMENT r04 ; 

 일반적으로 BATCH JOB과 같이 ROLLBACK SEGMENT가 많이 필요한 TRANSACTION에 대해서는 INITIAL과  NEXT가
 크게 지정되어 있는 큰 크기의 ROLLBACK SEGMENT를 지정하여 사용하는 것이 효율적이다. 

 (3) 2번의 조회에서  획인 된 INITIAL_EXTENT와  NEXT_EXTENT가 작아 실제로는  RBS의 FREE SPACE가  남아
 있는데도 MAXEXTENT에 도달하여 ORA-1652가 발생하는 경우 ROLLBACK SEGMENT의 INITAL과 NEXT를 크게 하여 
 ROLLBACK SEGMENT를 재생성할 수 있다. 

 참고)
 각 TABLESPACE별 FREE SPACE는 다음과 같은 방법으로 확인가능하다. 
 sqlplus system/manager 
 SQL> SELECT tablesapce_name, sum(bytes), max(bytes) 
        FROM dba_free_space 
       GROUP BY tablespace_name; 

 (4) 이러한 ROLLBACK SEGMENT에 관한 오류는 ROLLBACK SEGMENT가 일단 필요한 SPACE를 확보한 이후에는 그
 크기가 줄어들지 않는 것이 그 원인이 될 수도 있는데 이때 ROLLBACK SEGMENT에 OPTIMAL SIZE를  지정하면
 어느 정도의 해결이 가능하다. OPTIMAL을 지정하면 ROLLBACK SEGMENT가 그 크기 이상으로 증가되는  경우,
 이후 OPTIMAL로 지정된 크기만  유지하도록 ROLLBACK SEGMENT가 줄어들게  된다. 이때, 이값을 너무  작게
 잡으면 빈번하게 ROLLBACK SEGMENT가 늘어나고  줄어드는 작업으로 인해 PERFORMANCE에 지장을  초래할 수
 있으므로 20~30개의 EXTENT정도를 보유할 수 있도록 한다. 

OPTIMAL의 지정 방법은 ROLLBACK SEGMENT생성시나 그 이후에 다음과 같이 하면 된다.

 sqlplus system/manager 
 SQL> CREATE ROLLBACK SEGMENT r01 
             TABLESPACE rbs 
             STORAGE (INITIAL 1M NEXT 1M OPTIMAL 20M) ; 

 이미 생성된 rollback segment에 대해서는, 
 SQL> ALTER ROLLBACK SEGMENT r01 STORAGE(OPTIMAL 20M);

======================================================================
ORA-01578 조치 방법 : seq=0 이고 inc<>0(새로운 블럭이 아님)일 때
======================================================================

<PRE> 모든 오라클  데이타 블럭은 Sequence  번호(seq)와 Incarnation 번호(inc)를 갖고 있다. ORA-1578  에러는 seq=0 이고 inc <> 0(새로운 블럭이 아님)일 때 발생한다.  ORA-1578 에러는 ORA-600[3339] 에러와 함께 발생하곤 한다.  * ORA-1578 에러가 발생하면  Corruption이 발생한 화일번호와 블럭번호를 알려준다. 여기서는 이 때의 화일번호를 f, 블럭번호를 b 라고 부르기로 한다.  <해결방법> 1. 우선 해야 할 일은 어떠한 오브젝트가 Corrupt  되었는가를 알아내는 것이다.    다음의 스크립트를 이용하면 알 수 있다.    SQL> select segment_name, segment_type        from dba_extents        where file_id = f and       between block_id and block_id + blocks - 1; 2. 만약 해당 세그먼트가 인덱스이면 Drop 시키고 다시 생성하면 된다.  3. 만약 해당 세그먼트가 테이블이면 Corrupt 된 블럭의 데이타는 손상된 것이다.  4. 만약 해당 테이블이 들어있는 엑스포트 화일이 있다면 손상된 테이블을 Drop 시키고 임포트 받는 것이 제일 간단한 방법이다. 하지만 만약 엑스포트 받은 파일이 없거나 백업해 둔 화일도 없다면 해당 테이블에 인덱스가 생성되어 있는 경우에 한해서 다음의 방법을 사용해서 복구를 하도록 한다. * empno, ename, deptno 를 컬럼으로 가지는 EMP 테이블이 Corrupt되었다고 가정하자. 그리고 empno 컬럼에 인덱스가 생성되어 있다고 하자. 클러스터화되지 않은 모든 테이블은 유니크한 Rowid 를 가진다. Rowid를 Varchar2/hexadecimal 형식으로 표현하려면 Rowidtochar 함수를 이용한다. SQL> select rowid to_char(rowid) from emp; * Rowid는 총 18자로 블럭어드레스(8자), 점(1자), 로우 어드레스(4자), 점(1자), 화일 어드레스(4자)로 구성되어 있다.  SQL> select empno, rowid       from emp        where empno > 0     위의 스크립트를 실행시키면 다음과 같은 결과를 얻게 된다.      EMPNO             ROWID      ------------     --------------------------------      100          00000003.0000.0006        101          00000003.0001.0006         102          00000003.0002.0006         103          00000003.0003.0006      500         00000004.0000.000A        501          00000004.0001.000A        755         0000001A.0005.000A        756          0000001A.000C.000A   * 만약 인덱스가 Character 컬럼에 대한 것이었다면, 위의 Query 문장을 다음과 같이 바꿀 수 있다.  SQL> select empno, rowid          from emp     where empno > '';     * 예를 들어 다음과 같은 에러  메시지가 떨어졌다고 하자.   01578, 00000, 'ORACLE data block corrupted (file # 10, block # 4)   그러면 다음의 스크립트를 사용하여  손상된 블럭에 있는 employee 에 대한 empno를 구할 수 있다.   SQL> select empno  from emp   where empno > 0 and rowid tochar(rowid) like '00000004.%.000A';      EMPNO         ROWID        ----------  --------------------------------      500      0000004.0000.000A        501      00000004.0001.000A   * 이제 EMP 테이블과 같은 구조를 갖는 새로운 테이블을 만든다.     SQL> create table temp       as select * from emp where 1 = 2;   * 그리고는 손상된 부분을 피해서 새로운 테이블에 손상된 테이블의 데이타를 추가한다.     SQL> insert into temp select * from emp where empno < 500;       SQL> insert into temp select * from emp where empno > 501;   손상된 테이블을 Drop시키고  Temp 테이블의 이름을 EMP 로 변경한다.  그리고 백업된 자료나 문서자료를 통하여 손상된 부분에 대한 정보를 추가한다.     5. 손상된 블럭에 여러개의 로우가 존재하고 있다면 다음의 방법을 이용한다.  SQL> create table empnos as         select empno from emp         where empno > 0          and rowid to_char(rowid) not like '00000004.%.000A'; 이 스크립트를 이용하면 손상된 블럭에 포함되지 않은 empno 들을 알 수 있다. * 다음의 스크립트를 계속 실행시켜 복구를 한다.  SQL> create table temp as select * from emp where 1 = 2; SQL> insert into temp       select emp.empno, emp.ename, emp.deptno         from emp, empnos       where emp.empno > 0       and emp.empno = empnos.empno;   6. 만약 데이타 딕셔너리의 테이블이나 인덱스에서 손상된 블럭이 발생했다면 지원을 요청해야 한다.

======================================================================
ORA-01628 ORA-01630 ORA-01631 ORA-01632 조치 방법 : MAXEXTENTS에 도달했을때
======================================================================

다음 ORA 에러들은 오라클의 오브젝트들이 MAXEXTENTS에 도달했을 때 발생하는 것들이다.

01628, ' max # extents (%s) reached for rollback segment %s ' 
01630, ' max # extents (%s) reached in temp segment in tablespace %s '
01631, ' max # extents (%s) reached in table %s.%s ' 
01632, ' max # extents (%s) reached in index %s.%s '

또한 ORA-1628 다음에는 ORA-1562 에러도 함께 발생한다. 

이 에러들은 다음 모든 LEVEL 에서 발생될 수 있다.
. 에플리케이션 LEVEL (GL, AOL, Financials, Etc) 
. TOOLS LEVEL (Reports, Forms, Etc) 
. Kernel LEVEL (Insert, Update, Delete) 

이 에러의 이유는 오브젝트의  익스텐트가 MAX # 에 도달했기 때문에 발생되며,  오브젝트의 MAXEXTENTS는 
STORAGE의 MAXEXTENTS 파라미터에 의해 결정된다.

다음 예를 보기로 하자. 

SQL> INSERT INTO TAB1 SELECT * FROM TAB1; 
     ORA-01631 : max # extents (2) reached in table JANE.TAB1

SQL> SELECT  INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS 
       FROM  USER_TABLES
      WHERE  TABLE_NAME = 'TAB1'; 

   INITIAL_EXTENT   NEXT_EXTENT  MAX_EXTENT
  ---------------  ------------  ----------
        6144           10240         2

위 예에서 오브젝트의 MAXEXTENTS 는 2 인데 이 값은 HARDCORD된 MAX 값이 아니다.
HARDCORD 된 MAXEXTENTS의 최대값은 데이타베이스가 생성될 당시 지정된 DB_BLOCK_SIZE 의 값에 따라 다르다.

   DB_BLOCK_SIZE       최대 MAXEXTENTS 값 
-------------------    ------------------
       512                    25
        1K                    57
        2K                    121
        4K                    249
        8K                    505


만일 최대 MAXEXTENTS 값보다 더 큰 MAXEXTENTS를 Storage 에서 지정하면 다음 에러가 발생한다. 
ORA-02226, 00000, ' invalid MAXEXTENTS value (max allowed: %s) '

다음은 ORA-0163x 에 대한 해결 방법이다. 
만일 platform의 최대 MAXEXTENTS 에 도달이 안 되었으면 ALTER TABLE .. STORAGE (MAXEXTENTS n);
를 사용하여 최대 MAXEXTENTS 값보다 작은 수로 MAXEXTENTS를 늘려준다. 
만일 최대 MAXEXTENTS 값에 도달했으면 해결할 수 있는 방법은 MAX 제한에 도달되지 않도록 EXTENT SIZE 를 
더 크게하여 오브젝트를 다시 생성하는 것이다.
만일 이 에러가 ROLLBACK SEGMENT 에서 발생되면 DROP하고 다시 생성한다. 
만일 에러가 TEMPORARY TABLESPACE에서 발생되면 TEMPORARY TABLESPACE의 STROAGE를 변경한다. TEMP SEGMENT
는 그것이 생성된 TABLESPACE의 Default Storage Parameter를 사용하기 때문에 다음과 같은 방법으로 해결할 
수 있다.


ALTER TABLESPACE 'tempname' DEFAULT STORAGE (INITIAL n NEXT n);
. n 은 기존 지정된 값보다 큰 값을 지정한다.
ALTER TABLESPACE 'tempname' DEFAULT STORAGE (PCTINCREASE m);
. m 은 기존 지정된 값보다 큰 값을 지정한다. 

만일 에러가 TABLE에서 발생되면 export/import utility를 사용하여 그 TABLE을 다시 생성한다. 


[ 단계 ] 예를 들어 scott user의 emp table이 121개의 extent에 도달했다고 가정
1. table을 export한다. 
 예) $ exp scott/tiger file=emp.dmp tables=emp 

2. table을 drop하거나 export가 실패한 경우를 대비해서 기존 TABLE을 RENAME 한다.
 예) SQL> drop table emp; 또는  
     SQL> RENAME EMP TO EMP_OLD;
 
3. storage절을 변경하여 table을 생성한다.
 SQL> create table emp(empno.....) storage (intial 10M next 1M pctincrease 0);
 여기에서 initial 10M과 next 1M은 예로 든 것이므로 고객 환경에 적당하게 설정한다. 
 pctincrease는 0로 한다.

4. 사용자의 SCHEMA 에 임포트를 실행하여 TABLE을 생성함.
 이 때 위에서 생성된 table에 import가 되도록 ignore=y option을 사용
 예) $imp scott/tiger file=emp.dmp tables=emp ignore=y commit=y 

5. 2번에서 table을 rename하였다면 import가 잘 수행되었는지 확인하고 기존 테이블은 DROP 함.
 예) SQL> DROP TABLE EMP_OLD;

======================================================================
ORA-0162x ORA-0163x조치 방법 : MAXEXTENTS에 도달 했을때 발생
======================================================================

INITIAL_EXTENT  
다음 ORA 에러들은 오라클의 오브젝트들이 MAXEXTENTS에 도달 했을때 발생하는  것들이다.
01628, 00000, 'max # extents (%s) reached for rollback segment %s'      
01630, 00000, 'max # extents (%s) reached in temp segment in tablespace %s'
01631, 00000, 'max # extents (%s) reached in table %s.%s' 
01632, 00000, 'max # extents (%s) reached in index %s.%s' 

 또한  ORA-1628 다음에는 ORA-01562도 함께 발생한다. 

 이 에러들은 다음 모든 LEVEL에서  발생 될 수 있다.
  &sect;  에플리케이션 LEVEL (GL, AOL, Financials, Etc)
  &sect;  TOOLS LEVEL (Reports, Forms, Etc)      
  &sect;  커널  LEVEL (Insert, Update, Delete)    

 이 에러의 이유는 오브젝트의 익스텐트가 MAX #에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는 
 STORAGE의 MAXEXTENTS 파라미터에 의해 결정된다.  

다음 예를 보기로 하자.  


SQL>; INSERT INTO TAB1
      SELECT * FROM TAB1;           
   ORA-01631: max
# extents (2) reached in table JANE.TAB1
SQL> SELECT  INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS       
       FROM  USER_TABLES                
      WHERE  TABLE_NAME = 'TAB1';

   INITIAL_EXTENT NEXT_EXTENTS MAX_EXTENT
     --------------  ------------  ---------- 
         6144          10240        2

위 예에서 오브젝트의 MAXEXTENTS는 2 인데 이 값은 HARDCORD된 MAX 값이 아니다.     
HARDCORD 된 MAXEXTENTS의 최대값은 데이타베이스가 생성될 당시 지정된 DB_BLOCK_SIZE 의 값에 따라 다르다.

======================================================================
ORA-01632 조치 방법 : INDEX REBUILD
======================================================================

 ORA-01632 에러는 index가 확장하려고 할 때 maxextents 값의 제한에 도달하여 더이상 extents를 일으키지
 못하는 경우입니다.  이 에러의  경우 보통은  index의 storage  절의 initial,  next가 작아서  발생하기
 때문에 근본적으로 storage의 initial, next를 크게 키워 주면서 다시 만드는 것이 좋습니다. 그러나 현재
 다시 생성하는 것이 어렵다면  일단 maxextents만 키워서 사용을 하다가 나중에 작업을 할 수도 있습니다.

maxextents를 키우려면 (이 기능은 7.3 이상부터 가능)

SQL> alter index i_dept_deptno storage (maxextents 200);
 과 같이 실행하면 됩니다. 위와 같이 index가 일반  index가 아니라 primary key  index인 경우는 index만 
 drop 했다가  다시 생성할 수는 없습니다.  그러므로 primary  key를 다시  만들면서 지정하거나  index를 
 rebuild 해야 합니다. 일반 index의 경우는 index를 다시 생성하거나 rebuild하면 되는데, 보통 다시 생성
 하는 것보다 rebuild하는 것이 속도가 좋습니다.

1. index를 rebuild하는 방법

 SQL> alter index pk_dept rebuild
    2 tablespace ind_data
    3 storage (initial 1M next 1M);

2. primary key 생성 시 storage 지정하는 방법

 SQL> alter table dept drop primary key;
 SQL> alter table dept add constraint pk_dept
   2 primary key (deptno)
   3 using index tablespace ind_data
   4 storage (initial 1M next 1M);

======================================================================
ORA-01652 조치 방법 : tablespace에 space가 부족
======================================================================

 ORA-165X error는 tablespace에 space가 부족해서 table이나 rollback segment extent가 할당되지  못해서
 발생하는 error이다. 다음의 에러들은 tablespace에 space가 부족해서 발생하는 사항들이다. 
 01652, 00000, 'unable to extend temp segment by %s in tablespace %s' 
 01653, 00000, 'unable to extend table %s.%s by %s in tablespace %s' 
 01654, 00000, 'unable to extend index %s.%s by %s in tablespace %s' 
 01655, 00000, 'unable to extend cluster %s.%s by %s in tablespace %s'

1. Tablespace space 부족 현상의 예 
다음의 테이블 생성 문장을 보자. 

 SQL> CREATE TABLE FEATURE 
   2> (feature_code varchar2(4) primary key, 
   3> feature_desc varchar2(3) );

ORA-01652, 00000, 'unable to extend temp segment by 6144 in tablespace VESSEL'
테이블 스페이스 VESSEL 에 남아있는 가장 큰 연속된 공간을 확인해 보면 

 SQL> SELECT MAX(blocks), MAX(bytes)
   2> FROM DBA_FREE_SPACE 
   3> WHERE TABLESPACE_NAME = 'VESSEL';

  blocks bytes
  6143 12,580,864

위의 결과를 보면 현재 VESSEL 에 남아있는 가장 큰 연속된 공간은 6143 블록인데 
오라클은 6144 블럭이 사용하려다 이를 할당받지 못하여 에러가 발생하게 된 것이다.

2.tablespace space 부족현상의 조치 
tablespace에 space가 부족해서 에러가 발생하는 경우 
아래의 몇 가지 방법을 이용해 조치가 가능하다. 

(1) 데이타 화일을 추가하여 테이블스페이스의 크기를 확장한다. 

 SVRMGR> ALTER TABLESPACE data ADD DATAFILE '/usr/../oracle/data2.dbf' SIZE 100M; 

 이때의 tablespace 가 SYSTEM  일 경우는 user 의  default tablespace가 잡혀있지 않기  때문에 근본적인
 해결이 필요하다. 이 경우는 무작정 tablespsace 를 늘리지 말고 user의 default tablespace를  create 후 
 user에게 할당해 주도록 한다. 

예) 
 SVRMGR> CREATE TABLESPACE tablespace_name datafile '......' size 100m; 
 SVRMGR> ALTER USER user_name IDENTIFIED BY passwd 
       > DEFAULT TABLESPACE tablespace_name 
       > TEMPORARY TABLESPACE temp ; 

(2) 테이블(rollback segment)의 storage parameter를 조정하여 현재 남아있는 영역에 들어갈 수 있도록 한다. 

SQLDBA> ALTER TABLE emp STORAGE(NEXT 1M); 

이 경우 tablespace가 fragmentation이 심한 경우가 아니면 효과적이지 못하다. 

(3) 테이블스페이스가 fragmentation이 심한 상태이면 exp/imp를 이용하여 테이블 스페이스를 재구성 한다. 

3. V7.1에서의 ORA-1652 에러 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE가 아닌 곳에서 
 ORA-1652(temp tablespace가 부족함) 에러가 발생하는 경우가 있다. 이와 같은 문제는 V7.1에서만 발생하는데
 V7.1에서는 테이블, 인덱스 등을 병렬로 생성할 수 있다. 이를 위하여 실제로 테이블 등이 생성될 공간에 
 Temporary Segment를 만들게 되는데 이 과정에서 Temporary Segment를 만들 공간이 부족하게 되면 실제의 
 테이블이 생성되는 테이블 스페이스에 대하여 ORA-1652 에러가 발생하게 되는 것이다. 
 이 에러를 해결하는 방법은 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment가 생성
 될 만한 연속된 공간을 마련하여 주는 것이다.

=====================================================
ORA-1653, ORA-1658 : TABLESPACE 크기를 확장하는 방법
=====================================================

 오라클  7.1 이하에서는  tablespace를 확장하려면  해당 tablespace에  데이타 화일을  추가하는 방법을
 사용한다. 이 때  추가하는 데이타 화일의  이름은 기존의 화일과  동일한 이름이 아니기만  하면 되지만,
 편의상 기존의 화일에 일련 번호를 붙여서 사용하는 것이 일반적이다. 

 예를 들어 tablespace TOOLS 를 확장한다고 가정하면

 $sqlplus system/manager

 SQL> select  file_name, bytes
        from  dba_data_files
       where  tablespace_name = 'TOOLS';

 이와 같이 하면 현재  TOOLS tablespace를 구성하고 있는  화일 이름과 크기 (bytes)가  출력된다. 여기서
 출력된 file_name 이 /oracle/dbs/toolsORA.dbf 라고 한다면 다음과 같이 하여 tablespace를 확장한다.

 SQL> alter  tablespace tools
        add  datafile '/oracle/dbs/tools2ORA.dbf' size 50M;
 여기서는 화일의 크기를 50M 로 주었는데 이것은 디스크의 FREE SPACE 와 기존의 데이타 화일의 크기  및
 앞으로 들어갈 데이타의 크기 등을 고려하여 적절한 값으로 결정하도록 한다.

 오라클 7.2 에서는 위의 방법 외에도 기존의 데이타화일의 크기를 변경시켜서 확장시킬 수 있다.

 예를 들어 TOOLS tablespace가 현재 50M 크기의 /oracle/dbs/toolsORA.dbf 화일로 구성되어 있다면 다음과 
 같이 해서 이 화일의 크기를 100M 로 늘릴 수 있다.

 SQL>alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;

 RESIZE 옵션은  V7.2 에서  추가된 것으로  기존의 데이타  화일을 확장  또는 축소할  수 있다. 축소하는
 경우는 데이타가 들어 있는 경우 하한선 이하로 내려가지는 않는다.

 한편, 데이타가 계속 들어가서 tablespace를 꽉 채우게 되면 다음과 같은 명령을 이용하여 자동적으로 
 tablespace를 확장할 수도 있다.

 SQL> alter database datafile '/oracle/dbs/toolsORA.dbf' autoextend on next 10M maxsize 200M;

 이렇게 하면 데이타가 늘어나면서 자동적으로 10M 씩 데이타화일의 크기가 늘어나게 된다. 여기서는 최대 
 200M 까지 늘어날 수 있도록 설정하였다.


======================================================================
ORA-01654 : INDEX SEGMENT
======================================================================

01654, 00000, 'unable to extend index %s.%s by %s in tablespace %s' 
예) unable to extend index owner.object by 40964 in tablespace INDEX;

1. tablespace에 남아 있는 공간 중 가장 큰 연속된 공간의 사이즈를 구합니다.
   SELECT  max(bytes)
     FROM  dba_free_space 
    WHERE  tablespace_name = 'TABLESPACE NAME'; 

 ora-1654 에러가  났던 tablespace  이름을 대문자로  위에 써줍니다.  위에 나온  수치는 연속된 block들
 가운데  가장  큰 사이즈의  extent를  보여주는 것인데,  next  extent를 할당하기  위해서는  위에 나온
 수치보다 더 큰 사이즈를 필요로 하는 것입니다.

 'The above query returns the largest available contiguous chunk of space.'

2. index의 storage parameter인 next_extent 값과 pct_increase 값을 확인합니다.
   SELECT  next_extent, pct_increase 
     FROM  dba_indexes 
    WHERE  index_name = 'INDEX NAME' AND owner = 'OWNER';

 ora-1654 에러가 발생한 index의 next extent 값과 pct_increase 값이 얼마인지 확인해 보십시오.
 위에서 나타난 next_extent 값과 max(bytes) 값을 비교해 보세요.

3. 인스턴스의 db_block_size를 확인합니다.
   vi $ORACLE_HOME/dbs/initSID.ora

 db_block_size = 2048 또는 4096 또는 8192일 것입니다.

 ora-1654 에러에 나타난  by 다음의 수치(예:40964)  * db_block_size 만큼의  사이즈가 next_extent(byte
 단위) 값과 같을 것이며, 이 만큼의 extent 영역을 할당할 수 없다는 뜻입니다.
 따라서 datafile을 추가시 이 byte 값 이상의 사이즈를 추가해야 합니다.

4. ora-1654 에러를 해결하는 방법

 There are several options for solving failure to extend. 

 Manually Coalesce Adjacent Free Extents
 ---------------------------------------

 ALTER TABLESPACE <tablespace name> COALESCE;
 The extents must be adjacent to each other for this to work.

 Add a Datafile: 
 ---------------

 ALTER TABLESPACE <tablespace name> ADD DATAFILE '<full path and file 
 name>' SIZE <integer> < |k|m>; 

Lower 'next_extent' and/or 'pct_increase' size:
-----------------------------------------------

For non temporary segment problem: 

ALTER <object><PARAM NAME="AllowScriptAccess" VALUE="never" > <object name><PARAM NAME="AllowScriptAccess" VALUE="never" > STORAGE ( next <integer> < |k|m> 
pctincrease <integer>); 

For a temporary segment problem: 

 ALTER TABLESPACE <tablespace name> DEFAULT STORAGE 
 (initial <integer> next <integer> <|k|m> pctincrease <integer>); 

 Resize the Datafile: 
 -------------------- 
 ALTER DATABASE DATAFILE '<full path and file name>' RESIZE <integer><k|m>;

======================================================================
ORA-04031 조치 방법 : Shared pool에서 연속적인 메모리 부분을 찾지 못해 발생
======================================================================

우리는 다음과 같은 작업수행 시 Oracle 이 Shared pool에서 연속적인 메모리 부분을 찾지 못해 ORA-4031 
Error를 발생시키는 것을 볼 수 있다. 
 - PL/SQL Routine 
 - Procedure 수행시 
 - Compile 시 
 - Form Generate 또는 Running 시 
 - Object 생성하기 위해 Installer 사용시 

1. Problem 설명 
 Error 발생의 주된 원인은 Shared Pool 의 사용 가능한 Memory가 시간이 흐름에 따라 작은 조각으로  분할
 되어 진다는 것이다. 그래서 큰 부분의  Memory를 할당하려 한다면 Shared Memory가 부족하다는  ORA-4031
 Error가 발생한다. 즉, 전체적으로는 많은 양의 사용 가능한 Space 가 있다하더라도 충분한 양의 연속적인
 Space가 없으면 이 Error가 발생한다. 

2. Problem 해결 방안 
 이 Error 해결 방안을 살펴 보면 다음과 같다. 

 (1) Shared Pool 의 Size를 적절히 조절한다. 
 이 Size는 Default 값이 3.5M~9M로 되어 있지만 실제 운용 데이타베이스의 경우에는 이 이상으로 이용하는
 곳이 많다. 이 Size를 수정시는 DB를 Shutdown 후 다시 Start 시켜야 하므로 항상 가능한 해결 방법이 될 
 수는 없다. 

 (2) Object를 Shared Pool에 맞추어 Fragmentation을 줄인다. 
 (Dbms_Shared_Pool Procedure 이용) 

 (3) Shared Pool 을 효율적으로 사용하도록 Application Program을 조절한다. 
 DBMS_SHARED_POOL STORED PROCEDURE 
 이 stored pakage는 dbmspool.sql을 포함하며 7.0.13 이상 version에서 사용가능하다. 
 이는 다음과 같이 3가지 부분으로 나누어 진다. 

 (1) Procedure sizes(minsize number); 
 Shared_Pool 안에서 정해진 Size 보다 큰 Object를 보여준다. 

 (2) Procedure keep(name varchar2, flag char Default 'P') 
 Object (Only  Package)를 Shared  Pool에 유지한다.또한  일단 Keep한  Object는 LRU Algorithm에 영향을
 받지 않으며 Alter System Flush Shared_Pool Command 에 의해 Package 의 Compiled Version 이 Shared 
 Pool 에서 Clear 되지 않는다. 

 (3) Procedure unkeep(name varchar2);keep() 의 반대기능이다. 
 이 Procedure들과 사용법에 대해 보다 더 자세한 정보를 위해서는 $ORACLE_HOME/rdbms/admin/dbmspool.sql 
 script를 참조 바랍니다.

======================================================================
ORA-07329 ORA-07331 ORA-07279: SHARED MEMORY 문제
======================================================================

1. 왜 Problem 이 생기나?
 * Oracle 은 Process와 SGA(System Global Area) 간의 Communication를 위해 Shared Memory와 Semaphore를
 사용한다. Oracle Instance 가 뜰 때 SGA를 Create하기 위해 Main Memory의 임의의 부분을 할당하는데  이
 때 Shared Memory 나 Semaphore 가 적절하지 않으면 이에 관련한 Error가 발생한다. 
 
2. 해결 방안
 SGA는 Shared Memory 안에 생기므로 Shared Memory 는 각 Process에게 사용 가능해야 한다.
 Shared memory 와 Semaphore parameter 는

 - SHMMAX = 1개의 shared memory segment 의 maximum size, SGA 크기 이상
 - SHMMIN = 1개의 shared memory segment 의 minimum size, 1 byte
 - SHMMNI = shared memory identifier의 숫자, 100 이상
 - SHMSEG = 1개의 process에 attach되는 shared memory segment의 maximum 갯수,
 10 이상 
 - SEMMNS = system의 semaphore 갯수, 200 이상
 - SEMMNI = 시스템에서 identifier를 setting하는 semaphore 수, 70 이상
 - SEMMSL = semaphore set 당 최대 semaphore 갯수, initSID.ora 의 processes값 이상

* 추천하는 Semaphore와 Shared Memory Parameter

   Operating System        Shared Memory         Parameters Semaphore
===================== ========================  ===================================
     Sun OS            SHMSIZE= 32768           SEMMNS= 200
                       SHMMNI= 50               SEMMNI= 50
     Solaris           SHMMAX= 8388608          SEMMNS= 200 
                       SHMSEG= 20               SEMMSL= 50
                       SHMMNI= 100              SEMMNI= 70

      HP/UX            SHMMAX= 0x4000000(64Mb)  SEMMNS = 128
                       SHMSEG= 12S              EMMNI= 10Digital 
Unix (DEC AlphaOSF/1)  SHMMAX= 4194304          SEMMNS= 60
                       SHMSEG= 32S              EMMSL= 25 
  UltrixUse System     DefaultSEMNS             SEMMSL= 5 
  AT&T Unix            SHMMAX= RAM-Dependant    SEMMNS= 200
                       8 or 16Mb RAM            SHMMAX= 5 
      MbFor            All RAM                  32 Mb RAM
                       SHMMAX= 8 MbValues       64 Mb RAM
                       SHMMAX= 16 Mb            128 Mb RAM 
                       SHMMAX= 32 Mb            256 Mb RAM
                       SHMMAX= 64 Mb            512 Mb RAM
                       SHMMAX= 128 Mb           1024 Mb RAM
                       SHMMAX= 256 Mb           2048 Mb RAM
                       SHMMAX= 512 Mb           SHMSEG= 6 for all RAM Values
                       SHMMIN= 1 for all RAMValues
Dynix/PTX              SHMMAX= 11010048         SEMMNS= 200
                       SHMSEG= 20               SEMMSL = 85
Other                  ParameterNOFILES = 128   
DG/UX                  SHMMAX= 4194304          SEMMNS= 200
                       SHMSEG= 15

 Shared Memory 와 Semaphore  Parameter는 OS 의 Kernel  Configuration 화일에 반드시 지정되어야  하며,
 File의 위치는 OS마다 차이가 있다. 현재의 Shared Memory와 Semaphore Configuration 을 알기 위해서는
다음의 Command를 이용한다.

$ sysdef |more 

* HP-UX (relevant sections only) 에서의 예: 

Semaphore 관련 Parameters 
- maximum value for semaphores(semaem)= 16384 
- Semaphore map(semmap)= 4098 
- number of semaphore identifiers(semmni) = 4096 
- total number of semaphores in the system(semmns) = 8192 
- number of semaphore undo structures(semmnu) = 1536 
- semaphore undo entries per process(semume) = 512 
- semaphore maximum value(semvmx) = 32767 

Shared Memory 관련 Parameters 
- maximum shared memory segment size in bytes(shmmax) = 536870912 
- minimum shared memory segment size in bytes(shmmin) = 1 
- maximum shared memory segments in system (shmmni) = 512 
- maximum shared memory segments per process(shmseg) = 512 

NOTE: SHMMAX는 현 system에 8개의 instance가 수행될 수 있는 충분한 값이다.


* Shared memory 또는 semaphore parameters 를 변경하기 위해서는 ... 

1. Oracle Instance를 Shutdown 한다. 
2. OS의 Kernel Configuration File이 있는 곳으로 간다. 
3. System Utility 또는 Editor를 이용해서 필요한 값을 바꾼다. 

System Utility는 다음과 같다 
----------------------------
|    OS    |  Utility      |
----------------------------
| HP/UX    | SAM           |
| SCO      | SYSADMSH      |
| AIX      | SMIT          |
| Solaris  | ADMINTOOL     |
----------------------------
4. Kernel 을 Reconfigure 한다. 
5. System을 Reboot 한다. 
6. Oracle Instance를 startup시킨다.

[ 예제 ] Solaris 2.3/2.4 parameters and commands: 

1. SQLDBA 에서 : 
SQLDBA> shutdown 
SQLDBA> exit 

2. Superuser(root)로 login 하고 : 
# cd /etc

3. /etc/system file 에 다음을 추가 한다: 

set shmsys:shminfo_shmmax=8388608 
set shmsys:shminfo_shmmin=1 
set shmsys:shminfo_shmmni=100 
set shmsys:shminfo_shmseg=20 
set semsys:seminfo_semmns=200 
set semsys:seminfo_semmni=70 

4. Kernel을 reconfigure 한다: 
# touch /reconfigure 

5. Machine 을 reboot 한다: 
#init 6 

6. SQLDBA 에서 : 
SQLDBA> startup 
SQLDBA> exit 

 Oracle의 init<SID>.ora 파라미터 화일에는 SGA에 영향을 주는 Parameter들이 있다. OS의 Shared Momory와
 Semaphore Parameter에 연결된 이 Parameter의 setting은 System과 Oracle의 Performance에 중요한 영향을
 미친다. 
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 11:00
반응형

======================================================================
ORA-00030 : ALTER SYSTEM KILL SESSION에 대하여
======================================================================

◈ 현상 사용자는 다음과 같은 상황에서 session 을 kill 하려는 시도를 하게 된다. 1. os 에는 process 가 존재하지 않지만, v$session 에는 active 로 존재하고 있을 경우 2. shadow process 는 살아 있는데, client machine 을 rebooting 한 경우 3. session 이 걸고 있던 lock 을 release 해야 할 경우 4. OS 나 Oracle 의 자원을 지나치게 많이 사용하여 성능을 저하시키는 process 그런데, alter system kill session ('sid, serial#'); 후에 다음과 같은 에러가 발생할 경우가 있다. ora-00030, 00000, "user session ID does not exist" // *Cause: The user session id no longer exists, probably because the // session was logged out. // *Action: Use a valid session ID. ◈ 원인 kill session을 할 수 없는 이유는 PMON이 이미 이 session을 delete하고 있는 중이기 때문이다. 즉, PMON 이 dead session 을 clean-up 하고 있는 중에는 serial number의 값이 증가한다. 문제는 PMON이 process를 kill하는 시간인데, transaction의 크기에 따라, PMON의 rollback 시간이 결정된다. 먼저 PMON은 dead process를 찾아내어, 이 process가 사용한 resource 를 release하는 시도를 한다. PMON은 계속 이 작업을 시도하다가 마침내, free buffer의 부족으로 더 이상 resource를 free-up 하지 못하게 된다. 이 때, 이 process를 delete하고 있다는 message를 trace file에 출력하는데, 이것은 process를 delete하는 데 필요한 resource(data cache 내의 free buffer)의 부족으로 위의 작업이 지연되고 있다는 의미이다. ◈ 조치 PMON이 process 를 clean-up 할 때 걸리는 시간은, 5분에서 24 시간까지 소요될 수 있다. 문제는 이 process가 hold 하고 있는 lock으로 인해 특정 작업이 수행되지 못하는 데 있다. MTS 를 사용할 때는 configuration MTS setting, sqlnet.expire_time 사용)에 따라 다르지만, clean-up 작업을 하는데 72 시간 이 소요된 경우도 있다. 아직까지는 PMON이 작업을 마칠 때까지 기다리는 방법 또는 db를 restartup하는 방법 밖에는 없다. --- PMON 의 작업 PMON은 network failure 나 기타의 원인으로 생긴 old process connection을 clean-up하는 역할을 한다. 그런데, PMON 은 clean-up 해야 하는 connection 중에 정해진 개수 만큼의 transaction 을 rollback 할 수 있는데, 이 값은 initSID.ora 의 cleanup_rollback_entries(default = 20) 에 의해 결정된다. 예를 들어, 1000 개의 uncommitted update가 있다면, 일정한 시간마다 cleanup_rollback_entries의 개수 만큼의 record만 rollback 할 수 있으므로 이 작업 동안에 lock 은 그대로 유지된다. PMON 은 위의 작업 이외에 DB maintenance 역할이 있으므로, 위의 rollback 이 비교적 빠르게 처리 되지 못할 수도 있다. 이러한 rollback을 빠르게 처리하기 위하여 cleanup_rollback_entries 를 늘릴 수도 있다. 그러나, 그 만큼 일정시간 동안 PMON의 작업이 많아지게 되므로, 다른 사용자들의 작업 요청이 느려지게 되는 trade-off가 있으므로, 신중히 고려한 후에 수정하는 것이 바람직하다. alter system kill session 에 의해서도 위와 같이 rollback 이 이루어지는데, 이 session 이 완전히 clean-up 되기 전까지 v$session, v$process에 남아 있게된다. --- ALTER SYSTEM KILL SESSION 을 하기 전에 ... kill session 을 원할 경우는 다음의 순서대로 작업하는 것이 좋다. 1. kill the user process first 2. wait for 3 - 4 minutes 3. query v$session 4. if any information find in v$session, query v$lock like select count(*) from v$lock where SID ='sid'; 위의 count(*) 가 0 이 아니라면, 아직 PMON 이 rollback을 끝내지 못한 경우이므로 다시 얼마후에 v$lock 을 조회하여 lock 의 개수가 감소하였는지 반복적으로 확인한다. 만약, 이 값이 전혀 변하지 않았다면, ALTER SYSTEM KILL SESSION 을 수행하고 v$session, v$lock을 query 하여 변화가 있는지 확인하여 변화가 있다면, 좀 더 기다린다. 그래도, v$lock 의 count(*) 가 0 이 되지 않을 경우, 마지막으로 수행할 수 있는 유일한 방법은 instance 를 restartup 하는 것이다.

======================================================================
ORA-00054 : TABLE에 TRANSACTION이 종료되지 않은 경우
======================================================================

TABLE 을 DROP 하려고 할때 그 TABLE에 TRANSACTION이 종료되지 않아 ORA-54 ERROR가 나오는 경우가 있다. DB를 RESTART하면 되지만 더 효율적인 해결 방법은 다음과 같이 할수 있다. * 참고 : Serial Number 가 Negative 인 경우 그 값에 65536 을 더해야 함. rem sqlplus system/manager rem rem prompt Enter table name accept tname CHAR col type format a6 col object_name format a20 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=upper('&amp;tname'); Prompt Enter session ID(SID) ? accept sid Prompt Enter serial number(serial#) ? prompt -- if serial number < 0, prompt -- then serial number #=Serial number + 65536 accept serial alter system kill session '&amp;sid,&amp;serial'


==================================================================================
ORA-00060 : DEADLOCK과 INITRANS (같은 TABLE내의 다른 범위의 DATA처리시 ORA-60)
==================================================================================

 deadlock에  관한  일반적인  사항은  <Bul:11742>에  정리되어  있다.  같은  data를  동시에   변경하는
 transaction의 경우  deadlock이 발생하는  것은 application  logic을 수정하여  해결해야 하는  경우가
 대부분이다.

 그런데 같은 table에 대해서 동시에 수행되는  transaction이 각자 서로 다른 data를 처리하는  경우에도
 ora-60(deadlock detected while waiting for resource)이 발생할 수 있다.

 예를 들어 한 transaction은 A table의 1월 data를 처리하고, 동시에 다른 transaction은 같은 A  table의
 2월 data를 처리하는 것과 같은 경우이다.

 이러한 경우에도 initrans가  작게 설정되어 있으면,  ora-60이 발생할 수  있는데, 이 자료에서는  이와
 같이 다른 data를 처리하는 transaction들 사이에서의 ora-60이 발생하는 경우와 조치사항을 확인한다.

  1. transaction entry에 대해서
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 table이나 index에 포함된 모든 block에 update/delete/insert와 같은 dml을 수행하기 위해서는 일단  그
 block에 transaction정보를 저장시킬 transaction entry를 확보한 후에 원하는 작업이 수행가능하다.

 이  transaction entry의  크기는 os  dependent하기는 하나  대부분 23  bytes이며, table이나   index의
 initrans  option에 의해,  미리 확보되는  block당 transaction  entry의 갯수가  결정된다. default는
 table이 1, index가 2이다.

 이  transaction  entry가  특정 transaction에  할당되면  그  transaction이 commit이나   rollback되기
 전까지는 다른 transaction에서  사용할 수 없다.  같은 block에 다른  transaction이 dml을  수행하려면,
 남은 공간중에서 23 bytes의 transaction entry를 새로 할당하거나, 공간이 없으면 앞에서 먼저 사용중인
 transaction이 commit/rollback되기를 기다려야 한다.

  2. ORA-60이 발생하는 경우
  ~~~~~~~~~~~~~~~~~~~~~~~~~
 deadlock을 유발시키는 transaction이 서로간에 완전히 다른 data(같은 table)를 처리하더라도 그  data가
 같은 block에  함께 들어가  있는 경우라면  ORA-60이 발생할  수 있다.  즉, transaction  entry를  잡는
 과정에서  block내에 남은  space가 부족한   경우, 서로  상대방의 transaction이  종료되기를  기다리는
 deadlock이 발생가능하다는 것이다. 아래에 실제 예를 들어 자세한 발생 시나리오를 정리하였다.

① ORDER table은  날짜별로 data가 추가,    변경, 삭제되는 100만건  이상의 data를 가진  table이다. 이
 table에   대해서   월별로   통계작업을  수행하는데,   6개월씩   처리하기   위해  6개  transaction을
 동시에 수행하였다. 즉, T1은 1월 data, T2는 2월 data, T6는 6월 data를 처리하는 식이다.

② ORDER table은 initrans값이 1로 지정되어 있고 현재 1000개의 block이 이 table에 할당되어 있다.

③  100번지  block에  2월,  3월,  5월  data가  함께  저장되어  있다.  200번지  block에는  2월,   3월
 data가 저장되어 있다.

④ T2  transaction이  100번지  block에  이미  확보되어  있는  1개의  transaction   entry를  사용하여
 transaction정보를 저장하였다. 그리고, 2월달 data에 대한 작업을 수행하였다.

⑤ T3 transaction이 200번지 block에 initrans  1에 의해 확보되어 있는 23 bytes의  transaction entry를
 이용하여 transaction정보를 저장한 후 3월달 data에 대한 처리를 수행하였다.

⑥ T2 transaction이 2월달 data중 나머지 부분을  처리하기 위해 200번지를 access하여 23 bytes의 T2  를
 위한   transaction     entry를   확보하려고      하였으나,   block에     남은   공간이      없어서,
 T3 transaction이  commit할때까지   기다린다.   5번  단계에서,    initrans에  의해  미리    확보되어
 있는 공간을  사용하는 T3 transaction이 종료되면, 그 부분을 T2가 사용할 수 있게 되는 것이다.

⑦ T3  transaction도  100번지에  있는 3월  data를  처리하기  위해  100번지내에 transaction   entry를
 추가적으로   확보하려 하였으나,    공간이 없어서,    마찬가지로  미리   100번지 block을    사용하고
 있는 T2 transaction이 종료되기를 기다리게 된다.

⑧ 6과 7상황에  의해 T2와 T3  transaction은 서로 상대방이  종료되기를 기다리는, deadlock이  발생하게
 되므로   deadlock상황을  유발시킨     T3   transaction이   ORA-60을    발생시키면서   종료   되고,
 T3  transaction은   rollback된다.  200번지에   확보한    transaction   entry부분도  반환하여   다른
 transaction이 사용가능한 상태가 된다.

⑨ 8번에서 release된 200번지  block내의 transaction entry 23  bytes를 6번 단계에서 기다리고  있던 T2
  transaction이 확보하고 작업을 진행한다.

  3. deadlock을 피하기 위한 방법
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

결론적으로,  같은  table에 대해서  다른  data를 처리하는  transaction이라  하더라도 동시에  수행하는
transaction이 많은 경우라면 initrans 값이 작은 경우 ora-60이 발생할 수 있게 된다.

하나의 table에 대해서  performance등의 이유로 동시에  다른 data를 처리하는  transaction을 수행하고자
한다면,  table의  initrans  값을  크게하여,  하나의  block에  여러  개의  transaction이  dml  처리를
수행하더라도 space가 부족하여 기다리는 상황은 없도록 하여야 한다.

initrans를 n으로 지정한다면 23*n bytes가 항상 transaction entry로 미리 확보되어 있는 것이다.  이렇게
transaction entry로 초기에 확보된  공간은 data를 저장할 수  없는 공간이 되므로, 너무  크게 하는 것은
space 낭비가 초래된다. 하나의 block에 대해서  동시에 여러 transaction이 처리되지 않는 경우라면  미리
확보된  transaction entry는  사용도 되지  않고 낭비되어,  full table  scan 등의  작업에 성능  악화만
초래하게 된다.

initrans값은 하나의 table에 대해서 동시에  처리하는 transaction의 갯수 이하로 지정하도록  한다. 해당
table에  대한  동시  transaction의  갯수만큼 initrans를  지정하면  앞에서  설명한  상황의 deadlock은
발생하지 않는 것이 보장되나 space를 고려할 때 그 보다는 약간 작게 하는 것이 일반적인다.

initrans는 table이나 index에  대해서 create나 alter문장시  지정, 변경이 가능하나,  alter의 경우 이미
확보된 block에는 영향을 미치지 못하므로 export/import를 이용하여 새로 지정하는 것이 필요하다.

다음에 scott.dept table에 대해서 예를 들었다. column정의 storage등은 임의의 값을 예로 사용한 것이며,
initrans도 예로 3을 지정하였다.

  os> exp scott/tiger file=test.dmp tables=dept

  os> sqlplus scott/tiger
  SQL> drop table dept;
  SQL> create table dept (deptno number(2), dname varchar2(10))
	   initrans 3
	   storage(initial 10m next 2m pctincrease 0);

  os> imp scott/tiger file=test.dmp tables=dept ignore=y




======================================================================
ORA-00210 : TABLE에 TRANSACTION이 종료되지 않은 경우
======================================================================

Sequent Symmetry  or NUMA-Q  platform의 Oracle  7.3.2, 7.3.3,  7.3.4 OPS  Product 설치  및 DB 생성후
Master node startup parallel 후 다른 node를 startup parallel 시 다음과 같은 현상이 발생할 경우.

◈ 현상
  SVRMGR> startup parallel

     ORACLE instance started.
     Total System Global Area     546275472 bytes
     Fixed Size                       39108 bytes
     Variable Size                210167756 bytes
     Database Buffers             327680000 bytes
     Redo Buffers                   8388608 bytes

  ORA-00210: cannot open control file '/dev/vx/rdsk/oracle/v_ctl1'
  ORA-07368: sfofi: open error, unable to open database file.
  SEQUENT DYNIX/ptx Error: 16: Device busy

  발생하면서 startup fail 발생

◈ 원인
  Sequent Symmetry or NUMA-Q platform이 very large file (O/S에서 2GB 이상의 file system 지원)을
  지원하기 위해  VLFS patch를  적용했거나 VLFS를   이미 지원하는  O/S Version일  경우 오라클  master
  node가 정상적으로  startup  되고  나서  다른  node가  startup  parallel이  될  때  먼저 startup 된
  master node가 shared disk 의 모든 오라클 관련 file을 none-shared mode로 open 하기 때문에 위의 현상
  이 발생됨

◈ 조치
  1) PTX/Cluster V1.3.2일 경우
     * Oracle  V7.3.x : O/S상에서 VLFS patch적용하지 않았을 경우는 관계 없으나, 이미 적용 되었다면
       추가적으로 O/S patch FP#23373 적용하여야 함
  2) PTX/Cluster running DYNIX/PTX 4.4.x 일 경우
     * Oracle V7.3.3 : 현재 fix된 patch는 없으며 다음과 같은 workaround 방법으로 해결이 가능함.

  (Workaround)
     $ORACLE_HOME/rdbms/lib/ins_rdbms.mk file에 아래의 추가된 부분만 삽입하여 오라클 kernel relink 실시
     (예:make -f ins_rdbms ioracle)
     oracle: $(ORALIBD) $(CORELIBD) $(NETLIBD) $(KSMS) $(CONFIG)
             $(PSOLIBLIST) opimai.o @$(ECHO) $(LINK) -o $@ $(LDFLAGS)
             $(LDFLAGS_ORA) opimai.o $(CONFIG) \r
             -llkseqora  ---> 추가된 부분
             $(LLIBSERVER) $(LLIBORA) $(LLIBKNLOPT) $(LLIBSLAX)
             $(LLIBPLSQL) \r
             $(LLIBSICX) $(LLIBSOWSUTL) \r
             $(LLIBSICX) $(LLIBSOWSUTL) \r

                ...........
                ...........

  * Oracle V7.3.4 :
    Oracle V7.3.4 일 경우는 문제가 없으나 patchset을 적용할 경우 V7.3.4.2에서는 V7.3.3과 같은
    방법으로 oracle kernel을 relink하면 문제가 해결됨.

======================================================================
ORA-00312, ORA-00313 : ONLINE REDO LOG CRASH
======================================================================

[ ONLINE REDO LOG가 손상되었을 때 DB에 OPERATION 이 없었던 경우는 다음과
같은 절차로 DB 을 OPEN 할 수 있다. - 확률 70% ]
-------------------------------------------------------------------------
1. CONTROLFILE 생성

-. 손상된 online log 는 포함시키지 않는다.
-. resetlogs option 으로 생성한다.
-. reuse option 은 생략하고 기존 controlfile 은 다른 이름으로 move 시킴.

<V7 에서 CONTROLFILE 생성하는 방법>
  sqldba> startup mount
  sqldba> alter database backup controlfile to trace;

  위와 같이 명령을 입력하면 ORACLE_HOME/rdbms/log 디렉토리에 트레이스 화일이다. 그 트레이스 화일에서
  create controlfile 명령부분을 남기고 삭제한다.

  (7.3 이상에서는 cd $ORACLE_HOME
                  cd ../../admin/SID dir/udump 에 있습니다)

콘트롤화일 생성 문장 예 - <cnt.sql> : GROUP 1 이 ONLINE LOG 라고 가정
--------------------------------------------------------------------------
 CREATE CONTROLFILE DATABASE 'RC722' RESETLOGS NOARCHIVELOG
 MAXLOGFILES 32        ********
 MAXLOGMEMBERS 2
 MAXDATAFILES 30
 MAXINSTANCES 8
 MAXLOGHISTORY 800
 LOGFILE
 GROUP 2 '/oracle/oracle/dbs/log2RC722.dbf' SIZE 5M,
 GROUP 3 '/oracle/oracle/dbs/log3RC722.dbf' SIZE 5M
 DATAFILE
 '/oracle/oracle/dbs/systRC722.dbf',
 '/oracle/oracle/dbs/rbsRC722.dbf',
 '/oracle/oracle/dbs/toolRC722.dbf',
 '/oracle/oracle/dbs/usrRC722.dbf',
 '/oracle/oracle/dbs/tempRC722.dbf',
 '/oracle/oracle/rcdata.dbf'
 ;

2.절차

$ sqldba lmode=y
 SQLDBA> connect internal
 SQLDBA> shutdown abort
 SQLDBA> startup nomount
 statement processed
 SQLDBA> @cnt
 SQLDBA> recover database using backup controlfile until cancel;
 ....
 ...
 CANCEL (Return)
 Recovery canceled
 SQLDBA> alter database open resetlogs;

 : 만일 정상적으로 open 되면 log file 추가
 SQLDBA> alter database add logfile '?/dbs/log1ORA722.dbf' size 1M;

======================================================================
ORA-00600 : BLOCK 손상 해결 방법
(ORA-600[3339], ORA-600[3398], ORA-600[4519], ORA-1578)
======================================================================

◈ 개요 
 블럭의 손상 원인은 여러가지가 있는데, 메모리내의 블럭이 손상된 경우와 디스크상의 물리적인 블럭이
 손상되는 경우가 있다.

 (1)  오라클  오류  블럭  손상과  관계된 오라클  오류는  internal error인  ORA-600중  첫번째 인수가
 3339,3398, 4519인  경우와 ORA-1578이  있으며, 이중  Ora-600[3398]은 메모리  블럭만 손상된 경우이고,
 ORA-1578은 물리적 블럭이 손상된 경우 발생한다. ORA-600[3339]와 ORA-600[4519]는 메모리와 디스크 손상
 모두가 연관될 수 있다. 각각의 오류에 대한 자세한 설명은 아래의 3번에서 기술하였다.

 (2) DBA (database address)  ORACLE 데이타  블럭은 블럭의 정보를 담은 Fixed Header를  갖고   있으며
 이 정보를 이용하여 각각의 블럭과  데이타베이스 전체의 INTEGRITY를 유지한다. DBA는  Fixed   Header의
 한  부분으로 32bit 길이의 정수이며  데이타베이스의 화일 번호와 파일에서 블록위치를  나타낸다.  블럭
 손상이  발생하면  오라클은 오류  메시지에  이 DBA를  나타내거나  파일 번호와  블럭  위치를
 십진수로 나타내기도 한다.

◈ 블럭 손상의 원인 
 오라클은 화일에 블럭을 읽고  쓸 때 lseek(), read(),  readv(), write(), writev()와 같은  OS의 system
 function  call을 이용한다.  블럭이 이러한  시스템콜을 이용하여  읽혀지거나 씌여진  후, 혹은  직전에
 오라클은 DBA에  대한 검사를  하여 블럭이  손상되었는지 확인하게  된다. 그러나  대개 블럭의 데이타가
 손상될 당시에는 그  사실이 드러나지 않다가  손상된 부분의 데이타가  사용될 때 비로소  손상된 사실이
 알려지게 되므로 대부분 블럭 손상은 OS나 HW에 의해 손상된 블럭을 이후 오라클이 사용하고자 검사하는
 과정에 발견하는 것이 대부분이다.

 블럭 손상이 야기될 수 있는 주된 상황은 다음과 같이 요약될 수 있다.

 (1) ORACLE 블럭내의 첫번째 OS 블럭이 디스크상의  문제로 해서 이상이 있는 경우, OS 또는  디스크 복구
  프로그램이 해당 블럭을 복구하려는 과정에서 블럭의 값이 모두 비정상적적으로 0이 되어 버릴 수 있다.

 (2) 매우 드문  경우이긴 하지만, 메모리상에서  이미 손상된 블럭을  디스크상에 그대로 기록하는  경우
  물리적 블럭의 DBA가 틀리게 된다

 (3)  블럭이   데이타  화일상에   기록될  위치를   잘못  찾아   손상이  발생하기도   하는데,  이러한
  경우를 'write blocks   out  of  sequence'  라고   불리운다. 이것은   ORACLE이  lseek()을  호출했을
  때 OS가 블럭을 잘못된 곳에 기록해서   생기는  경우가 많다.  이러한   예는 4.2G를  넘는 큰   화일을
  다룰 수  있는   기능을 제공하는  HW/OS의   경우  발생한다.   4.2G를   넘는  화일의  경우,    32bit
  unsigned number로 다룰   수 있는 범위를  벗어나기   때문에 OS는offset   값을  ORACLE이  사용할  수
  있도록 적절히 변환시켜야  한다. ORACLE은  OS의 지원  여부와  관계없이 2G  이상의  화일을  지원하지
  않으며 위와  같은  큰   파일을 다룰    수 있는   환경에서는 lseek()   시스템콜이 정확한   위치로의
  변환을 시켜주지 못함에 따라 보다 작은 크기의 화일에서도 문제가 발생하는 경우도 있다.

 (4) 네번째 원인은  I/O기능이 전혀 작동하지  않는 경우이다. ORACLE은  lseek(), read() 시스템  콜이
  리턴하는 에러 코드를 검사하며 read()가   읽어들인 바이트수가 BLOCK SIZE의 정수배인지를   검사한다.
  이 검사를   통과하면  ORACLE은  성공적으로  READ가   수행되었다고 가정한다.   만약  DBA가 정확하지
  않다고 체크되면 DATABASE에 대한 읽기 요구는 실패하기 때문에 실제의 블럭 읽기는 일어나지 않는다.

 (5)  다른  원인은  동일한  디바이스에서  다른 블럭을  읽어온  경우이다.  이것은  작업이  메우  바쁜
  디스크에서  발생하곤  한다.   어떤 경우에는   수백개  이상  떨어진  곳의   블럭을 읽어오는  경우도
  있다. 이러한 경우와 위의   (4)번의 경우에는 다시  한번  동작을 반복함으로써  문제는 해결  수 될 수
  있으며 이것은 일반적으로 ORACLE의 문제가 아니라 OS나 HW의 문제인 경우가 많다.

◈ 블럭 손상과 관계된 오류의 종류와 가능한 조치방법
 (1) ORA-600[3339] 
  ORA-600[3339]에러는  ORACLE이  직접  버퍼로  데이타를 읽어들일  때  읽은  블럭의  DBA (Data  Block
  Address)가 잘못되었음(INVALID)을  의미한다. 실제로  읽어들인 블록의  DBA와 ORACLE이  읽고자 하였던
  블럭의 DBA가  다르면 위에서와  같은 에러가  발생하며 주로  OS나 HW의  문제가 그 원인이 되는 경우가
  많다.  만약  메모리에  문제가  있다고  생각된다면  다음과  같은  Event  Parameter를  initSID.ora에
  추가함으로써 블록 검사를 할 수 있다. 이것은 ORA-600[3398], ORA-600[4519]에서도 마찬가지이나 이러한
  event를 사용하기전에 먼저 한국오라클에 지원을 요청하는 것이 바람직하다.

  event = '10210 trace name context forever, level 10'
  event = '10211 trace name context forever, level 10'

 ORA-1578이 함께  발생하는 디스크  블럭 손상이  발생하였다면, 아래의  (4)의 ORA-1578해결 방법과 같이
 조치 하면 된다.

 (2) ORA-600[3398]
  DBWR가 디스크에 데이타를  쓰기 전에 캐쉬에서  손상된 블럭을 발견하면  OERI(3398) 메시지를 출력하고
  인스턴스를 정지시킬 것이다. 따라서 문제의 블록은 디스크에 저장되지 않으므로, 실제 디스크상의  블럭
  손상은 야기시키지 않는다. 이때 DBA를 포함한 많은 인수들이 OERI(3398) 내부 에러 처리기에 전달되므로
  이것을 확인하여 한국 오라클에 지원을 요청한다.

 (3) ORA-600[4519] 
  메모리내의 블럭을 update/delete가 아닌 consistent  read를 위해 읽고자 할때 블록이  손상됨을 발견한
  경우, ORA-600[4519]가  발생한다. 이  오류는 메모리  손상과, 디스크  손상 모두의 경우 발생가능하며,
  오류가 발생하는 즉시 한국오라클에 지원을 요청하는 것이 바람직하다.

 (4) ORA-1578 ORA-1578 에러는 ORA-600[3339] 에러와 함께 발생하곤 하며 디스크상에 물리적으로  블럭이
  손상되었음을 의미한다. 이러한 디스크 블럭 손상의 복구방법을 살펴보자.

(a)손상된  블럭을  포함하고  있는  세그먼트  확인  ORA-1578  에러가  발생하면  Corruption이 발생한
  화일번호와 블럭번호를  알려준다. 여기서는  이 때의  파일번호를 f,  블럭번호를 b라고 부르기로 한다.
  우선 해야할 일은 어떠한 오브젝트가 Corrupt되었는가를 알아내는 것으로써, 다음의 스크립트를 이용하면
  알 수 있다.

 SQL> select  segment_name, segment_type
        from  dba_extents
    where  file_id = f
         and  b between block_id and block_id + blocks - 1;

(b) 해당 세그먼트가 인덱스이면 Drop 시키고 다시 생성하면 된다.

(c) 해당  세그먼트가 테이블이면  Corrupt 된  블럭의 데이타는  손상된 것이다.이렇게 테이블이 손상된
  경우, 만약  해당 테이블이 들어있는 엑스포트 화일이   있다면 손상 된 테이블을  Drop 시키고  임포트
  받는것이 제일  간단한 방법이다. 하지만 만약  엑스 포트 받은 화일이  없거나 백업해 둔 화일도 없다면
  해당 테이블에 인덱스가 생성되어 있는 경우에 한해서 다음의 방법을 사용해서 복구를 하도록 한다.

 예를 들어 다음과 같은 에러 메시지가 떨어졌다고 하자.
 01578, 00000, 'ORACLE data block corrupted (file # 10, block # 4)

<1> 먼저 (a)번의 script를 이용하여 손상된 블럭을 포함하는 세그먼트를 확인한다.
   SQL> select  segment_name, segment_type  
        from  dba_extents  
       where  file_id = 10
            and  4 between block_id and block_id + blocks - 1;

         SEGMENT_NAME        SEGMENT_TYPE
         ------------        ------------
             EMP                 TABLE

<2> Rowid를 이용하여 손상된 블럭내의 데이타를 찾아낸다.
 위의 결과값이 EMP table이 empno, ename,  deptno 를 컬럼으로 가지며, empno 컬럼에  인덱스가 생성되어
 있다고  하자.클러스터화되지  않은   모든  테이블은  유니크한Rowid를   가진다.  Rowid는  총   18자로
 블럭어드레스(8자), 점(1자),  로우 어드레스(4자),  점(1자), 화일  어드레스(4자)로 구성되어  있다. 이
 rowid를 이용하여 다음과 같이 손상된 블록에 있는 employee 에 대한 empno를 구할 수 있다. 이때 empno가
 char type 이라면 [where empno > 0] 대신 [where empno > ‘ ‘]를 사용하여 empno에 대한 인덱
 스를 사용하도록 유도한다. 

    SQL> select  empno  
           from  emp
          where  empno > 0 
            and  rowidtochar(rowid) like '00000004.%.000A';  

        EMPNO           ROWID  
    ------------  ------------------------------
        500      00000004.0000.000A
        501      00000004.0001.000A

<3> EMP 테이블과 같은 구조를 갖는 새로운 테이블을 만든다.
    SQL> create table temp 
             as select * from emp 
          where 1 = 2;  

<4> 손상된 부분을 피해서 새로운 테이블에 손상된 테이블의 데이타를 추가한다.
    SQL> insert into temp select * from emp where empno < 500; 
    SQL> insert into temp select * from emp where empno > 501;

<5> 손상된 테이블인 EMP테이블을 Drop시키고 Temp테이블의 이름을 EMP로 변경한다.
    그리고 백업된 자료나 문서자료를 통하여 손상된 부분에 대한 정보를 추가한다.
    SQL> drop table emp;  
    SQL> rename temp to emp;

<6> 손상된 블럭에 대부분의 로우가  존재하고 있다면 다음의 방법을 이용한다.
   SQL> create table empnos as  
         select empno from emp
         where empno > 0  
          and rowidtochar(rowid) not like '00000004.%.000A';

   이 스크립트를 이용하면 손상된  블럭에 포함되지 않은 empno 들을 알 수 있다.
   다음의 스크립트를 계속 실행시켜 복구를 한다.

    SQL> create  table temp  as select * from emp  where 1 = 2;
    SQL> insert  into temp
         select  emp.empno, emp.ename, emp.deptno
       from  emp, empnos
     where  emp.empno > 0
       and  emp.empno = empnos.empno;

<7>  만약  데이타  딕셔너리의  테이블이나 인덱스에서  손상된  블럭이  발생했다면  지원 을  요청해야
 한다

======================================================================
ORA-00604: 익스텐트가 가득 찬 경우
======================================================================

 이 에러는 내부적으로 SQL명령이 실행될 때 발생한다. 예를 들어 현재 할당된 익스텐트가 가득 차서  다음
 익스텐트를 할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여  SELECT명령을
 내리게 되는 것과 같은 경우이다.

 * 이 문제가 발생하면 우선 alert.log 화일을 검사하여 ORA-600 과 같은 에러가 발 생했는가를  확인한다.
 ORA-600 에러가 발생했다면 오라클측에 지원을 요청 하도록 하고 그렇지 않다면 다른 원인을 검사해 봐야
 한다.

 * 가장 먼저 고려할 사항은 init.ora 화일에 지정된 open_cursors의 크기를 알아보는  것이다.
 이 값이 설정이 안되어 있으면 Default가  50이므로 open_cursors=255 와 같이 설정하도록 한다.  이 값은
 단지 커서의 최대 값을 지정하는 것이므로 커서를  적게 쓰 는 프로그램에 아무런 영향을 끼치지  않는다.
 open_cursors를 변경하고 DB를 tdown 하고 Startup 시키면 된다.

 * 만약 이 방법으로  해결이 안되면 다음의 방법을  따른다. 정확한 에러의 원인을  찾기 위해서 init.ora
 화일에 다음과 같은 라인을 추가한다. events = '604 trace name errorstack' 이렇게 init.ora를 변경하고
 DB를 Shutdown 하고 Startup  하면 ORA-604 에러가 발생하는 경우에 자세한 정보를  Trace 화일에  기록해
 주므로 이 화일을 검사하여 에러의 원인을 찾을 수 있다.

 * 에러의 다른 원인으로는 init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS나 ROW_CACHE_ENQUEUES의  값
 이 너무 작게 설정된 경우를 생각해 볼 수 있다. 이와같은 경우는 이들 값을 크게 설정해 주도록 한다.

 * 테이블 스페이스가 가득 차거나 Extent  갯수의 최대 허용값을 초과해서 에러가 발생하는  경우 ORA-604
 에러가 함께 발생할 수가 있는데 이와같은 경우에는 이들 문제를 먼저 해결하면 ORA-604 에러는 함께 해결
 된다. 

======================================================================
ORA-01046, ORA-01050, ORA-01051 : CONTEXT SIZE & CURSORS
======================================================================

1. Context size 에 관련한 error message
.ora-1046 :can't acquire space to extend context area.
.ora-1050 :can't acquire space to open context area.
.ora-1051 :maximum context area extents exceeded.

2. Context size란 무엇인가?

(1) 쉽게 말하면 Cursor의 initial size이다 .
즉, Cursor 에 allocate 되는 user memory 이다.
(2) 이는 init.ora 의 CONTEXT_SIZE 에 의해 결정된다.
(3) Cursor 에 할당되는 additional space 는 CONTEXT_INCR 에 의하며 50 extents를 갖는다.
(4) Recommended context size 와 increment 는 4096 bytes(4K) 이다.
(5) SQL statement가 수행시마다 cursor 가 open 되며,같은 cursor가 reuse 되도록 design 되어 SQL*PLUS
    session은 2-3 개 이상 open 되어지지 않는다.
    그러나 SQL*FORMS 는 여러 다른 task 를 수행하므로 많은 cursor를 open한다. (100 or more)

(6)Cursor 가 hold 하는 item
* the SQL statement
* the parsed SQL statement
* one row of the result

3 ORA-1051 은 무엇이 문제인가?
(1) cursor 의 size 를 줄인다
(2) CONTEXT_SIZE,CONTEXT_INCR 를 늘린다.

4 OPEN_CURSORS 수를 줄이는 전략 .
(1) Commit을 자주한다.
(2) Synonym이나 view 를 사용하지 않음으로써 implicit cursor 수를 줄인다.
(3) SQL*FORMS 에서 select 문대신 #COPY 로 바꿔 사용한다.
(4) SQL*FORMS 에서 large forms를 여러개의 작은 forms 로 나눈다
(5) ASAP, EXEC SQL CLOSE C1; 을 수행한다.
(6) HOLD_CURSOR=NO &amp; RELEASE_CURSOR=YES 를 사용한다.

======================================================================
LK FILE에 대하여 (ORA-1102에 대한 원인 설명)
======================================================================

> Unix 용 Oracle7.3.3  이전의 version에서는 parallel  server mode(OPS)로 운용하지  않더라도 서로 다른
 ORACLE_SID를 이용하는  두개의 instance가  하나의 database를  동시에 mount하는  것이 경우에 따라서는
 가능할  수도  있었다 (<Bug:272030>).  이  경우, 서로  독립적인  두개의 instance가  동일한  database
 file들을 동기화  (synchronisation)없이 access할  수 있기  때문에 database  corruption을 유발시킬 수
 있었다.

 Unix system에서의 이러한 문제를 회피하기 위하여  7.3.3부터 'mount lock' file이 이용된다. 이  file은
 그 size가 0 byte, 생성되는 위치는 $ORACLE_HOME/dbs 이며 그 이름은 lk<DB_NAME> 이다.

 Oracle이 database를 mount할 때 lk<DB_NAME> file과 관련하여 다음과 같은 절차를 수행한다.

 1.  file name의  'DB_NAME' 부분은  db_name parameter를  이용한다. 예를  들어, db_name=V803  이라면
 사용되는 lock file의 위치와 이름은  '$ORACLE_HOME/dbs/lkV803'이 된다. 2. 만약 해당  file이 존재하지
 않는다면 생성한다. 존재한다면 file을 open한다. 3. 이 file에 exclusive Unix file lock을 설정한다.

 위의 과정 상에서 문제가  발생된다면 해당 instance는 db를  mount할 수 없으며 ORA-1102('cannot  mount
 database in exclusive mode')가 return된다.

 Releasae  7.3.3  이전에서는  동일한  $ORACLE_HOME, 동일한  db_name을  이용하는  두  개의 database를
 $ORACLE_SID만 다르다면 동시에 open하여 사용할  수 있었다. 그러나 lock file이  사용되는 7.3.3부터는,
 lock  file의 이름에  db_name이 이용되기  때문에 어느  한쪽의 db_name을  변경해야만 동시에  open하여
 사용할  수가  있다.(db_name의  변경은  controlfile을  재생성함으로써  가능하다.)  이렇게 database의
 db_name이 변경되면 각각의 lk<DB_NAME> file을 생성하여
이용하게 된다.


참고 사항
--------

1. database를 구동하고 있는 instance가 있을 때에는 lk<DB_NAME> file은
   삭제하지 않도록 한다.

2. database가 shutdown되더라도 lk<DB_NAME> file은 삭제되지 않고 존재한다.
   따라서 이 file의 유무를 가지고 database의 구동 유무를 판단할 수 없다.

3. lk<DB_NAME>의 DB_NAME은 SID와는 다를 수 있다. SID가 아닌 DB_NAME을 이용함에 주의.

4. lock file과 관련하여 다음의 error들이 발생될 수 있다.
   ORA-9992 scumnt: failed to open <FILENAME>
   ORA-9993 scumnt: failed to lock <FILENAME>
   ORA-1102 cannot mount database in exclusive mode

======================================================================
ORA-1118 조치 방법 : MAXDATAFILES와 DB_FILES PARAMETER
======================================================================

 테이블 스페이스를  만들거나 데이타  화일을 추가하다  보면 ORA-01118:  cannot add  any more database
 files: limit of XXX exceeded와 같은 에러가 발생하는 경우가 있다. 오라클의 데이타 화일의 최대 갯수는
 MAXDATAFILES와 DB_FILES 에  의해서 제한을  받는데 여기서는  이 에러를  해결하는 방법을  알아보기로
 한다.

  * 데이타베이스를  처음 만들  때 사용되는  CREATE DATABASE  명령에서 MAXDATAFILES  라는 파라미터를
 찾아볼 수 있다.  여기서 지정된 값(명시를  안하면 디폴트로 설정)은  콘트롤 화일에 기록된다.  이 값은
 데이타 베이스에  대해서 설정된  최대 데이타화일  갯수이다. 이  값을 변경하려  면 콘트롤 화일을 다시
 만들어야 한다. 

  * 한편, init.ora(UNIX에서는 init<SID>.ora, VMS에서는 <node>_<ora_sid>_init.ora)  에는 DB_FILES라는
 파라미터가 있는데 이 값은 해당 인스턴스에 대해서 지정된 최대 데이타화일 갯수이다. DB_FILES는 단순히
 에디터 상에서 init.ora 화일을 수정한 다음 에DB를 Restartup 하면 새로운 값이 적용된다.

 1. 왜 MAXDATAFILES 와 같은 한계값을 설정하는가?    
 * O/S는 오라클 화일의 갯수를 지정하기  위하여 특정한 갯수의 bit를 사용하며 이 값은 Platform에 따라
 다르다. MAXDATAFILES는 이 값의 영향하에 있게 된다. 일반적인 최대 값은 다음과 같다. 

 V6 V7
 UNIX 62 1022
 VMS  254 1022
 DOS  254 NA 
[참조]일부 유닉스 Platform상의 V7.0.16 이전 버전의 경우 1022보다 작은 경우도 있다.

2. 왜 MAXDATAFILES 값을 가능한 최대로 설정해 두지 않는가? 
  * MAXDATAFILES 를 크게 지정하면 그만큼 콘트롤 화일의 크기도 늘어나기 때문이다.

3. 왜 DB_FILES를 MAXDATAFILES 의 크기만큼 크게 설정해 두지 않는가? 
 * DB_FILES를 늘리면 각 User Process 에 할당되는 PGA(Program Global Area)의 크기가 커지기 때문이다. 

4. 사용하는 시스템의 MAXDATAFILES를 알 수 있는 방법은? 
  * 시스템에 따라서 다르므로 Installation Guide 를 참조해야만 한다. 

5. 콘트롤 화일의 위치를 아는 방법은? 
  * SQLDBA> show parameter control_files;
      또는 
   SQLDBA> select * from v$controlfile; (7.0.16 이상)
  위의 Query 를 이용하거나 $ORACLE_HOME/dbs/config.ora 화일을 보면 알 수 있다.

 [ORA-1118 해결방법] 
 * ORA-1118 에러는 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생한다. DB_FILES 값에 도달한
 경우라면 ORA-59 에러가  발생한다. ORA-59 에러는  init.ora 의 DB_FILES  를 늘려주고 DB  를 Restartup
 하면 해결 되지만 ORA-1118 에러는 이와같이  간단하게 해결되지는 않는다. 다음과 같은 방법이  있다. 
 
 1. 여러개의 데이타화일로 구성된 테이블 스페이스가  있으면 이를 Export 받고 테이블 스페이스를 Drop한
 다음 하나의 큰 데이타화일을 갖도록 테이블 스페이스를 만들고 Import를 한다.  
 
 2. V6.0.33 이전 버젼을 사용중이라면 MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며  그 이후 
 버전을 사용중이라면 콘트롤 화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다.

 <V7에서 콘트롤화일을 만드는 방법>
 * DB가 mount 또는 open 된 상태에서
  SQLDBA>alter database backup controlfile to trace;  
 와 같은 명령을 내리면 <user_dump_dest>에 지정된  디렉토리에 트레이스 화일이 하나 생긴다. 이  화일을
 찾으려면  해당 디렉토리에서  가장 최근에  생긴 트레이스  화일을 찾으면  된다. 
 
 * 이 화일을 다른 이름으로   복사한 다음   에디터로 열어서   CREATE CONTROLFILE 명령부분 외의 불필요
 한 부분은  지우고 MAXDATAFILES를  늘려  준다. 이  화일의  이름을 newctl.sql로  하기로 한다. 
 
 * DB를 NORMAL 또는 IMMEDIATE로 Shutdown하고, 콘트롤 화일 생성시 DB 영향을 줄 수 있기 때문에 만약을
 위해서 DB 전체를 백업 받도록 한다. 
 
 * 현재 사용중인 콘트롤 화일을 다른 이름으로 옮기고 다음을 실행한다. 

 SQLDBA> startup nomount  
 SQLDBA> @newctl  
 SQLDBA> alter database open noresetlogs;

 * 이제 필요한 모든 작업은 끝났지만 여기서 다시 한번 Full Bakcup 을 받는 것이 좋다.

[ 참고 ]  다음은 콘트롤 화일을 생성하는 명령의 예이다.

 SQLDBA> CREATE CONTROLFILE
      DATABASE ORACLE
      LOGFILE '/users/oracle/dbs/log1ORACLE.dbf',       
                 '/users/oracle/dbs/log2ORACLE.dbf',       
                 '/users/oracle/dbs/log3ORACLE.dbf'   
         NORESETLOGS  
         DATAFILE '/users/oracle/dbs/systORACLE.dbf',       
                  '/users/oracle/dbs/rbsORACLE.dbf',       
                  '/users/oracle/dbs/tempORACLE.dbf',       
                  '/users/oracle/dbs/toolORACLE.dbf',       
                  '/users/oracle/dbs/usrORACLE.dbf'
         MAXDATAFILES 121;
</p>
<p align="right"><A target='_blank'  class='con_link' href="#top"><img src="../images/top.gif" width="33" height="37" border="0"></a></p>
</td>
</tr>

<tr>
<td width="578">
<p>
======================================================================<br />
<b><A target='_blank'  class='con_link' name="ORA-01157">ORA-01157</a>,
<A target='_blank'  class='con_link' name="ORA-01110">ORA-1110</a></b>
:OS 명령으로 DATAFILE을 삭제한 경우<br />
======================================================================<br />
</p>

<PRE><XMP>
 DATABASE RECOVERY에 앞서  ORACLE INSTANCE(즉, ORACLE  RDBMS)의 STARTUP단계를 우선  살펴보기로 하자.
 첫번째 단계로 INSTANCE를 START시키며,  여기서는  initORACLE_SID.ora 화일의 파라미터를 참조하여 SGA
 (SYSTEM GLOBAL AREA)를 할당하고 백그라운드 프로세스를 START 시킨다. 두번째 단계로 DATABASE의 MOUNT
 이며 파라미터 화일에 명시된 CONTROL  FILE을 오픈한다. CONTROL FILE로부터 DATABASE  NAME과 REDO LOG 
 FILE의 이름을 읽는다.
 세번째 단계로 CONTROL FILE 내의 정보를 이용하여 모든 데이타 파일을 오픈한다.

 SVRMGR> CONNECT INTERNAL;
 Connected.
 SVRMGR> STARTUP;
 ORACLE instance started.
 Database mounted.
 Database opened.
 Total System Global Area 1913196 bytes
 Fixed Size 27764 bytes
 Variable Size 1787128 bytes
 Database Buffers 65536 bytes
 Redo Buffers 32768 bytes

 RDBMS의 STARTUP시 문제의 데이타 화일이 CONTROL FILE 정보에서는 존재하지만, 실제로 O/S상에서는 존재하
 지 않으므로 DATABASE OPEN 단계에서 삭제된 데이터 화일을 OPEN할 수 없다. 따라서 다음과 같은 데이타 화
 일 오픈에 관련된 에러가 발생된다 :

 SVRMGR> STARTUP;
  ORACLE instance started
  Database mounted
  ORA-01157 : cannot identify data file 11 - file not found
  ORA-01110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
  Attempting to dismount database .... Database dismounted
  Attempting to shutdown instance .... ORACLE instance shut down

 DATABASE OPEN단계에서 CONTROL FILE에서는 ORA-1157에러에서 나타난 11번  데이타 화일이 존재하는 것으로 
 인식하지만, 실제로 O/S상의 데이터 화일 (ORA-1110에러에 명시된 '/user1/oracle7/dbs/user2.dbf' 파일)이
 삭제된 상태이다.

 이러한  경우에는  DATABASE  STARTUP 시  STARTUP  MOUNT  단계까지 실행한  후,문제의  데이  터 화일을
 OFFLINE시킨 다음 데이타베이스를 오픈한다. 단, 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한
 데이타 파일을 포함하고  있는 TABLESPACE를 DROP하지  않을 경우에는 DATABASE  STARTUP 시 항상  데이타
 파일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의 DROP 전에
 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

 데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
 먼저 SVRMGR을 Line Mode로 기동시킨다.

 $ svrmgrl
 SVRMGR> CONNECT INTERNAL;
 SVRMGR> STARTUP MOUNT;
  ORACLE
  instance started.
  Database
  mounted.

 SVRMGR> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf' OFFLINE DROP;
  Statement processed.

 SVRMGR> ALTER DATABASE OPEN;
  Statement processed.

 SVRMGR> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
  Statement processed.

 (이와 같이 offline  drop된 datafile을 포함하는  tablespace는 drop하여야 한다.  이 tablespace에 다른
  datafile도 포함되어 있다면 export를 받아낸 후 tablespace를 drop하고 재 생성 후 import하도록 한다.)

 정상적으로 DATABASE가 Open된 후 CONTROL FILE로부터의 데이타베이스 정보를 갖는 DATA DICTIONARY TABLE
 인 V$DATAFILE(SYS USER에서 액세스 가능)의  내용과 데이타베이스 화일에 관한 정보를  가지고 있는 DATA 
 DICTIONARY VIEW인 DBA_DATA_FILES(SYSTEM USER)을 조회하면 아래와 같은 내용을 확인할 수 있다 :

(1) SQL> SELECT * FROM V$DATAFILE ;
    FILE#   STATUS                 NAME
    -----  --------   --------------------------------------
      9     ONLINE      /user1/oracle7/dbs/tools.dbf
      10    ONLINE      /user1/oracle7/dbs/user1.dbf
      11    RECOVER     /user1/oracle7/dbs/user2.dbf

(2) SQL> SELECT * FROM DBA_DATA_FILES ;
          FILE_NAME              FILE_ID     TABLESPACE_NAME STATUS
   ----------------------------  --------   --------------------------
   /user1/oracle7/dbs/tools.dbf    9         TOOLS AVAILABLE
   /user1/oracle7/dbs/user1.dbf    10        TEST AVAILABLE
   /user1/oracle7/dbs/user2.dbf    11        TEST AVAILABLE

====================================================================== ORA-01403 조치 방법 : EXPORT 실행시 ======================================================================

 EXPORT 실행시 ORA-1403이 발생되는 경우가 있는 데,  이 에러는 테이블 혹은 인덱스에 문제가 있는  경우
 발생할 수 있다. 여기서는 ROWID를 사용하여 테이블을 복구시키는 방법을 소개한다.

1. 기존 테이블과 같은 구조를 갖는 테이블을 만든다.

SQL> CREATE TABLE TEMP 
2>   AS SELECT  * 
3>        FROM EMP 
4>       WHERE 1=2; 

2. 기존 테이블에서 RECORD를 FETCH하여 새로운 테이블에 입력.
이 때, INDEX가 설정되어 있는 COLUMN을 WHERE 조건에 부여함. 

<CREATE.SQL>
 declare 
 row_id char(18); 
 cursor c1 is select rowid 
                from emp 
               where empno > 0; --empno에 index 
 begin 
   open c1; 
   loop 
     fetch c1 into row_id; 
     insert into temp select * from emp where rowid=row_id; 
     exit when c1%notfound; 
   end loop; 
 end; 
/ 

3. create.sql file실행 
sql> @create
</XMP</PRE>

<p align="right"><A target='_blank'  class='con_link' href="#top"><img src="../images/top.gif" width="33" height="37" border="0"></a></p>
</td>
</tr>


<tr>
<td width="578">
<p>
======================================================================<br />
 <b><A target='_blank'  class='con_link' name="ORA-01547">ORA-01547</a></b>
조치방법 :ORACLE 블럭을 할당받지 못할 경우<br />
======================================================================<br />
</p>

<PRE><XMP>
 ORA-1547 에러 발생의 원인으로는,  TABLESPACE가 에러에 명시된 만큼의  연속된 ORACLE BLOCK 수의  FREE
 SPACE를 갖고있지 못해서 새로운 EXTENT를 할당하지 못 하기 때문이다.

 ORA-1547 에러는 일반적으로 다음과 같은 과정에서 발생할 수 있다. 

 1) 데이타 INSERT나 UPDATE시 DATA SEGMENT가 차지하게될 연속적인 ORACLE 블럭을 할당 받지 못할  경우에
 발생한다. 

 2) 인덱스를 생성할 경우에 발생한다. -  ROLLBACK SEGMENT가 사용할 RBS 또는 USER  TABLESPACE의 영역이
 부족 하여 발생할 수 있다. -  인덱스 생성시 SORT 영역으로 사용되는 TEMPORARY  TABLESPACE내의 SPACE의
 부족 으로 발생할 수 있다. 

 3) SQL*FORMS30, SQL*REPORTWRITER등의 프로그램을  데이타베이스에 [SAVE]시 관련 테이  블들을 포함하고
 있는 SYSTEM 또는 TOOLS TABLESPACE등의 영역이  부족한 경우에 발생 된다. 이러한 경우  EXTENT에 관련된
 DATA DICTIONARY VIEW인 USER_TABLES, USER_EXTENTS, USER_SEGMENTS와 DBA_FREE_SPACE등을 조회해서  관련
 내용을 확인한다. 예를 들어, 데이타 INSERT시 ORA-1547  : Failed to allocate extent of size  'num' in
 tablespace 'TOOLS' 에러가 발생될 경우를 고려해 보자. 

1) [USER_TABLES]에서 INSERT에 관련된 테이블의 NEXT_EXTENT 크기를 확인한다. 
SQL> SELECT  initial_extent, next_extent, pct_increase, min_extents, max_extents
       FROM  user_tables 
      WHERE  table_name = 'EMP'; 

 INITIAL_EXTENT   NEXT_EXTENT   PCT_INCREASE   MIN_EXTENTS   MAX_EXTENTS 
----------------  -----------  -------------- ------------- ------------- 
     10240          190464           50            1            121

(A) 
(A) : 다음에 할당되는 EXTENT의 크기를 나타내며 BYTES 단위이다. 
2) [DBA_FREE_SPACE]에서 현재 TABLESPACE에 존재하는 FREE SPACE 중 가장 큰 연속된 영역을 확인한다. 

SQL> SELECT  MAX(bytes) MAX_CONTIGUOUS_SPACE 
       FROM  dba_free_space 
      WHERE  tablespace_name = 'TOOLS'; 

     MAX_CONTIGUOUS_BYTES 
    ----------------------
          19730432 
(B) 

(B) : 현재 TABLESPACE에 남아있는 FREE SPACE 중 가장 큰 연속된 영역으로 BYTES 단위로 나타난다. 

3) 위에서 살펴본바와 같이 2)-(B)의 MAX(BYTES) 크기가 1)-(A)의 NEXT_EXTENT 크기보다 작기 때문에 
   ORA-1547이 발생하게 되는 것이며 이를 해결하는 방법으로는 다음의 몇 가지가 있다. 

① 최소 1)-(A)의 NEXT_EXTENT크기 이상의 데이타 화일을 'TOOLS' TABLESPACE에 추가한다.
  ALTER TABLESPACE tools ADD DATAFILE *file_name* SIZE integerM ; 

② TABLE의 STORAGE  PARAMETER에서 INITIAL EXTENT,  NEXT EXTENT의 크기를 조정하여 TABLE을 재구축할 수 
 있다.  즉, TABLE의 STORAGE PARAMETER 중에서 NEXT를 현재 TABLESPACE에 남아있는 FREE SPACE 중 가장 큰 
 연속된 영역( DBA_FREE_SPACE의 MAX(BYTES))보다 작게 변경할 수 있다. 
  SQL> ALTER TABLE emp STORAGE ( NEXT 100K ); 

③ 다음으로는 관련 TABLESPACE내의 OBJECT들을 EXPORT후 TABLESPACE를 재생성하고 IMPORT하여 DISK 
 FRAGMENTATION을 없애서 결과적으로 해당 TABLESPACE에 활용공간을 확보할 수 있다.

======================================================================
ORA-01552 조치방법 : SYSTEM ROLLBACK SEGMENT를 사용할 경우
======================================================================

<PRE> 본 내용은 ORACLE 7.3 이전의 VERSION에 해당하는 내용입니다. SYSTEM ROLLBACK SEGMENT 는 SYSTEM TABLESPACE에서 발생하는 ROLLBACK 정보들만을 가질수 있으므로, SYSTEM TABLESPACE 이외의 TABLESPACE에 대해서 발생하는 OPERATION (TABLE의 생성 등)을 위하여 SYSTEM ROLLBACK SEGMENT를 사용할 경우에는 ORA-1552가 발생한다. ORA-1552 발생 원인을 해소하기 위해 우선, SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 임시로 추가한 다음, NON-SYSTEM TABLESPACE에 ROLLBACK SEGMENT를 생성하고, 다른 데이타베이스 오브젝트(TABLE등 )를 생성하는 작업을 진행하여 이들 NON-SYSTEM TABLESPACE의 ROLLBACK SEGMENT를 이용하도록 유도한다. CREATE ROLLBACK SEGMENT 문에서 PRIVATE/PUBLIC으로 ROLLBACK SEGMENT를 생성한 후, ORACLE 데이타베이스를 SHUTDOWN, STARTUP 한다. PRIVATE으로 생성된 ROLLBACK SEGMENT는 INITSID.ORA 화일의 'ROLLBACK_SEGMENTS' PARAMETER에 등록한다. 1) SQLDBA> CONNECT INTERNAL; 2) SQLDBA> CREATE ROLLBACK SEGMENT r0 TABLESPACE SYSTEM ; 임시로 사용할 ROLLBACK SEGMENT를 SYSTEM TABLESPACE에 생성 3) SQLDBA> ALTER ROLLBACK SEGMENT r0 ONLINE ; 생성한 ROLLBACK SEGMENT를 ONLINE시킨다. 4) SQLDBA> CREATE ROLLBACK SEGMENT r1 TABLESPACE rbs ; 계속해서 사용할 ROLLBACK SEGMENT를 NON-SYSTEM TABLESPACE에 생성한다. 5) $ORACLE_HOME/dbs/initSID.ora 화일의 'ROLLBACK_SEGMENTS' PARAMETER에 생성된 ROLLBACK SEGMENT 이름을 등록한다. 6) ORALCE 데이타베이스를 SHUTDOWN 및 STARTUP을 수행한다. SYSTEM TABLESPACE에 임시로 추가해 주었던 ROLLBACK SEGMENT는 NON-SYSTEM TABLESPACE의 ROLLBACK SEGMENT를 생성하기 위해 필요한 것이었으므로 작업이 끝난 후 DROP한다. SQLDBA> ALTER ROLLBACK SEGMENT r0 OFFLINE ; SQLDBA> DROP ROLLBACK SEGMENT r0 ;

======================================================================
ORA-01555 : Rollback segment의 정보가 다른 transaction에 의해 overwrite된 경우
======================================================================

 변경을 일으킨 트랜잭션 슬롯이 재사용되었을 때, 롤백 세그먼트의 이전 이미지가 다른 트랜잭션에 의해 겹
 쳐 쓰여졌을때, 01555, 00000, 'snapshot too old: rollback segment number %s with name '%s' too small'
 // *Cause: rollback records needed by a reader for consistent read are
 // overwritten by other writers
 // *Action: Use larger rollback segments
 ORA-1555가 발생하는 원인은 여러가지가 있지만 기본적으로는 사용자가 필요로 하는 롤백 세그먼트의 정보가 
 다른 트랜잭션에 의해 overwrite되어, 존재하지 않을 때 발생한다.  

 이 문서를 읽기 전에 기본적으로 알아야 하는 오라클의 read consistency와 관련된 다음 내용들은 이 문서의 
 마지막에 별첨으로 용어 및 개념에 대해 설명하였으므로 참고할 수 있다.  
  (1)  SCN (System Change Number)  
  (2)  statement-read level read consistent  
  (3)  read consistent snapshot  
  (4)  rollback segment의 wrap around/overwrite  

 ORA-1555에  관한  자세한  설명에  앞서,  데이타 블럭과  롤백  세그먼트  사이의  구조에  대해 간단히
 알아보도록 한다. 데이타 블럭 헤더에는, 이  블럭내에 포함된 데이타를 변경한 트랜잭션의 정보와,  롤백
 세그먼트내의 해당 active transaction을 가리키는 영역이 존 재한다. 롤백 세그먼트는 세그먼트의 첫번째
 블럭을 헤더 블럭으로 사용하는데, 그 안에 이 롤백세그먼트를 최근에 사용한 트랜잭션들의 정보와,  undo
 record들이 저장되어 있는 롤백 세그먼트내의 주소가 저장되어 있는 트랜잭션 테이블이 포함되어 있다.  

 다음 예의 그림을 통해 다음과  같은 사항을 알 수 있다.   
 (1) 데이타 블럭 500번지의 row 2를  변경한 xid1 트랜잭션은 아직 commit되지 않은 상태이다.    
 블럭의 헤더에는 트랜잭션이 아직 cimmit되지 않았다는 정보와 5번 롤백 세그먼트 헤더내의 3번째 엔트리에
 트랜잭션의 정보와, undo record를 얻을 수 있는 자세한 정보가 있음을 알려준다.   
 (2) 롤백 세그먼트 5번의 3번째 슬롯은 이 트랜잭션이 변경한 undo record가 롤백 세그먼트내의 7109번지에 
 저장되어 있음을 나타낸다. 2,4,nn번 엔트리의 경우는 이미 트랜잭션이 commit되었으므로, 다른 트랜잭션이 
 이 엔트리를  overwrite 할 수 있다.  
 (3) xid1트랜잭션에 의해 변경된 undo record가 포함되어 있는 6900, 7109블럭은 link로 연결되어 있어 xid1 
 트랜잭션이 변경한 모든  record들의 before image를 구성할 수 있다. ORA-1555가 발생하는 주요 원인과, 이 
 오류 발생을 최소화할 수 있는 방법은 다음과 같다. 

1. 데이타베이스에 변경을 가하는 트랜잭션은 많고, 롤백 세그먼트는 크기도 작고, 갯수도 적은 경우  
다음과 같은 상황을 가정할 수 있다.  

 (1) 약 30분이 걸려서 A 테이블의 대부분을 읽어야 하는 긴 query 하나를 수행시켰다. 
 이때의 SCN이 10이었다. 
 (2) 위의 query가 결과값을 찾고 있는 동안, xid1 트랜잭션은 A 테이블에 대해서 update 작업을 수행하고 
 commit하여 A table이 저장되어 있는 블럭 중 하나인  500번지 블록의 SCN이 20으로 변경되었다  
 (3) query가 진행중인 동안 매우 많은 트랜잭션들이 database를 변경하고 commit하였다.
 (4)  이 query가 500번지 블럭을 읽고자 할 때 SCN이 20임을 확인하고, xid1 트랜잭션에 의해 변경된 undo 
 record를 찾기 위해 롤백 세그먼트를 참조하였다.  
 (5)  그러나 xid1  트랜잭션은 이미  commit된 상태이고,  query가 진행되는  동안 매우많은  트랜잭션이
 데이타베이스 변경작업을 수행한 결과 롤백 세그먼트내의 xid1 트랜잭션의 undo record가 저장되어 있는 
 블럭이 다른 트랜잭션들에 의해 overwrite 된 상태였다.
 (6) ORA-1555가 발생한다.

해결 방법:  
(1) 롤백 세그먼트의 크기를 크게 하고 갯수를 늘리면, 롤백 세그먼트가 wrap around /overwrite되는 주기가 
늦추어진다.  
(2) 트랜잭션의 수행이 많은 때에는 수행시간이 오래걸리는 query문은 수행시키지 않도록 한다.

2. fetch across commit  
 프로그램내에서  cursor를  선언하고  loop를  수행하면서  fetch하고  데이타를  변경하는  경  우  많은
 프로그래머들은 롤백 세그먼트의 사용량을 줄이기 위해서 매 loop시마다 commit 을 한다. 그러나 cursor의
 loop내에서 commit하는 것은 ANSI standard에서는  제공하는 것이 아니며, ORA-1555를 발생시킬  가능성이
 있다.  

 ORA-1555가 발생하는 경우는 (1)의 경우와 유사하다.  cursor는 선언하고, open시에 데이 타를 읽는  것이
 아니고  fetch  때마다 읽게  되므로  fetch를 수행하는  것은  long query를  시작하는  것과 같다.  즉,
 fetch문의 loop를 수행하는 동안, 처음 fetch문  수행시점의 SCN보다 작거나 같은 SCN의 데이타를  읽어야
 한다. 그런데  loop 수행시마다  데이터를 변경하고  commit하게 되면,  commit한 block의 SCN은 증가되고
 변경된 정보도 다른 트랜 잭션에 의해 재사용되어질 수 있다. 이렇게 블럭은 변경되었으나, 변경된 정보가
 이미 다른 트랜잭션에 의해 overwrite된 블럭의 데이타를 fetch하고자 하면, 오라클은 read consistent 
 snapshot을 구성할 수 없게 되므로 ORA-1555가 발생하게 된다.  

해결 방법:  
 (1) cursor내에서  commit하는 횟수를  줄인다. 예를  들어 첨자를  이용해 5만건에  한번씩 commit할  수
 있으며, 이렇게 되면 5만건의 데이타를 저장할 수 있는 큰 롤백 세그먼트가 있어야 한다.  
 (2) cursor 선언시 구성될 active set의 범위를 줄인다. 즉 한번에 모든 데이타를 읽어 처리하기 보다는, 
 where절을 이용하여 데이타를 나누어, 여러번에 걸쳐 수행한다.  
 (3) 1번의 경우와  마찬가지로,  commit된 정보가  overwrite되는 주기를 늦추기  위해서 롤백 세그먼트의
 갯수를 증가시키고 그 크기도 크게하면 도움이 된다.  

3. delayed block clean out  
 오라클은 기본적으로  transaction이 commit하면,  fast commit을  수행한다. 즉,  트랜잭 션이  데이타를
 변경시키고 commit하면, 변경된  데이타 블럭의 header부분에  트랜잭션이 commit되었음을 기록하는  것이
 아니고  일단 롤백세그먼트의  헤더부분에만 commit되었음  을 기록한다.  이후 그  데이타 블럭을  다른
 트랜잭션이 access하게 되면,  그때 롤백 세그  먼트의 정보를 이용하여  데이타 블럭에 commit된  상태를
 반영하여 clean  out시키는 것을  delayed block  clean out이라고  한다. 이  delayed block clean out이
 어떻게 ORA-1555를 발생하게 되는지 다음의 상황을 살펴보면 된다.  

 (1)  다음과 같은 초기 상태를 가정할 수 있다. 500번지 데이타 블럭의 데이타를 변경하는 트랜잭션은 존재
  하지 않고, rollback segment 5번 header의 3, 4, nn번째 트랜잭션 엔트리는 다른 트랜잭션에 의해 재사용
  되어 질수있다.  
 (2) xid1 트랜잭션이 update문을 이용하여 500번지 데이타 블럭의 2번째 데이타를 변경 하였다.   500번지
 데이타 블럭의 헤더에는 xid1 트랜잭션의 정보가 저장되고, 롤백 세그먼트 5번의 트랜잭션 슬롯 3 (5,3)을
 가리키게 된다. COMMITTED로 표시되었던 트랜잭션 슬롯 3번은 이제 ACTIVE 상태로 변경되었다.  

(3) xid1 트랜잭션이 commit을 수행하였다.  
 오라클은 롤백 세그먼트 헤더의 트랜잭션 테이블에서 xid1 트랜잭션의 정보를 찾아서 commit되었다고 기록
 하였다. 그러나 500번지 블럭의 헤더에는 commit  되었다는 정보를 기록하지 않는다. (fast commit)  
(4)  데이타베이스에 변경을 가하는 매우 많은 트랜잭션이 수행되었다.  
 매우 많은 트랜잭션이 수행되어 롤백 세그먼트 헤더내에 있는 트랜잭션 테이블의 엔트리가 대부분 재사용되
 었다. 트랜잭션  xid50이 롤백  세그먼트 5번의  3번째 슬롯이  COMMITTED로 표시되어  있으므로, 비어있는 
 엔트리로 인식하여 xid50에 관한 정보를 저장하였다.  

(5) 다른 트랜잭션이 데이타 블럭 500번지를 방문하였다.  
 새로운  트랜잭션인 xid70   트랜잭션이 500번지  블럭을 읽고자  하였다. (3)번의  그림 에서 보듯이,
 500번지 블럭 헤더에는 아직 commit되지 않은 트랜잭션이 이 블록을 변경하였으며, before image를 구성할
 수 있는 정보가 롤백 세그먼트 5번, 엔트리  3번에 있음을 나타낸다. 그러나 5번 롤백 세그먼트  헤더내에
 있는 트랜잭션 테이블의 3번 슬롯은 xid1번이 아닌 xid50번의 정보가 저장되어 있다. 즉, delayed block 
 cleanout이 이루어지기 전에 롤백 세그먼트 헤더가 overwrite 된 것이다.  
(6) xid7 트랜잭션은 read consistent snapshot을 구성할 수 없으므로 ORA-1555가 발생한다.  

해결 방법:  
 (1) ORA-1555를 발생시킬 상황 이전에 읽고자 하는 테이블에 대해 full scan을 실시한 다면, 롤백 세그먼트
 안의 정보가 overwrite되기 전에 delayed block cleanout이 이루어지도록 할 수 있다.  
 (2) 1 ~ 4번의 모든 원인에 대해서 롤백 세그먼트를 크게 유지하면, 롤백 세그먼트의 정보가 overwrite되는
 주기를 늦출 수 있어 ORA-1555를 피하는데 도움이 될 수 있다.

 4.  OPTIMAL  크기가 아주  작을  때 롤백  세그먼트는  트랜잭션의 사용에  의해  한번 크기가  늘어나면
 기본적으로 그 롤백세그먼트를 지우고 다시 만들기 까지는 크기가 줄어들 지 않는다. 그러나 optimal size
 를 지정하게 되면, 롤백 세그먼트에서 새로운  extent 를 요구하는 시점에, 현재 할당된  롤백 세그먼트의
 크기와  optimal에 지정된  크기를 비교하게  된다. 할당된  공간이 optimal  크기보다 큰  경우, 할당된
 extent중 active  한 트랜잭션이  사용하고 있지  않은 extent들은  release시켜, 롤백  테이블스페이스의
 공간으로 환원된다.   그러므로 이  optimal size가  지나치게 작다면,  트랜잭션이 commit되자마자 롤백
 세그 먼트내의 정보는 잃게 될 것이다. 그러나, 위의 1 ~ 4번에서 살펴보았듯이 이미 commit된 트랜잭션의
 정보라 하더라도 이후에 필요하게  되는 경우가 발생하므로 이렇  게 빈번히 commit된 트랜잭션의  정보가
 포함되어 있는 롤백 세그먼트의 extent를 release시키는 것은 바람직하지 않을 수 있다.  

해결 방법:  
 (1) optimal을 지정할 때는 20개의 extents정도의 크기정도로 지정하는 것이 적당하며, 그것보다 더 작게 
 지정하지 않도록 한다.  
 (2) 롤백 세그먼트를 많이 필요로 하는 batch job의 경우 
   set transaction  use rollback  segment rollback_segment_name 
 구문을 이용하여 특정 롤백  세그먼트를 사용하게 하고 나머지 롤백  세그먼트들은 OLTP job이 사용하도록 
 한다.
 이렇게  하면 OPTIMAL을 지정하지  않아도 모든 롤백  세그먼트가 불필요하게 확장되는 일을 막을 수 있다.  

별첨: 용어 및 기본 개념 설명-----------------------------------------------------
 (1) SCN(System Change Number)  
 오라클은 특정한 시점의 데이타베이스 상태를  SCN으로 관리한다. 트랜잭션이 commit 되면,  SCN은 최근의
 SCN보다 크고 유일한 값이 할당되며, 이 값은 그 트랜잭션이 변경시킨 블록에 반영되고, 그 데이타화일의 
 가장 최근의 SCN은 데이타화일의 헤더 (header)에 기록된다.

 (2) statement-level read consistent  
 하나의 query는 그 query가 시작되어 데이타를  읽기 시작하면, 모든 데이타를 읽어 query가  끝날 때까지
 일관된 상태를 유지한다. 즉 query가 진행되는 동안 다른 트랜잭 션이 읽고자하는 데이타를  변경하더라도
 그 query는  변경 이전의  데이타 값을  읽게 된다.   데이타들이 query가  시작될 때와 같은 시점인지는
 SCN을 통해 관리된다. 즉 SCN이 10인  상태에서 query가 시작되었다면 query가 진행되는 동안  항상 SCN이
 10이하  상태의  데이  타만을  읽게되며,  이것은  롤백  세그먼트(rollback  segment)를  이용하여 read
 consistent snapshot을 구성함으로써 가능하다.  

(3) read consistent snapshot (read consistent view)  
 트랜잭션이 변경작업을 수행할 때 마다, 오라클은 변경 작업이 이루어지기 전의 before image(snapshot)을
 롤백 세그먼트에 저장해둔다.  한 트랜잭션이 commit되기  전에 변경된 데이타를  다른 트랜잭션이 읽거나
 수정하고자 한다면, 롤백 세그먼트의 정보를 이용하여 read consistent snapshot을 구성한 후 이 데이타값
 을 이용하여 operation을 수행한다. 또한 (2)에서 설명한 statement-level read consistent를 이루기 위해
 서도 query가 진행되는동안 읽고자 하는 블럭의 SCN이 증가하면, 롤백 세그먼트의 정보를 이용하여 원하는
 SCN상태의 read consistent snapshot을 구성한 후 데이타를 읽게 된다.  

(4)  rollback segment의 wrap around/overwrite  
 롤백 세그먼트는 하나의 롤백 세그먼트를 여러개의 트랜잭션이 함께 사용하며, 하나의 extent도  여러개의
 트랜잭션이 동시에  사용가능하다. 단  각 블럭은  하나의 트랜잭션에  할당된다. 트랜잭션들이 사용 중인
 extent에 정보를  저장하고 다음  extent가 필요하면,  해당 롤백  세그먼트에 이미  할당되어 있는  다음
 extent가 active한 undo 정보를  가지고 있는지를 검사한다. active한  undo 정보를 담고 있지  않은 다음
 extent가 current extent가 되며,  트랜잭션들은 이 extent에 undo  image를 저장한다. 할당된 맨  마지막
 extent를 확인하게 되면, 다시 첫번째 extent부터 extent로 돌아와 다시 사용하는 것을 wrap  around라고,
 모두  commit된 트랜잭션의  정보만 담고  있는 extent는  overwrite된다. 이렇게  롤백 세그먼트의  undo
 image를  담고있는   블럭뿐  아니라   롤백  세그먼트   헤더내의  트랜잭션   테이블의  엔트리도  wrap
 around/overwrite될 수 있다. 트랜잭션 테이블은  고정된 수의 엔트리를 가지고 있으며,  트랜잭션이 이미
 COMMITTED된 엔트리는 비어있는 것으로 인식하여 다음 트랜잭션이 사용 가능하게 된다.


 01560 : tablespace에 충분한 공간이 없을때
 01560, 00000, 'global hash table size mismatch for %s (%s != %s)'
 // *Cause: The specified 'gc_' INIT.ORA parameter was incompatible
 // with that of another instance which already has the database mounted.
 // *Action: Fix the 'gc_' parameter and restart.

======================================================================
ORA-01562 조치방법 : MAXEXTENTS (DEFAULT 121)에 도달한 경우
======================================================================

 ROLLBACK SEGMENT는 TRANSACTION을 수행하면 필요한 만큼의 EXTENT를 발생하여 그 크기가 증가된 이후에는
 그 TRANSACTION이  COMMIT혹은 ROLLBACK되더라도  SIZE가 줄  어들지 않는다.  (OPTIMAL을 지정하지  않는
 경우)  이것은 DB를  SHUTDOWN후 다시  STARTUP 하여도  마찬가지이며, ROLLBACK  SEGMENT가 자신이  속한
 TABLESPACE로 부터  EXTENT를 할  당받다가 더  이상 할당받을  EXTENT가 없을  때, 혹은 이미 MAXEXTENTS
 (DEFAULT 121)에 도달한 경우에 ORA-1562가 발생한다. 

1. 현재 ROLLBACK SEGMENT가 포함되어 있는 RBS TABLESPACE의 크기 확인 

sqlplus system/manager 
SQL> SELECT  file_name, bytes 
       FROM  dba_data_files 
      WHERE  tablespace_name = 'RBS'; 

         FILE_NAME                 BYTES
------------------------------- ------------ 
/oracle/pms/dbs/rbsPMS01.dbf      20971520 
/oracle/pms/dbs/rbsPMS02.dbf      10485760 

 여기에서 나타난 결과값이 절대적으로 작은 경우 RBS TABLESPACE에 DATAFILE을 ADD 시켜줄 필요가 있다. 

2. 각 ROLLBACK SEGMENT의 SIZE및 발생한 EXTENT의 수 확인 

sqlplus system/manager 
SQL> SELECT  segment_name, initial_extent, next_extent, maxextents, rssize, extents, xacts 
       FROM  dba_rollback_segs a, v$rollstat b 
      WHERE  a.segment_id = b.usn; 

결과는 다음과 같은 형태로 나온다. 
 (1) INITIAL_EXTENT는 ROLLBACK SEGMENT가 필요한 경우 처음으로 자신의 SPACE를 잡는 크기이며, 이 크기만
  큼의 연속된 공간을 RBS TABLESPACE로 부터 잡는다. 
 (2) NEXT_EXTENT는 INITIAL_EXTENT를 잡은 후에 추가적으로 SPACE가 필요한 경우 이 크기만큼씩 SPACE를 잡
  게 된다. 
 (3) MAXEXTENTS는 각 ROLLBACK SEGMENT에 지정된 최대 발생가능한 EXTENT의 갯수이다.
  여기에 설정된 값 이상의 EXTENT를 발생시킬 수 없다. 
 (4) RSSIZE는 현재 각 ROLLBACK SEGMENT가 잡고 있는 RBS TABLESPACE내의 ROLLBACK SEGMENT의 크기이다. 
 (5) EXTENTS는 현재 각 ROLLBACK SEGMENT별로 발생한 EXTENT의 갯수이다. 
 (6) XACTS는 현재 각 ROLLBACK SEGMENT를 잡고 있는 ACTIVE ROLLBACK TRANSACTION의 갯수이다. 
  ROLLBACK SEGMENT를 OFFLINE하거나 DROP할 때는 이 XACTS가 0인지 확인하고 작업하여야 한다. 

 (컬럼 이름은 편의상 축소하였다.) 
  SEGMENT   INITIAL    NEXT      MAX    RSSIZE    EXNTENTS    XACTS 
 --------- --------- -------- -------- --------- ---------- -------- 
 SYSTEM      262144   262144     121    407552        8         0
 R01         262144   262144     121    530432        2         0
 R02         262144   262144     121    3192832      12         0 
 R03         262144   262144     121    5056512      19         0 
 R04         262144   262144     121    11180032     42         1 

 이때 ORA-1562발생시  표시된 message에  나타난 ROLLBACK  SEGMENT이름의 EXTETNS가  MAX_EXTETNS의 수와
 같으면, 이것은 그 ROLLBACK SEGMENT가 MAXEXTENT에 도달하여 이 오류가 발생한 것이고, 그렇지 않은 경우
 는 TRANSACTION에 필요한 SPACE가 더 이상 RBS TABLESPACE에 FREE SPACE로 남아 있는 것이 없어서 발생한 
 것이다. 

3. 가능한 조치 방법 

 (1) 2번의  QUERY 결과  MAXEXTENT에 도달하지도  않았고, 오류가  발생한 TRANSACTION을  처리할 만큼 큰
 크기의 RSSIZE가 있는 ROLLBACK SEGMENT도 없는  경우에는 1번의 조회 결과 나타난 RBS의  DATAFILE이외에
 추가적으로 RBS TABLESPACE에 새로운 DATAFILE을 추가하여야 한다. 

 sqlplus system/manager 
 SQL> ALTER TABLESPACE rbs ADD DATAFILE '/oracle/pms/dbs/rbsPMS03.dbf' SIZE 50M; 

 (2)  2번의 조회를  확인한 결과,  오류가 발생한  ROLLBACK SEGMENT의  RSSIZE보다 큰  RSSIZE를 가지는
 ROLLBACK  SEGMENT가 존재하여  이 TRANSACTION을  수행하기에 충분  하다고 판단되는  경우 그  ROLLBACK
 SEGMENT를  지정하여 사용할  수 있다.  RSSIZE가 매우  큰 ROLLBACK  SEGMENT가 R04라고  할때, SQLPLUS
 상에서는 다음과 같이 하면된다. 

 SQL> SET TRANSACTION USE ROLLBACK SEGMENT r04 ; 

 일반적으로 BATCH JOB과 같이 ROLLBACK SEGMENT가 많이 필요한 TRANSACTION에 대해서는 INITIAL과  NEXT가
 크게 지정되어 있는 큰 크기의 ROLLBACK SEGMENT를 지정하여 사용하는 것이 효율적이다. 

 (3) 2번의 조회에서  획인 된 INITIAL_EXTENT와  NEXT_EXTENT가 작아 실제로는  RBS의 FREE SPACE가  남아
 있는데도 MAXEXTENT에 도달하여 ORA-1652가 발생하는 경우 ROLLBACK SEGMENT의 INITAL과 NEXT를 크게 하여 
 ROLLBACK SEGMENT를 재생성할 수 있다. 

 참고)
 각 TABLESPACE별 FREE SPACE는 다음과 같은 방법으로 확인가능하다. 
 sqlplus system/manager 
 SQL> SELECT tablesapce_name, sum(bytes), max(bytes) 
        FROM dba_free_space 
       GROUP BY tablespace_name; 

 (4) 이러한 ROLLBACK SEGMENT에 관한 오류는 ROLLBACK SEGMENT가 일단 필요한 SPACE를 확보한 이후에는 그
 크기가 줄어들지 않는 것이 그 원인이 될 수도 있는데 이때 ROLLBACK SEGMENT에 OPTIMAL SIZE를  지정하면
 어느 정도의 해결이 가능하다. OPTIMAL을 지정하면 ROLLBACK SEGMENT가 그 크기 이상으로 증가되는  경우,
 이후 OPTIMAL로 지정된 크기만  유지하도록 ROLLBACK SEGMENT가 줄어들게  된다. 이때, 이값을 너무  작게
 잡으면 빈번하게 ROLLBACK SEGMENT가 늘어나고  줄어드는 작업으로 인해 PERFORMANCE에 지장을  초래할 수
 있으므로 20~30개의 EXTENT정도를 보유할 수 있도록 한다. 

OPTIMAL의 지정 방법은 ROLLBACK SEGMENT생성시나 그 이후에 다음과 같이 하면 된다.

 sqlplus system/manager 
 SQL> CREATE ROLLBACK SEGMENT r01 
             TABLESPACE rbs 
             STORAGE (INITIAL 1M NEXT 1M OPTIMAL 20M) ; 

 이미 생성된 rollback segment에 대해서는, 
 SQL> ALTER ROLLBACK SEGMENT r01 STORAGE(OPTIMAL 20M);

======================================================================
ORA-01578 조치 방법 : seq=0 이고 inc<>0(새로운 블럭이 아님)일 때
======================================================================

<PRE> 모든 오라클  데이타 블럭은 Sequence  번호(seq)와 Incarnation 번호(inc)를 갖고 있다. ORA-1578  에러는 seq=0 이고 inc <> 0(새로운 블럭이 아님)일 때 발생한다.  ORA-1578 에러는 ORA-600[3339] 에러와 함께 발생하곤 한다.  * ORA-1578 에러가 발생하면  Corruption이 발생한 화일번호와 블럭번호를 알려준다. 여기서는 이 때의 화일번호를 f, 블럭번호를 b 라고 부르기로 한다.  <해결방법> 1. 우선 해야 할 일은 어떠한 오브젝트가 Corrupt  되었는가를 알아내는 것이다.    다음의 스크립트를 이용하면 알 수 있다.    SQL> select segment_name, segment_type        from dba_extents        where file_id = f and       between block_id and block_id + blocks - 1; 2. 만약 해당 세그먼트가 인덱스이면 Drop 시키고 다시 생성하면 된다.  3. 만약 해당 세그먼트가 테이블이면 Corrupt 된 블럭의 데이타는 손상된 것이다.  4. 만약 해당 테이블이 들어있는 엑스포트 화일이 있다면 손상된 테이블을 Drop 시키고 임포트 받는 것이 제일 간단한 방법이다. 하지만 만약 엑스포트 받은 파일이 없거나 백업해 둔 화일도 없다면 해당 테이블에 인덱스가 생성되어 있는 경우에 한해서 다음의 방법을 사용해서 복구를 하도록 한다. * empno, ename, deptno 를 컬럼으로 가지는 EMP 테이블이 Corrupt되었다고 가정하자. 그리고 empno 컬럼에 인덱스가 생성되어 있다고 하자. 클러스터화되지 않은 모든 테이블은 유니크한 Rowid 를 가진다. Rowid를 Varchar2/hexadecimal 형식으로 표현하려면 Rowidtochar 함수를 이용한다. SQL> select rowid to_char(rowid) from emp; * Rowid는 총 18자로 블럭어드레스(8자), 점(1자), 로우 어드레스(4자), 점(1자), 화일 어드레스(4자)로 구성되어 있다.  SQL> select empno, rowid       from emp        where empno > 0     위의 스크립트를 실행시키면 다음과 같은 결과를 얻게 된다.      EMPNO             ROWID      ------------     --------------------------------      100          00000003.0000.0006        101          00000003.0001.0006         102          00000003.0002.0006         103          00000003.0003.0006      500         00000004.0000.000A        501          00000004.0001.000A        755         0000001A.0005.000A        756          0000001A.000C.000A   * 만약 인덱스가 Character 컬럼에 대한 것이었다면, 위의 Query 문장을 다음과 같이 바꿀 수 있다.  SQL> select empno, rowid          from emp     where empno > '';     * 예를 들어 다음과 같은 에러  메시지가 떨어졌다고 하자.   01578, 00000, 'ORACLE data block corrupted (file # 10, block # 4)   그러면 다음의 스크립트를 사용하여  손상된 블럭에 있는 employee 에 대한 empno를 구할 수 있다.   SQL> select empno  from emp   where empno > 0 and rowid tochar(rowid) like '00000004.%.000A';      EMPNO         ROWID        ----------  --------------------------------      500      0000004.0000.000A        501      00000004.0001.000A   * 이제 EMP 테이블과 같은 구조를 갖는 새로운 테이블을 만든다.     SQL> create table temp       as select * from emp where 1 = 2;   * 그리고는 손상된 부분을 피해서 새로운 테이블에 손상된 테이블의 데이타를 추가한다.     SQL> insert into temp select * from emp where empno < 500;       SQL> insert into temp select * from emp where empno > 501;   손상된 테이블을 Drop시키고  Temp 테이블의 이름을 EMP 로 변경한다.  그리고 백업된 자료나 문서자료를 통하여 손상된 부분에 대한 정보를 추가한다.     5. 손상된 블럭에 여러개의 로우가 존재하고 있다면 다음의 방법을 이용한다.  SQL> create table empnos as         select empno from emp         where empno > 0          and rowid to_char(rowid) not like '00000004.%.000A'; 이 스크립트를 이용하면 손상된 블럭에 포함되지 않은 empno 들을 알 수 있다. * 다음의 스크립트를 계속 실행시켜 복구를 한다.  SQL> create table temp as select * from emp where 1 = 2; SQL> insert into temp       select emp.empno, emp.ename, emp.deptno         from emp, empnos       where emp.empno > 0       and emp.empno = empnos.empno;   6. 만약 데이타 딕셔너리의 테이블이나 인덱스에서 손상된 블럭이 발생했다면 지원을 요청해야 한다.

======================================================================
ORA-01628 ORA-01630 ORA-01631 ORA-01632 조치 방법 : MAXEXTENTS에 도달했을때
======================================================================

다음 ORA 에러들은 오라클의 오브젝트들이 MAXEXTENTS에 도달했을 때 발생하는 것들이다.

01628, ' max # extents (%s) reached for rollback segment %s ' 
01630, ' max # extents (%s) reached in temp segment in tablespace %s '
01631, ' max # extents (%s) reached in table %s.%s ' 
01632, ' max # extents (%s) reached in index %s.%s '

또한 ORA-1628 다음에는 ORA-1562 에러도 함께 발생한다. 

이 에러들은 다음 모든 LEVEL 에서 발생될 수 있다.
. 에플리케이션 LEVEL (GL, AOL, Financials, Etc) 
. TOOLS LEVEL (Reports, Forms, Etc) 
. Kernel LEVEL (Insert, Update, Delete) 

이 에러의 이유는 오브젝트의  익스텐트가 MAX # 에 도달했기 때문에 발생되며,  오브젝트의 MAXEXTENTS는 
STORAGE의 MAXEXTENTS 파라미터에 의해 결정된다.

다음 예를 보기로 하자. 

SQL> INSERT INTO TAB1 SELECT * FROM TAB1; 
     ORA-01631 : max # extents (2) reached in table JANE.TAB1

SQL> SELECT  INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS 
       FROM  USER_TABLES
      WHERE  TABLE_NAME = 'TAB1'; 

   INITIAL_EXTENT   NEXT_EXTENT  MAX_EXTENT
  ---------------  ------------  ----------
        6144           10240         2

위 예에서 오브젝트의 MAXEXTENTS 는 2 인데 이 값은 HARDCORD된 MAX 값이 아니다.
HARDCORD 된 MAXEXTENTS의 최대값은 데이타베이스가 생성될 당시 지정된 DB_BLOCK_SIZE 의 값에 따라 다르다.

   DB_BLOCK_SIZE       최대 MAXEXTENTS 값 
-------------------    ------------------
       512                    25
        1K                    57
        2K                    121
        4K                    249
        8K                    505


만일 최대 MAXEXTENTS 값보다 더 큰 MAXEXTENTS를 Storage 에서 지정하면 다음 에러가 발생한다. 
ORA-02226, 00000, ' invalid MAXEXTENTS value (max allowed: %s) '

다음은 ORA-0163x 에 대한 해결 방법이다. 
만일 platform의 최대 MAXEXTENTS 에 도달이 안 되었으면 ALTER TABLE .. STORAGE (MAXEXTENTS n);
를 사용하여 최대 MAXEXTENTS 값보다 작은 수로 MAXEXTENTS를 늘려준다. 
만일 최대 MAXEXTENTS 값에 도달했으면 해결할 수 있는 방법은 MAX 제한에 도달되지 않도록 EXTENT SIZE 를 
더 크게하여 오브젝트를 다시 생성하는 것이다.
만일 이 에러가 ROLLBACK SEGMENT 에서 발생되면 DROP하고 다시 생성한다. 
만일 에러가 TEMPORARY TABLESPACE에서 발생되면 TEMPORARY TABLESPACE의 STROAGE를 변경한다. TEMP SEGMENT
는 그것이 생성된 TABLESPACE의 Default Storage Parameter를 사용하기 때문에 다음과 같은 방법으로 해결할 
수 있다.


ALTER TABLESPACE 'tempname' DEFAULT STORAGE (INITIAL n NEXT n);
. n 은 기존 지정된 값보다 큰 값을 지정한다.
ALTER TABLESPACE 'tempname' DEFAULT STORAGE (PCTINCREASE m);
. m 은 기존 지정된 값보다 큰 값을 지정한다. 

만일 에러가 TABLE에서 발생되면 export/import utility를 사용하여 그 TABLE을 다시 생성한다. 


[ 단계 ] 예를 들어 scott user의 emp table이 121개의 extent에 도달했다고 가정
1. table을 export한다. 
 예) $ exp scott/tiger file=emp.dmp tables=emp 

2. table을 drop하거나 export가 실패한 경우를 대비해서 기존 TABLE을 RENAME 한다.
 예) SQL> drop table emp; 또는  
     SQL> RENAME EMP TO EMP_OLD;
 
3. storage절을 변경하여 table을 생성한다.
 SQL> create table emp(empno.....) storage (intial 10M next 1M pctincrease 0);
 여기에서 initial 10M과 next 1M은 예로 든 것이므로 고객 환경에 적당하게 설정한다. 
 pctincrease는 0로 한다.

4. 사용자의 SCHEMA 에 임포트를 실행하여 TABLE을 생성함.
 이 때 위에서 생성된 table에 import가 되도록 ignore=y option을 사용
 예) $imp scott/tiger file=emp.dmp tables=emp ignore=y commit=y 

5. 2번에서 table을 rename하였다면 import가 잘 수행되었는지 확인하고 기존 테이블은 DROP 함.
 예) SQL> DROP TABLE EMP_OLD;

======================================================================
ORA-0162x ORA-0163x조치 방법 : MAXEXTENTS에 도달 했을때 발생
======================================================================

INITIAL_EXTENT  
다음 ORA 에러들은 오라클의 오브젝트들이 MAXEXTENTS에 도달 했을때 발생하는  것들이다.
01628, 00000, 'max # extents (%s) reached for rollback segment %s'      
01630, 00000, 'max # extents (%s) reached in temp segment in tablespace %s'
01631, 00000, 'max # extents (%s) reached in table %s.%s' 
01632, 00000, 'max # extents (%s) reached in index %s.%s' 

 또한  ORA-1628 다음에는 ORA-01562도 함께 발생한다. 

 이 에러들은 다음 모든 LEVEL에서  발생 될 수 있다.
  &sect;  에플리케이션 LEVEL (GL, AOL, Financials, Etc)
  &sect;  TOOLS LEVEL (Reports, Forms, Etc)      
  &sect;  커널  LEVEL (Insert, Update, Delete)    

 이 에러의 이유는 오브젝트의 익스텐트가 MAX #에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는 
 STORAGE의 MAXEXTENTS 파라미터에 의해 결정된다.  

다음 예를 보기로 하자.  


SQL>; INSERT INTO TAB1
      SELECT * FROM TAB1;           
   ORA-01631: max
# extents (2) reached in table JANE.TAB1
SQL> SELECT  INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS       
       FROM  USER_TABLES                
      WHERE  TABLE_NAME = 'TAB1';

   INITIAL_EXTENT NEXT_EXTENTS MAX_EXTENT
     --------------  ------------  ---------- 
         6144          10240        2

위 예에서 오브젝트의 MAXEXTENTS는 2 인데 이 값은 HARDCORD된 MAX 값이 아니다.     
HARDCORD 된 MAXEXTENTS의 최대값은 데이타베이스가 생성될 당시 지정된 DB_BLOCK_SIZE 의 값에 따라 다르다.

======================================================================
ORA-01632 조치 방법 : INDEX REBUILD
======================================================================

 ORA-01632 에러는 index가 확장하려고 할 때 maxextents 값의 제한에 도달하여 더이상 extents를 일으키지
 못하는 경우입니다.  이 에러의  경우 보통은  index의 storage  절의 initial,  next가 작아서  발생하기
 때문에 근본적으로 storage의 initial, next를 크게 키워 주면서 다시 만드는 것이 좋습니다. 그러나 현재
 다시 생성하는 것이 어렵다면  일단 maxextents만 키워서 사용을 하다가 나중에 작업을 할 수도 있습니다.

maxextents를 키우려면 (이 기능은 7.3 이상부터 가능)

SQL> alter index i_dept_deptno storage (maxextents 200);
 과 같이 실행하면 됩니다. 위와 같이 index가 일반  index가 아니라 primary key  index인 경우는 index만 
 drop 했다가  다시 생성할 수는 없습니다.  그러므로 primary  key를 다시  만들면서 지정하거나  index를 
 rebuild 해야 합니다. 일반 index의 경우는 index를 다시 생성하거나 rebuild하면 되는데, 보통 다시 생성
 하는 것보다 rebuild하는 것이 속도가 좋습니다.

1. index를 rebuild하는 방법

 SQL> alter index pk_dept rebuild
    2 tablespace ind_data
    3 storage (initial 1M next 1M);

2. primary key 생성 시 storage 지정하는 방법

 SQL> alter table dept drop primary key;
 SQL> alter table dept add constraint pk_dept
   2 primary key (deptno)
   3 using index tablespace ind_data
   4 storage (initial 1M next 1M);

======================================================================
ORA-01652 조치 방법 : tablespace에 space가 부족
======================================================================

 ORA-165X error는 tablespace에 space가 부족해서 table이나 rollback segment extent가 할당되지  못해서
 발생하는 error이다. 다음의 에러들은 tablespace에 space가 부족해서 발생하는 사항들이다. 
 01652, 00000, 'unable to extend temp segment by %s in tablespace %s' 
 01653, 00000, 'unable to extend table %s.%s by %s in tablespace %s' 
 01654, 00000, 'unable to extend index %s.%s by %s in tablespace %s' 
 01655, 00000, 'unable to extend cluster %s.%s by %s in tablespace %s'

1. Tablespace space 부족 현상의 예 
다음의 테이블 생성 문장을 보자. 

 SQL> CREATE TABLE FEATURE 
   2> (feature_code varchar2(4) primary key, 
   3> feature_desc varchar2(3) );

ORA-01652, 00000, 'unable to extend temp segment by 6144 in tablespace VESSEL'
테이블 스페이스 VESSEL 에 남아있는 가장 큰 연속된 공간을 확인해 보면 

 SQL> SELECT MAX(blocks), MAX(bytes)
   2> FROM DBA_FREE_SPACE 
   3> WHERE TABLESPACE_NAME = 'VESSEL';

  blocks bytes
  6143 12,580,864

위의 결과를 보면 현재 VESSEL 에 남아있는 가장 큰 연속된 공간은 6143 블록인데 
오라클은 6144 블럭이 사용하려다 이를 할당받지 못하여 에러가 발생하게 된 것이다.

2.tablespace space 부족현상의 조치 
tablespace에 space가 부족해서 에러가 발생하는 경우 
아래의 몇 가지 방법을 이용해 조치가 가능하다. 

(1) 데이타 화일을 추가하여 테이블스페이스의 크기를 확장한다. 

 SVRMGR> ALTER TABLESPACE data ADD DATAFILE '/usr/../oracle/data2.dbf' SIZE 100M; 

 이때의 tablespace 가 SYSTEM  일 경우는 user 의  default tablespace가 잡혀있지 않기  때문에 근본적인
 해결이 필요하다. 이 경우는 무작정 tablespsace 를 늘리지 말고 user의 default tablespace를  create 후 
 user에게 할당해 주도록 한다. 

예) 
 SVRMGR> CREATE TABLESPACE tablespace_name datafile '......' size 100m; 
 SVRMGR> ALTER USER user_name IDENTIFIED BY passwd 
       > DEFAULT TABLESPACE tablespace_name 
       > TEMPORARY TABLESPACE temp ; 

(2) 테이블(rollback segment)의 storage parameter를 조정하여 현재 남아있는 영역에 들어갈 수 있도록 한다. 

SQLDBA> ALTER TABLE emp STORAGE(NEXT 1M); 

이 경우 tablespace가 fragmentation이 심한 경우가 아니면 효과적이지 못하다. 

(3) 테이블스페이스가 fragmentation이 심한 상태이면 exp/imp를 이용하여 테이블 스페이스를 재구성 한다. 

3. V7.1에서의 ORA-1652 에러 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE가 아닌 곳에서 
 ORA-1652(temp tablespace가 부족함) 에러가 발생하는 경우가 있다. 이와 같은 문제는 V7.1에서만 발생하는데
 V7.1에서는 테이블, 인덱스 등을 병렬로 생성할 수 있다. 이를 위하여 실제로 테이블 등이 생성될 공간에 
 Temporary Segment를 만들게 되는데 이 과정에서 Temporary Segment를 만들 공간이 부족하게 되면 실제의 
 테이블이 생성되는 테이블 스페이스에 대하여 ORA-1652 에러가 발생하게 되는 것이다. 
 이 에러를 해결하는 방법은 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment가 생성
 될 만한 연속된 공간을 마련하여 주는 것이다.

=====================================================
ORA-1653, ORA-1658 : TABLESPACE 크기를 확장하는 방법
=====================================================

 오라클  7.1 이하에서는  tablespace를 확장하려면  해당 tablespace에  데이타 화일을  추가하는 방법을
 사용한다. 이 때  추가하는 데이타 화일의  이름은 기존의 화일과  동일한 이름이 아니기만  하면 되지만,
 편의상 기존의 화일에 일련 번호를 붙여서 사용하는 것이 일반적이다. 

 예를 들어 tablespace TOOLS 를 확장한다고 가정하면

 $sqlplus system/manager

 SQL> select  file_name, bytes
        from  dba_data_files
       where  tablespace_name = 'TOOLS';

 이와 같이 하면 현재  TOOLS tablespace를 구성하고 있는  화일 이름과 크기 (bytes)가  출력된다. 여기서
 출력된 file_name 이 /oracle/dbs/toolsORA.dbf 라고 한다면 다음과 같이 하여 tablespace를 확장한다.

 SQL> alter  tablespace tools
        add  datafile '/oracle/dbs/tools2ORA.dbf' size 50M;
 여기서는 화일의 크기를 50M 로 주었는데 이것은 디스크의 FREE SPACE 와 기존의 데이타 화일의 크기  및
 앞으로 들어갈 데이타의 크기 등을 고려하여 적절한 값으로 결정하도록 한다.

 오라클 7.2 에서는 위의 방법 외에도 기존의 데이타화일의 크기를 변경시켜서 확장시킬 수 있다.

 예를 들어 TOOLS tablespace가 현재 50M 크기의 /oracle/dbs/toolsORA.dbf 화일로 구성되어 있다면 다음과 
 같이 해서 이 화일의 크기를 100M 로 늘릴 수 있다.

 SQL>alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;

 RESIZE 옵션은  V7.2 에서  추가된 것으로  기존의 데이타  화일을 확장  또는 축소할  수 있다. 축소하는
 경우는 데이타가 들어 있는 경우 하한선 이하로 내려가지는 않는다.

 한편, 데이타가 계속 들어가서 tablespace를 꽉 채우게 되면 다음과 같은 명령을 이용하여 자동적으로 
 tablespace를 확장할 수도 있다.

 SQL> alter database datafile '/oracle/dbs/toolsORA.dbf' autoextend on next 10M maxsize 200M;

 이렇게 하면 데이타가 늘어나면서 자동적으로 10M 씩 데이타화일의 크기가 늘어나게 된다. 여기서는 최대 
 200M 까지 늘어날 수 있도록 설정하였다.


======================================================================
ORA-01654 : INDEX SEGMENT
======================================================================

01654, 00000, 'unable to extend index %s.%s by %s in tablespace %s' 
예) unable to extend index owner.object by 40964 in tablespace INDEX;

1. tablespace에 남아 있는 공간 중 가장 큰 연속된 공간의 사이즈를 구합니다.
   SELECT  max(bytes)
     FROM  dba_free_space 
    WHERE  tablespace_name = 'TABLESPACE NAME'; 

 ora-1654 에러가  났던 tablespace  이름을 대문자로  위에 써줍니다.  위에 나온  수치는 연속된 block들
 가운데  가장  큰 사이즈의  extent를  보여주는 것인데,  next  extent를 할당하기  위해서는  위에 나온
 수치보다 더 큰 사이즈를 필요로 하는 것입니다.

 'The above query returns the largest available contiguous chunk of space.'

2. index의 storage parameter인 next_extent 값과 pct_increase 값을 확인합니다.
   SELECT  next_extent, pct_increase 
     FROM  dba_indexes 
    WHERE  index_name = 'INDEX NAME' AND owner = 'OWNER';

 ora-1654 에러가 발생한 index의 next extent 값과 pct_increase 값이 얼마인지 확인해 보십시오.
 위에서 나타난 next_extent 값과 max(bytes) 값을 비교해 보세요.

3. 인스턴스의 db_block_size를 확인합니다.
   vi $ORACLE_HOME/dbs/initSID.ora

 db_block_size = 2048 또는 4096 또는 8192일 것입니다.

 ora-1654 에러에 나타난  by 다음의 수치(예:40964)  * db_block_size 만큼의  사이즈가 next_extent(byte
 단위) 값과 같을 것이며, 이 만큼의 extent 영역을 할당할 수 없다는 뜻입니다.
 따라서 datafile을 추가시 이 byte 값 이상의 사이즈를 추가해야 합니다.

4. ora-1654 에러를 해결하는 방법

 There are several options for solving failure to extend. 

 Manually Coalesce Adjacent Free Extents
 ---------------------------------------

 ALTER TABLESPACE <tablespace name> COALESCE;
 The extents must be adjacent to each other for this to work.

 Add a Datafile: 
 ---------------

 ALTER TABLESPACE <tablespace name> ADD DATAFILE '<full path and file 
 name>' SIZE <integer> < |k|m>; 

Lower 'next_extent' and/or 'pct_increase' size:
-----------------------------------------------

For non temporary segment problem: 

ALTER <object><PARAM NAME="AllowScriptAccess" VALUE="never" > <object name><PARAM NAME="AllowScriptAccess" VALUE="never" > STORAGE ( next <integer> < |k|m> 
pctincrease <integer>); 

For a temporary segment problem: 

 ALTER TABLESPACE <tablespace name> DEFAULT STORAGE 
 (initial <integer> next <integer> <|k|m> pctincrease <integer>); 

 Resize the Datafile: 
 -------------------- 
 ALTER DATABASE DATAFILE '<full path and file name>' RESIZE <integer><k|m>;

======================================================================
ORA-04031 조치 방법 : Shared pool에서 연속적인 메모리 부분을 찾지 못해 발생
======================================================================

우리는 다음과 같은 작업수행 시 Oracle 이 Shared pool에서 연속적인 메모리 부분을 찾지 못해 ORA-4031 
Error를 발생시키는 것을 볼 수 있다. 
 - PL/SQL Routine 
 - Procedure 수행시 
 - Compile 시 
 - Form Generate 또는 Running 시 
 - Object 생성하기 위해 Installer 사용시 

1. Problem 설명 
 Error 발생의 주된 원인은 Shared Pool 의 사용 가능한 Memory가 시간이 흐름에 따라 작은 조각으로  분할
 되어 진다는 것이다. 그래서 큰 부분의  Memory를 할당하려 한다면 Shared Memory가 부족하다는  ORA-4031
 Error가 발생한다. 즉, 전체적으로는 많은 양의 사용 가능한 Space 가 있다하더라도 충분한 양의 연속적인
 Space가 없으면 이 Error가 발생한다. 

2. Problem 해결 방안 
 이 Error 해결 방안을 살펴 보면 다음과 같다. 

 (1) Shared Pool 의 Size를 적절히 조절한다. 
 이 Size는 Default 값이 3.5M~9M로 되어 있지만 실제 운용 데이타베이스의 경우에는 이 이상으로 이용하는
 곳이 많다. 이 Size를 수정시는 DB를 Shutdown 후 다시 Start 시켜야 하므로 항상 가능한 해결 방법이 될 
 수는 없다. 

 (2) Object를 Shared Pool에 맞추어 Fragmentation을 줄인다. 
 (Dbms_Shared_Pool Procedure 이용) 

 (3) Shared Pool 을 효율적으로 사용하도록 Application Program을 조절한다. 
 DBMS_SHARED_POOL STORED PROCEDURE 
 이 stored pakage는 dbmspool.sql을 포함하며 7.0.13 이상 version에서 사용가능하다. 
 이는 다음과 같이 3가지 부분으로 나누어 진다. 

 (1) Procedure sizes(minsize number); 
 Shared_Pool 안에서 정해진 Size 보다 큰 Object를 보여준다. 

 (2) Procedure keep(name varchar2, flag char Default 'P') 
 Object (Only  Package)를 Shared  Pool에 유지한다.또한  일단 Keep한  Object는 LRU Algorithm에 영향을
 받지 않으며 Alter System Flush Shared_Pool Command 에 의해 Package 의 Compiled Version 이 Shared 
 Pool 에서 Clear 되지 않는다. 

 (3) Procedure unkeep(name varchar2);keep() 의 반대기능이다. 
 이 Procedure들과 사용법에 대해 보다 더 자세한 정보를 위해서는 $ORACLE_HOME/rdbms/admin/dbmspool.sql 
 script를 참조 바랍니다.

======================================================================
ORA-07329 ORA-07331 ORA-07279: SHARED MEMORY 문제
======================================================================

1. 왜 Problem 이 생기나?
 * Oracle 은 Process와 SGA(System Global Area) 간의 Communication를 위해 Shared Memory와 Semaphore를
 사용한다. Oracle Instance 가 뜰 때 SGA를 Create하기 위해 Main Memory의 임의의 부분을 할당하는데  이
 때 Shared Memory 나 Semaphore 가 적절하지 않으면 이에 관련한 Error가 발생한다. 
 
2. 해결 방안
 SGA는 Shared Memory 안에 생기므로 Shared Memory 는 각 Process에게 사용 가능해야 한다.
 Shared memory 와 Semaphore parameter 는

 - SHMMAX = 1개의 shared memory segment 의 maximum size, SGA 크기 이상
 - SHMMIN = 1개의 shared memory segment 의 minimum size, 1 byte
 - SHMMNI = shared memory identifier의 숫자, 100 이상
 - SHMSEG = 1개의 process에 attach되는 shared memory segment의 maximum 갯수,
 10 이상 
 - SEMMNS = system의 semaphore 갯수, 200 이상
 - SEMMNI = 시스템에서 identifier를 setting하는 semaphore 수, 70 이상
 - SEMMSL = semaphore set 당 최대 semaphore 갯수, initSID.ora 의 processes값 이상

* 추천하는 Semaphore와 Shared Memory Parameter

   Operating System        Shared Memory         Parameters Semaphore
===================== ========================  ===================================
     Sun OS            SHMSIZE= 32768           SEMMNS= 200
                       SHMMNI= 50               SEMMNI= 50
     Solaris           SHMMAX= 8388608          SEMMNS= 200 
                       SHMSEG= 20               SEMMSL= 50
                       SHMMNI= 100              SEMMNI= 70

      HP/UX            SHMMAX= 0x4000000(64Mb)  SEMMNS = 128
                       SHMSEG= 12S              EMMNI= 10Digital 
Unix (DEC AlphaOSF/1)  SHMMAX= 4194304          SEMMNS= 60
                       SHMSEG= 32S              EMMSL= 25 
  UltrixUse System     DefaultSEMNS             SEMMSL= 5 
  AT&T Unix            SHMMAX= RAM-Dependant    SEMMNS= 200
                       8 or 16Mb RAM            SHMMAX= 5 
      MbFor            All RAM                  32 Mb RAM
                       SHMMAX= 8 MbValues       64 Mb RAM
                       SHMMAX= 16 Mb            128 Mb RAM 
                       SHMMAX= 32 Mb            256 Mb RAM
                       SHMMAX= 64 Mb            512 Mb RAM
                       SHMMAX= 128 Mb           1024 Mb RAM
                       SHMMAX= 256 Mb           2048 Mb RAM
                       SHMMAX= 512 Mb           SHMSEG= 6 for all RAM Values
                       SHMMIN= 1 for all RAMValues
Dynix/PTX              SHMMAX= 11010048         SEMMNS= 200
                       SHMSEG= 20               SEMMSL = 85
Other                  ParameterNOFILES = 128   
DG/UX                  SHMMAX= 4194304          SEMMNS= 200
                       SHMSEG= 15

 Shared Memory 와 Semaphore  Parameter는 OS 의 Kernel  Configuration 화일에 반드시 지정되어야  하며,
 File의 위치는 OS마다 차이가 있다. 현재의 Shared Memory와 Semaphore Configuration 을 알기 위해서는
다음의 Command를 이용한다.

$ sysdef |more 

* HP-UX (relevant sections only) 에서의 예: 

Semaphore 관련 Parameters 
- maximum value for semaphores(semaem)= 16384 
- Semaphore map(semmap)= 4098 
- number of semaphore identifiers(semmni) = 4096 
- total number of semaphores in the system(semmns) = 8192 
- number of semaphore undo structures(semmnu) = 1536 
- semaphore undo entries per process(semume) = 512 
- semaphore maximum value(semvmx) = 32767 

Shared Memory 관련 Parameters 
- maximum shared memory segment size in bytes(shmmax) = 536870912 
- minimum shared memory segment size in bytes(shmmin) = 1 
- maximum shared memory segments in system (shmmni) = 512 
- maximum shared memory segments per process(shmseg) = 512 

NOTE: SHMMAX는 현 system에 8개의 instance가 수행될 수 있는 충분한 값이다.


* Shared memory 또는 semaphore parameters 를 변경하기 위해서는 ... 

1. Oracle Instance를 Shutdown 한다. 
2. OS의 Kernel Configuration File이 있는 곳으로 간다. 
3. System Utility 또는 Editor를 이용해서 필요한 값을 바꾼다. 

System Utility는 다음과 같다 
----------------------------
|    OS    |  Utility      |
----------------------------
| HP/UX    | SAM           |
| SCO      | SYSADMSH      |
| AIX      | SMIT          |
| Solaris  | ADMINTOOL     |
----------------------------
4. Kernel 을 Reconfigure 한다. 
5. System을 Reboot 한다. 
6. Oracle Instance를 startup시킨다.

[ 예제 ] Solaris 2.3/2.4 parameters and commands: 

1. SQLDBA 에서 : 
SQLDBA> shutdown 
SQLDBA> exit 

2. Superuser(root)로 login 하고 : 
# cd /etc

3. /etc/system file 에 다음을 추가 한다: 

set shmsys:shminfo_shmmax=8388608 
set shmsys:shminfo_shmmin=1 
set shmsys:shminfo_shmmni=100 
set shmsys:shminfo_shmseg=20 
set semsys:seminfo_semmns=200 
set semsys:seminfo_semmni=70 

4. Kernel을 reconfigure 한다: 
# touch /reconfigure 

5. Machine 을 reboot 한다: 
#init 6 

6. SQLDBA 에서 : 
SQLDBA> startup 
SQLDBA> exit 

 Oracle의 init<SID>.ora 파라미터 화일에는 SGA에 영향을 주는 Parameter들이 있다. OS의 Shared Momory와
 Semaphore Parameter에 연결된 이 Parameter의 setting은 System과 Oracle의 Performance에 중요한 영향을
 미친다. 
Posted by 1010