블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

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

공지사항

최근에 올라온 글

* 데이터 검색

SELECT 칼럼명 , GROUP 함수

FROM 테이블명

WHERE 조건식

GROUP BY 칼럼명

HAVING 조건식

ORDER BY 칼럼이나 표현식 ;

 

 

- DISTINCT : 중복행을 제거함. 항상 SELECT 바로 다음에서 기술

DISTINCT뒤에 나타나는 컬럼들은 모두 DISTINCT의 영향를 받음 기본적으로 오름차순 정렬됨

- ALIAS : 나타날때 컬럼에 대하여 다른 이름을 부여함

- GROUP BY : 전체 데이터를 소그룹으로 나눌 칼럼을 명시한다.

- HAVING : GROUP에 대한 조건을 기술한다.

 

* WHERE절에 사용되는 연산자의 3가지 부류

1. 논리 연산자

- AND : 여러조건을 동시에 만족한다.

- OR : 여러조건들 중 어느 하나라도 만족한다.

- NOT : 조건에 대한 반대를 돌려준다.

2. 논리 비교 연산자 - = : 같다.

- > : 보다 크다.

- >= : 보다 크거나 같다.

- < : 보다 작다.

- <= : 보다 작거나 같다.

 

SQL 비교 연산자 - BETWEEN a AND b : a와 b사이에 있다.(a,b값 포함)

- IN (list) : list의 값 중 어느 하나와 일치한다.

- IS NULL : NULL값을 가졌다.

LIKE '%문자_문자%' : % 는 0개서부터 여러개까지의 문자열을 나타내는

와일드카드 (wildcard)이고 '_' 는 단 하나의 문자를 나타내는 와일드카드입니다.

와일드 카드를 일반문자처럼 쓰고 싶은 경우에는 ESCAPE 옵션을 사용

WHERE name LIKE '%X_Y%' ESCAPE ''

 

EX)

SQL> SELECT name,salary*18 AS 연봉

2 FROM s_emp;

SQL> SELECT name||' '||title

2 FROM s_emp ;

 

SQL> SELECT name, salary*18 연봉 , title

2 FROM s_emp

3 ORDER BY salary*18 DESC ;

 

SQL> SELECT name , salary

2 FROM s_emp

3 WHERE salary BETWEEN 1000 AND 1500;

 

SQL> SELECT name, title , dept_id

2 FROM s_emp

3 WHERE dept_id IN (110,113) ;

 

SQL> SELECT name, start_date , title

2 WHERE start_date BETWEEN '01-JAN-91'

3 AND '31-DEC-91' ;

 

SQL> SELECT dept_id , count(*) 인원수

2 FROM s_emp

3 WHERE dept_id = 110

4 GROUP BY dept_id ;

 

SQL> SELECT dept_id , AVG(salary)

2 FROM s_emp

3 GROUP BY dept_id ;

 

SQL> SELECT dept_id , AVG(salary)

2 FROM s_emp

3 WHERE title = '사원'

4 GROUP BY dept_id ;

 

SQL> SELECT dept_id , title , COUNT(*)

2 FROM s_emp

3 GROUP BY dept_id , title ;

 

SQL> SELECT title , AVG(salary) , COUNT(*)

2 FROM s_emp

3 GROUP BY title

4 HAVING COUNT(*) > 2 ;

 

SQL> SELECT title , SUM(salary) 급여총합

2 FROM s_emp

3 WHERE title NOT LIKE '%부장'

5 HAVING SUM(salary) > 10000

6 ORDER BY SUM(salary) ;

 

* SQL*PLUS의 기능

 

- 버퍼에 있는 명령어 편집하기

A(PPEND) text : line의 끝에 text를 추가함

C(HANGE)/old/new : old를 new로 바꿈

DEL n : n line을 지움

I(NPUT) text : 다음 line에 text를 추가함

L(IST) : 전체 문장을 보여줌

n text : n line전체를 text로 바꿈

R(UN) : buffer에 있는 문장을 실행함(/ 와 같음)

EDIT : buffer에 있는 문장을 파일로 부름(afiedt.buf)

 

- 파일에 있는 명령어 편집하기

SAVE a : buffer에 있는 내용을 a.sql 파일로 저장

GET a : 파일 a에 있는 내용을 buffer로 부름

START a (=@a) : 파일 a를 실행함

! : UNIX Shell로 나들이

!vi a.sql : 파일 a.sql을 vi편집기로 부름

 

- 환경설정 : SET 환경변수 값

COLSEP (text) : 칼럼이 표시될때 칼럼간의 구별문자 기본값은 공백

FEEDBACK (off|on) : 선택된 행이 몇행인지를 표시함 기본값은 6행 이상인 경우에 on

HEADING (off|on) : 칼럼에 대한 HEADING를 표시함 기본 값은 on

LINESIZE (n) : 한 라인당 표시되는 문자의 수 기본값은 80

PAGES (n) : 한 페이지당 표시되는 라인수 기본값은 24

PAUSE (off|on|text) : 「ENTER」키를 누를 때마다 화면이 지나감 기본값은 off

TIMING (off|on) : SQL문장이 처리되는데 걸리는 시간을 표시 기본값은 off

SHOW : SET 환경이 어떻게 설정되어 있는지 보는 명령어

SHOW ALL : 전체가 어떻게 설정되어 있는지 보고 싶은 경우

 

!. 자신이 쓰는 환경을 항상 맞추고 싶으면 login.sql 파일에 SET환경을 설정하면 됩니다.

 

- 표시형식

COL(UMN) 칼럼이나 ALIAS 옵션

 

- 옵션의 종류 - CLE(AR) : 칼럼에 지정된 형식을 지움

- FOR(MAT) : 형식 칼럼에 대한 표시 형식과 폭을 바꿈

- HEADING text : 칼럼에 대한 HEADING를 지정함

ex)

SQL> COL name HEADING '사원이름' FORMAT A10

SQL> COL salary FORMAT $9,999,999

SQL> COL salary CLEAR

CLEAR COLUMNS : 지정된 형식을 다 지우고 싶은 경우

 

- 변수사용

& 변수 사용 :

사용자가 원하는 데이터를 사용할 때마다 입력하고 싶은 경우에 치환변수를 사용.

사용시에는 &기호를 이용

&&기호를 사용하면 한번 입력받은 변수값을 다시 적용할 수 있음

&기호를 이용하여 조건, 칼럼명, 테이블명, 전체 SELECT구문도 받을 수 있음

EX)

SQL> SELECT id,name,dept_id

2 FROM s_emp

3 WHERE dept_id = &부서번호 ;

Enter value for 부서번호: 112

old 3: WHERE dept_id = &부서번호

new 3: WHERE dept_id = 112

 

 

- ACCEPT를 사용한 변수

사용자가 SELECT구문을 사용하기 전에 미리 변수를 설정해 놓는 경우에 ACCEPT를

사용할 수 있습니다.

> ACCEPT 변수명 데이터타입 FORMAT PROMPT text HIDE

데이터타입 : NUMBER,CHAR,DATE 중에서 지정

FORMAT : A10, 9,999등의 표시 형식지정

PROMPT text : 사용자가 데이터를 입력할 때 보여주는 문장

HIDE : password등을 지정시 화면에 보이지 않도록 함

EX)

SQL> ACCEPT p_salary NUMBER PROMPT '급여 입력 :'

SQL> ACCEPT pswd CHAR PROMPT 'Password : ' HIDE

 

 

 

* 단일행 함수

- 문자형 함수

UPPER : 모든 문자를 대문자로 전환

LOWER : 모든 문자를 소문자로 전환

INITCAP : 문자를 단어별로 앞머리는 대문자 나머지는 소문자로 전환

CONCAT : 두 문자열을 합성. ||연산자와 같은 용도로 사용

SUBSTR : 특정문자열의 부분을 선택

LENGTH : 문자열의 길이를 구함

LPAD : 왼쪽 문자 자리를 채움

RPAD : 오른쪽 문자 자리를 채움

LTRIM : 왼쪽 문자를 지움

RTRIM : 오른쪽 문자를 지움

TRANSLATE : 특정 문자열을 대체

REPLACE : 특정 문자열을 대신

 

UPPER(문자값) : UPPER('Oracle Server')

→ ORACLE SERVER

LOWER(문자값) : LOWER('Oracle Server')

→ oracle server

INITCAP(문자값) : INITCAP('Oracle Server')

→ Oracle Server

CONCAT(문자값1, 문자값2) : CONCAT('Oracle',' Server')

→ Oracle Server

SUBSTR(문자값, a, b)

 

a 선택할 문자열의 시작위치. 음수면 끝에서부터 시작

b 선택할 문자열의 개수. 이 인자는 생략할 수 있으며, 생략할 경우 문자열의 끝까지 선택

 

: SUBSTR('강남구 역삼동',5,2)

→ 역삼

LENGTH(문자값1, a, 문자값2) : LENGTH('홍길동')

→ 3

LPAD(문자값1, a, 문자값2)

RPAD(문자값1, a, 문자값2)

 

a : 전체 채울 자리수

문자값2 : 채울 문자

생략할 수 있으며, 생략되면 공백값임

 

: LPAD('홍길동',10 '*')

→ ****홍길동

LTRIM(문자값1, 문자값2)

RTRIM(문자값1, 문자값2)

문자값1에서 왼쪽(오른쪽)에서부터

더이상 문자값2를 만나지 않을 때까지 지움

 

: LTRIM('XXAXBA','X')

→ AXBA

TRANSLATE(문자값, a, b)

a 대체하고 싶은 문자(from)

b 대체할 결과의 문자(to)

 

: TRANSLATE('AABBA','B','C')

→ AACCA

REPLACE (문자값, a, b)

a 바꾸고 싶은 문자(from)

b 바꿀 결과의 문자(to)

 

: REPLACE ('JACK and JUE','J','BL')

→ BLACK and BLUE

 

- 숫자형 함수

ROUND : 숫자를 반올림

TRUNC : 숫자를 절사

MOD : 나누기 연산에서 나머지 구함

POWER : 거듭제곱

SQRT : 제곱근

SIGN : 양수인지 음수인지 0인지를 구벌함

CHR : ASCII 값에 해당하는 문자를 구함

ROUND(숫자값, a), TRUNC(숫자값, a) a 숫자값을 반올림(버림)하여 a자리까지 돌려줌.

a가 양수이면 소수이하자리를, 음수이면 정수 부분 자리임 생략할 수 있으며, 생략하면 0

 

: ROUND(35.735,2)→35.74

MOD(숫자값, a )

a 숫자값을 나누기 할 수 있음

 

: MOD(7,2)→1

POWER(숫자값1, 숫자값2) : POWER(3,2)→9

SQRT (숫자값) : SQRT(25)→5

SIGN(숫자값) : SIGN(-15)→-1

CHR(숫자값) : CHR(65)→A

 

- 날짜형 함수

SYSDATE : 현재 시스템의 날짜 및 시간을 구함

LAST_DAY : 지정한 날짜의 해당 월의 마지막 날짜를 구함

MONTHS_BETWEEN : 두 날짜 사이의 개월 수를 구함

ADD_MONTHS : 지정한 날짜로부터 몇 개월 후의 날짜를 구함

ROUND : 날짜에 대한 반올림

TRUNC : 날짜에 대한 버림

 

SYSDATE :

SYSDATE → 10-MAY-99

 

LAST_DAY(날짜값) :

LAST_DAY('17-FEB-98') → 28-FEB-98

 

MONTHS_BETWEEN(날짜값1, 날짜값2) :

MONTHS_BETWEEN('26-APR-97','22-JUL-95') → 21.1290323

 

ADD_MONTHS(날짜값, 숫자값) :

ADD_MONTHS('22-JUL-95',21) → 22-APR-97

 

ROUND(날짜값, 자리수) :

현재 날짜가 1999년 5월 10일이라고 가정하자.

 

ROUND(SYSDATE,'MONTH') → 01-MAY-99

 

TRUNC(날짜값, 자리수) :

현재 날짜가 1999년 5월 10일이라고 가정하자.

 

TRUNC(SYSDATE,'YEAR') → 01-JAN-99

 

- 날짜에 대한 산술연산

날짜 + 숫자 : 날짜 특정한 날로부터 몇일 후의 날짜 계산

날짜 - 숫자 : 날짜 특정한 날로부터 몇일 전의 날짜 계산

날짜 - 날짜 : 숫자 두 날짜 사이의 차이를 숫자로 계산

 

- 변환형 함수

TO_CHAR : 숫자나 날짜를 문자열로 변환

TO_NUMBER : 문자를 숫자로 변환

TO_DATE : 문자를 날짜로 변환

 

- TO_CHAR에서 숫자를 문자로 변환시에 형식에 사용되는 요소

9 : 일반적인 숫자를 나타냄

0 : 앞의 빈자리를 0으로 채움

$ : dollar를 표시함

L : 지역 통화 단위(ex )

. : 소숫점을 표시함

, : 천단위를 표시함

 

- TO_CHAR에서 날짜를 문자로 변환시에 형식에 사용되는 요소

SCC : 세기를 표시 S는 기원전(BC)

YEAR : 연도를 알파벳으로 spelling

YYYY : 4자리 연도로 표시

YY : 끝의 2자리 연도로 표시

MONTH : 월을 알파벳으로 spelling

MON : 월의 알파벳 약어

MM : 월을 2자리 숫자로 표시

DAY : 일에 해당하는 요일

DY : 일에 해당하는 요일의 약어

DDD,DD,D : 연도,월,일 중의 날짜를 숫자로 표시

HH , HH24 : (1-12) , (0-23)중의 시간을 표시

MI : 분을 표시

SS : 초를 표시

AM(A.M.),PM(P.M.) : 오전인지 오후인지를 표시

 

TO_CHAR(문자값,'형식')

숫자를 문자로 변환

: TO_CHAR(350000,'$999,999')→ $350,000

 

숫자를 날짜로 변환

: TO_CHAR(SYSDATE,'YY/MM/DD')→ 95/05/25

TO_DATE(문자값, '형식') : TO_DATE('10 SEPTEMBER 1992','DD MONTH YYYY')→10-SEP-92

TO_NUMBER(문자값) : TO_NUMBER('1234')→ 1234

 

- DECODE 함수

DECODE 함수는 값을 비교하여 해당하는 값을 돌려주는 함수

> DECODE (형식,비교값1,결과치1,비교값2,결과치2,...기본치 )

형식 : 컬럼이나 값

비교값1 : 형식이 비교값1에 맞는지를 비교

결과값1 : 형식이 비교값1에 맞을 때 갖는 값

기본치 : 형식이 비교값1,2,...에 맞지 않을 때 가지는 값

생략될 수 있으며, 생략되면 NULL이다.

 

EX)

SQL> SELECT name,title,DECODE(SUBSTR(title,-2,2),

2 '부장',salary*1.1,

3 '과장',salary*1.07,

4 '사원',salary*1.05,

5 salary) 이번달급여

6 FROM s_emp

7 ORDER BY 3 DESC ;

 

* 다중행 함수

- 그룹함수

COUNT( a ) : a의 행의 개수를 구함

AVG( a ) : a의 평균을 구함

SUM( a ) : a의 합계를 구함

MIN( a ) : a의 최소값을 구함

MAX( a ) : a의 최대값을 구함

STDDEV( a ) : a의 표준 편차를 구함

VARIANCE( a ) : a의 분산을 구함

 

COUNT(*)를 제외한 모든 그룹함수는 NULL값을 고려하지 않습니다.

중복값을 제거하고 싶은 경우는 a의 앞에 DISTINCT를 기술합니다.

MAX , MIN , COUNT를 제외한 그룹함수는 숫자타입의 데이터에만 가능합니다

 

* JOIN

- EQUIJOIN

컬럼에 있는 값들이 정확하게 일치하는 경우에 =연산자를 사용하여 JOIN하는 방법을 말합니다.

WHERE 절에서 JOIN조건을 기술하도록 합니다.

 

SELECT 테이블명.컬럼명, 테이블명.컬럼명, ...

FROM 테이블1, 테이블2

WHERE 테이블1.컬럼1 = 테이블2.컬럼2 ;

 

EX)

SQL> SELECT s_emp.name, s_emp.dept_id , s_dept.name

2 FROM s_emp , s_dept

3 WHERE s_emp.dept_id = s_dept.id ;

SQL> SELECT e.name 사원명, e.dept_id , d.name 부서명

2 FROM s_emp e, s_dept d

3 WHERE e.dept_id = d.id ;

SQL> SELECT e.name 사원명, d.name 부서명

2 FROM s_emp e, s_dept d , s_region r

3 WHERE e.dept_id = d.id

4 AND d.region_id = r.id

5 AND r.name LIKE '%서울%' ;

 

- NON-EQUIJOIN

Non-Eqijoin이란 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지 않는 경우에

=연산자외의 다른 연산자를 사용하여 JOIN하는 방법을 말합니다

 

SQL> SELECT e.name, e.salary , g.grade 급여등급

2 FROM s_emp e, salgrade g

3 WHERE e.salary BETWEEN g.losal AND g.hisal ;

 

- OUTER JOIN

Outer join이란 JOIN조건을 만족하지 않는 경우에도 모든 행들을 다 보고자하는 경우에 JOIN하는 방법

SQL> SELECT e.name 사원명 ,e.id,c.name 고객명

2 FROM s_emp e, s_customer c

3 WHERE e.id (+) = c.sales_rep_id

4 ORDER BY 2;

 

- SELF JOIN

Self join이란 한 테이블의 행을 같은 테이블에 있는 행과 연결하는 방법으로 같은

테이블을 마치 두개의 테이블인 것처럼 사용하여 JOIN하는 방법을

SQL> SELECT w.id 사번, w.name 사원명 ,

2 m.id 부서장사번, m.name 부서장명

3 FROM s_emp w, s_emp m

4 WHERE w.manager_id = m.id ;

 

- SET 연산자의 활용

UNION : 각 QUERY결과의 합집합

UNION ALL : 각 QUERY결과의 합집합에 공통부분을 더함

INTERSECT : 각 QUERY결과의 교집합

MINUS : 첫번째 QUERY결과와 두번째 QUERY결과의 차집합

 

SELECT 칼럼1, 칼럼2 . . .

FROM 테이블1 . . .

SET 연산자

SELECT 칼럼1`, 칼럼2` . . .

FROM 테이블2 . . .

ORDER BY ;

 

SQL> SELECT name , dept_id , title

2 FROM s_emp

3 WHERE dept_id = 110

4 UNION

5 SELECT name , dept_id , title

6 FROM s_emp

7 WHERE dept_id = 113

8 ORDER BY 1 ;

 

* SUBQUERY

- SUBQUERY의 문형

 

SELECT 검색할 컬럼들

FROM 테이블명

WHERE 형식 연산자 (SELECT 검색할 컬럼들

FROM 테이블명

. . . );

 

SUBQUERY는 괄호로 묶여 있어야 합니다.

SUBQUERY구문에서는 ORDER BY절을 포함할 수 없습니다.

SUBQUERY는 연산자의 오른쪽에 나타나야 합니다.

SUBQUERY에서 사용할 수 있는 연산자의 종류에는

- 단일행 연산자(=, >, >=, <, <=, <>)

- 복수행 연산자 (IN, NOT IN)가 있습니다.

 

SUBQUERY를 사용할 수 있는 절의 종류

WHERE 절

HAVING절

UPDATE절

INSERT구문의 INTO절

UPDATE구문의 SET절

SELECT나 DELETE의 FROM절

 

- SINGLE ROW SUBQUERY

SUBQUERY에서 Main Query로 전달되는 행이 단 하나인 경우

이런 경우는 단일 행 연산자를 사용합니다

SQL> SELECT name, title , dept_id

2 FROM s_emp

3 WHERE dept_id = 김정미가 근무하는 부서;

SQL> SELECT dept_id

2 FROM s_emp

3 WHERE name = '김정미';

SQL> SELECT name, title , dept_id

2 FROM s_emp

3 WHERE dept_id = (SELECT dept_id

4 FROM s_emp

5 WHERE name = '김정미') ;

SQL> SELECT name, salary ,title

2 FROM s_emp

3 WHERE title = (SELECT title

4 FROM s_emp

5 WHERE name = '최정선')

6 ORDER BY salary ;

 

- MULTI ROW SUBQUERY

SUBQUERY에서 Main Query로 전달되는 행이 여러 개인 경우를 말합니다.

이런 경우는 다중 행 연산자를 사용합니다.

SUBQUERY에서 넘어오는 행이 여러 개이므로, 이때 사용되는 연산자는 IN임을 주의하세요.

SQL> SELECT name, dept_id

2 FROM s_emp

3 WHERE dept_id IN (SELECT id

4 FROM s_dept

5 WHERE region_id =3 ) ;

SQL> SELECT name , dept_id

2 FROM s_emp

3 WHERE dept_id IN

4 (SELECT id

5 FROM s_dept

6 WHERE region_id =

7 (SELECT id

8 FROM s_region

9 WHERE name = '서울특별시') ) ;

 

- MULTI COLUMN SUBQUERY

SUBQUERY구문을 작성할 때 WHERE절에서 비교하는 컬럼이 하나가 아니라

여러개의 컬럼을 동시에 비교하는 경우를 말하며, 이런 경우를 Pair-wise되었다고 합니다.

 

- Non-Pairwise SUBQUERY

SQL> SELECT name, dept_id, salary

2 FROM s_emp

3 WHERE salary IN (SELECT MIN(salary)

4 FROM s_emp

5 GROUP BY dept_id );

 

Pairwise SUBQUERY

SQL> SELECT name, dept_id, salary

2 FROM s_emp

3 WHERE (salary,dept_id) IN

4 (SELECT MIN(salary),dept_id

5 FROM s_emp

6 GROUP BY dept_id );

 

- FROM절에서의 SUBQUERY

한 테이블에 데이터 양이 많은 경우에는 FROM절에 테이블 전체를 기술하여

사용하면 효율이 떨어질 수 있으므로 이런 경우에는 필요한 행과 열만을

선택하여 FROM절에 SUBQUERY로 기술함으로써 효율적인 데이터 검색을 할 수 있습니다.

SQL> SELECT e.name , e.title , d.name

2 FROM (SELECT name ,title , dept_id

3 FROM s_emp

4 WHERE title = '사원') e , s_dept d

5 WHERE e.dept_id = d.id ;

 

- HAVING절에서의 SUBQUERY

일반적인 조건은 WHERE절에서 기술하지만, GROUP에 대한 조건은 HAVING절에서 기술합니다.

이 때 HAVING의 조건에 기술할 값이 주어져 있지 않은 경우에 모르는 값에 대한 데이터를

검색하기 위하여 SUBQUERY를 사용할 수 있습니다

SQL> SELECT dept_id , AVG(salary)

2 FROM s_emp

3 GROUP BY dept_id

4 HAVING AVG(salary) > (SELECT AVG(salary)

5 FROM s_emp

6 WHERE dept_id = 113) ;

 

- CORRELATED SUBQUERY

Outer Query의 candidate row가 더 이상 남지 않을때까지 반복됩니다.

CORRELATED SUBQUERY인 경우는 Outer Query의 각 행에 대해서 Inner Query가 매번 수행됩니다.

 

SQL> SELECT name, salary ,dept_id

2 FROM s_emp outer

3 where salary < (SELECT AVG(salary)

4 FROM s_emp

5 WHERE dept_id = outer.dept_id) ;

 

바로 2번째 LINE의 OUTER라는 테이블 ALLAS를 5번 LINE에서 사용하게 되면

내부적으로 CORRELATE SUBQUERY의 진행방식을 따르게 됩니다.

Posted by redkite
, |

[Oracle] DB 관리 쿼리

 

#### system 계정으로 로그인해서

# 테이블스페이스 이름 보기
select ts#,rfile#,name from v$datafile order by ts#

# user별 테이블스페이스 정보 보기
select username,password,default_tablespace,temporary_tablespace from dba_users

# 테이블스페이스 만들기
create tablespace spaceName
datafile '/oracle/oradata/data.dbf' size 200m
default storage
(initial 1m next 1m
minextents 1 maxextents unlimited pctincrease 0);

# 테이블 스페이스 자동증가 on
alter database datafile '/oracle/oradata/data.dbf' autoextend on;

# 사용자 만들기
create user userName identified by password default tablespace spaceName temporary tablespace tempSpaceName

# 권한 만들기
create role roleName;
grant create session, create table, create view, create synonym to roleName;

# 권한 부여
grant roleName to userName

# Resource 부여
grant resource to userName

# import
imp userid=system/manager file=xxx.dmp fromuser=aaa touser=aaa full=n commit=y ignore=y log=logfile.log

#### 해당 user로 로그인해서

# data space 사용량 조회
select table_name,tablespace_name from user_tables;
select index_name,table_name,tablespace_name from user_tables;
select segment_name,tablespace_name,sum(bytes) from user_extents
where segment_type='TABLE' group by segment_name,tablespace_name;
select segment_name, sum(bytes) from user_extents
where segment_type='TABLE' group by segment_name

Posted by redkite
, |
인덱스 생성: Syntax
하나 또는 하나 이상의 Column에 인덱스를 생성

CREATE INDEX 인덱스
ON 테이블(Column[,Column]...);


♠예 :S_EMP테이블의 LAST_NAME Column에 대한 질의 액세스 속도를 빠르게 하기 위한 인덱스를 만드시오.

  SQL>CREATE INDEX s_emp_last_name_idx
2 ON s_emp(last_name);

Index created.



인덱스 생성:Guideline

  1. 인덱스를 만드는 때
  WHERE절이나 조인 조건에서 Column을 자주 이용할 때
  Column이 넓은 범위의 값을 가질때
  많은 NULL 값을 갖는 Column일 때
  테이블의 Data가 많고 그 테이블에서 Query되는 행의 수가 전체의 10-15%정도 일때

 2. 인덱스를 만들지 않아야 할 때
  테이블이 작을때
  Column이 질의의 조건으로 사용되는 경우가 별로 없을 때
  대부분의 질의가 행의 10-15% 이상을 검색한다고 예상될때
  테이블이 자주 변경될때

인덱스 확인
USER_INDEXES Dictionary 뷰는 인덱스의 이름과 Unique 여부를 가지고 있다.
USER_IND_COLUMNS 뷰는 인덱스 명, 테이블 명과 Column 명을 가지고 있다.

SQL> SELECT ic.index_name, ic.column_name
2 ic.column_position, ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND table_name = 'S_EMP';


인덱스 확인
USER_INDEXES Dictionary 뷰에 인덱스가 있는지 확인하시오.
USER_IND_COLUMNS 뷰를 Query 하여 인덱스를 갖고 있는 Column을 확인할 수도 있다.
♠ 질의 예제 :S_EMP 테이블에서 이미 생성된 인덱스, 관련된 Column 명, Unique 여부를 Display 하라.


SQL> SELECT ic.index_name, ic.column_name
2 ic.column_position, ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND table_name = 'S_EMP';

인덱스 삭제
인덱스를 삭제합니다.
SQL> DROP INDEX s_emp_list_name_idx;
Index dropped.

인덱스를 삭제하려면 그 인덱스의 소유자이거나 DROP ANY INDEX 권한을 가지고 있어야 한다.


Syntax
인덱스를 수정할 수는 없다.
인덱스를 변경하려면 삭제한 다음 다시 만들어야 한다.
INDEX 명령을 써서 인덱스를 삭제하라.
인덱스를 삭제하려면 그 인덱스의 소유자이거나 DROP ANY INDEX 권한을 가지고 있어야 한다.
DROP INDEX 인덱스;



CREATE INDEX IDX_ETL_LOG_ID ON ps_mom.etl_job_log_tbl(LOG_ID); -- PS_MOM 에 인덱스 추가(2010.12.03)

--CREATE INDEX IDX_RACLIENT ON RACLIENT(CERTI_CODE,STATUS_FLAG) --ONLINE; -- 국민 RA_CLIENT 테스트 인덱스 추가(2010.12.03)

 

Posted by redkite
, |

Oracle VM Oracle Enterprise Linux Oracle 확장 RAC 클러스터 직접 구축하기

저자: Jakub Wartak

가상 환경에서 저렴한 비용으로 완벽하게 기능하는 Oracle 확장 RAC 구현하는 방법

설명서의 정보는 Oracle 검증을 받지 않았고 Oracle에서 지원하는 것이 아니므로 사용자 본인의 결정에 따라 사용해야 하며, 정보 습득을 위한 교육용 자료로만 참고해야 합니다.

업데이트일 : 2008 10

Contents

설명서는 저자의 승인을 받아 Oracle ACE Jeffrey Hunter "Build Your Own Oracle RAC 11g Cluster on Oracle Enterprise Linux and iSCSI" 설명서를 기초로 작성된 것입니다. Linux Oracle RAC 설치하는 것이 궁금할 경우 그의 설명서를 읽어 보도록 하십시오. 설명서는 독자가 Oracle RAC 어느 정도의 경험이 있음을 전제로 작성되었습니다.

1. 소개

일반적인 Oracle RAC(Real Application Cluster) 구현은 하나 또는 여러 노드의 장애를 신속하게 복구하는 아키텍처입니다. 그러나 일반적인 시나리오에서 Oracle RAC 모든 노드는 곳의 데이터 센터에 있으므로 치명적인 데이터 센터 장애로 이어지기 쉽습니다. 시나리오에서 재난 복구를 위한 솔루션은 로컬 데이터 센터와 일부 백업 데이터 센터 간에 Oracle DataGuard 설치하여 대기 시스템(일반적으로 하나의 Oracle Database 또는 다른 RAC 클러스터) 실행하는 것입니다.

DataGuard 역할을 물론 수행하지만 전체 대기 시스템과 어레이를 패시브 노드로 전환하므로 트랜잭션에 전산 능력을 사용할 없게 되며 이로 인해 솔루션 비용이 매우 높아집니다. (대기 Oracle DataGuard 시스템은 읽기 전용 쿼리를 수행하기 위해 있고 Active DataGuard in Oracle Database 11g 사용할 경우 항상 읽기 전용 모드로 실행할 수도 있지만, 구성의 경우 애플리케이션이 일부 노드의 읽기 전용 특성을 알고 있어야 합니다.)

다행히도 부분적인 재난 복구를 위한 다른 솔루션이 있으며 그것이 바로 확장 RAC입니다. 아키텍처에서 일부 RAC 노드는 "알파 사이트"에서 작동하며 나머지 노드는 "베타 사이트"에서 작동합니다. 사이트의 노드는 액티브 모드이므로 모든 전산 리소스를 충분히 사용합니다. 그림 1에서 있는 것처럼 사이트에는 전용 SAN(Storage Area Network) 있고, 양쪽 데이터 센터(dcA dcB) 있는 시스템은 동일한 RAC 구성원이므로 데이터를 신속하게 상호 교환할 있고 다른 사이트의 스토리지에 액세스할 있습니다. , dcA 있는 RAC1 노드는 dcB 있는 SAN 어레이에 데이터를 쓰고 dcB 있는 RAC2 노드와도 통신합니다.


그림 1

설명서에서는 교육상의 목적으로 하나의 PC x86 64비트 시스템에 Oracle VM 2.1 가상화 기술을 사용하여 저렴하면서도 완벽한 기능을 갖춘 Oracle 확장 RAC 구현해 보겠습니다. 자세한 구성은 그림 2 참조하십시오. IP 네트워크 설비를 위한 Linux QoS(Quality of Source) 사용하는 스토리지 이더넷 트래픽과 상호 연결의 가장 제약 요소는 지연 대기입니다. Oracle RAC 상호 연결에서의 지연 대기와 읽기 또는 쓰기 중의 I/O 지연 대기에 민감합니다.

확장 RAC 다음 요건 하나를 만족할 경우 비용을 절감시키며 기업 애플리케이션에 대한 가용성을 극대화합니다.

  • 개의 데이터센터/건물/서버실이 지연 대기가 거의 없는 고속 네트워크를 통해 직접 연결되어 있는 경우(또는 해당 위치에 스토리지 인프라가 이미 있는 경우)
  • 회사에서 시스템 가용성을 위해 투자할 계획인 경우(RAC Data Guard보다 장애 조치 시간이 짧음)

또한 이론상으로 확장 RAC에서 스토리지 어레이는 전력 공급이 중단되어도 클러스트에서 요청을 처리할 있기 때문에 최고의 안정성을 갖출 필요는 없습니다.

설명서에서 다룬 구성에서 Oracle Database 11g Release 1(RAC 구성) 대의 Oracle Enterprise Linux 5.1 시스템 상위에서 실행됩니다. Oracle RAC 노드를 위한 스토리지는 OpenFiler에서 실행하는 개의 iSCSI 스토리지 서버에서 제공합니다. 또한 구성은 Oracle ASM(Automatic Storage Management)에서 제공하는 기능과 Oracle Database 10g 이상 버전에서 제공하는 호스트/데이터베이스 기반의 미러링 기능을 사용합니다.


그림 2

실제 하드웨어를 사용하여 확장 RAC 구현함으로써 성능을 개선하는 것이 가장 이상적이지만 아키텍처는 연구 교육용이므로 이러한 절충이 허용됩니다. Oracle VM Server 설치하는 데에는 대의 컴퓨터만 필요하지만 가상 시스템을 관리하기 위한 간편한 콘솔인 Oracle VM Manager 설치하기 위해 다른 PC 필요합니다

현재까지도 선호되는 스토리지로 FCP(Fibre Channel Protocol) 선택되고 있지만 Oracle에서는 Oracle Direct NFS 같은 성능 개선과 함께 Oracle Database 11g 데이터 파일에 대해 NFS 공유 스토리지를 지원하기 시작했습니다. 이러한 설치 특성으로 인해 스토리지 옵션으로 보다 단순한 iSCSI 접근 방식을 고수하여 실제 FCP 개념을 유지할 것입니다. 확장 RAC 시나리오에서 내결함성을 갖춘 완벽한 아키텍처를 구현하려면 dcA dcB 아닌 다른 위치에 3 보팅 디스크를 갖춰야 합니다.

설명서에 나오는 디스크 미러링 구성은 실제 시나리오에는 부적합하며 I/O 멀티패칭 또는 리던던시형의 상호 연결도 지원하지 않습니다. 또한 설명서는 Oracle RAC 11g 평가 시스템을 성공적으로 설치하기 위한 자세한 지침을 제공하지만 지침이 공식적인 Oracle 설명서를 대신하는 것은 아닙니다. 설명서 외에도 다음과 같은 Oracle 설명서를 참조하여 Oracle RAC 11g 다른 구성 옵션, 설치 관리에 대해 완벽하게 알아 두어야 합니다.

Oracle VM 설치는 다음에서 수행되었습니다.

  • Intel QuadCore Q6600 2.4GHz(4 코어)
  • 8GB DDR2 RAM
  • 3x160GB SATAII 7200 RPM 하드 디스크
  • DVD 리더

Oracle VM Manager CentOS 5.0 실행되는 워크스테이션에 설치되었습니다. Oracle Enterprise Linux 5 설치해도 되지만 시간을 절약하기 위해 기존의 CentOS 설치 워크스테이션을 사용했습니다.

  • AMD Sempron 3000+(단일 코어)
  • 1.5GB DDR RAM
  • 250GB SATA 하드 디스크
  • DVD 라이터

시작하기 전에 다음 사항을 반드시 유의하도록 하시기 바랍니다: 설명서는 교육용으로 제작된 것이므로 실제 구축은 지원되지 않으며 고려되지도 않습니다. Oracle 지원 팀에서는 설명서를 참조하여 수행하는 과정에서 발생한 문제를 해결해 드리지 않습니다.

2. 필요한 소프트웨어

확장 RAC 작성하려면 아래에서 설명한 대로 다음 소프트웨어를 다운로드해야 합니다.

Oracle VM Server 2.1 Oracle VM Manager 2.1

제품은 모두 무료로 제공됩니다. 등록 Select a Product Pack 에서 Oracle VM 선택하고 Product architecture에서 x86 64 bit 선택한 다음 Go 선택해야 합니다. Oracle VM 2.1 Media Pack 선택하고 Continue 클릭합니다. 이제 다음 항목이 표시됩니다.

  • Oracle VM server 2.1 (304MB)
  • Oracle VM manager 2.1 (534MB)

항목을 미리 준비해 놓은 디렉토리로 다운로드합니다. 개의 *.zip 파일의 압축을 풀면 개의 ISO 파일이 생성되며, 평소에 사용하는 CD 굽기 소프트웨어를 사용하여 파일을 CD 굽습니다.

  • OracleVM-Server-2.1.iso
  • OracleVM-Manager-2.1.iso

(힌트: ISO 다운로드한 컴퓨터에서 설치할 경우에는 OracleVM-Manager-2.1.iso 설치하기 위해 CD 구울 필요가 없습니다. Linux에서 다음 명령을 사용하여 /mnt/cdrom 루프백 CD 마운팅할 있습니다.)

mount -o loop,ro OracleVM-Manager-2.1.iso /mnt/cdrom"

Oracle Enterprise Linux 5.1 Update 1 "Small" 템플릿(PV_x86_64)

여기에서는 설치 CD DVD 사용하여 처음부터 Linux 시스템을 설치하지 않고 Oracle에서 제공한 VM Linux 템플릿을 사용합니다. VM Linux 템플릿은 바로 실행할 있는 전체 시스템의 디스크 이미지인 바이너리 파일입니다. Oracle VM에서 제공하는 환경은 일반적인 환경이기 때문에 시스템별로 설치를 수행하여 드라이버를 생성할 필요는 없고 대신 템플릿에서 모든 Linux 인스턴스를 복제하여 실행하면 됩니다. Oracle에서는 Oracle Database 맞게 사전 구성된 템플릿을 제공합니다.

계약에 동의하고 서명한 Product Pack 선택 목록에서 Oracle VM Templates 선택하고 from the Platform 선택 목록에서 x86_64 선택한 Go 클릭합니다. Oracle VM Templates for Oracle Enterprise Linux 5 Media Pack for x86_64 (64 bit) 링크를 클릭한 다음 Oracle Enterprise Linux 5 Update 2 템플릿 - PV Small x86_64(64bit) 다운로드하도록 선택합니다.

PV(Paravirtualized) 시스템과 HVM(Hardware Virtualized) 시스템의 주요 차이점은 Linux 커널과 Oracle VM Server 커널(Xen 하이퍼바이저) 간의 상호 작용 특성입니다. HVM 시스템은 특별한 도구 없이 Xen 기능을 사용하는 표준 x86 또는 x86_64 시스템으로서 표준 PC에서 Xen 없이 실행할 있습니다. 반면에 PV 시스템은 Xen에서 실행하고 있다는 사실을 알고 있으므로 하드웨어와 통신하지 않고 Xen 직접 통신하며, HVM 경우와 달리 실제 하드웨어를 에뮬레이션할 필요가 없습니다

Oracle Database 11g Clusterware for Linux x86 64-bit

다운로드해야 파일 이름은 다음과 같습니다:

  • linux.x64_11gR1_database.zip
  • linux.x64_11gR1_clusterware.zip

OpenFiler 2.2 for Xen 64-bit

다운로드 페이지로 이동한 openfiler-2.2-x86.img.gz (~160MB) 찾습니다. 여기서는 2.2 버전을 사용하지만 2.3 버전이 있는지 확인해 봅니다. 2.3 버전에는 iSCSI 스냅샷에 대한 LUN 매핑 iSCSI 동적 볼륨 크기 조정 등과 같은 유요한 기능이 새로 추가되었습니다. , 2.3 버전은 설명서에 대해 테스트되지는 않았습니다.

3. Oracle VM Server 설치

Oracle VM Server 부팅 CD 구운 PC 넣습니다. PC 스와핑 없이 여러 개의 Linux 인스턴스를 실행하기에 충분한 CPU RAM 갖추고 있어야 합니다. 다음 설명에 따라 Oracle VM 설치합니다.

  1. "Oracle VM Server"라는 제목의 부팅 화면이 나타나면 <ENTER> 눌러 설치를 시작합니다.
  2. 그런 다음 설치하기 전에 CD 테스트하도록 선택할 있습니다. 손상되거나 잘못 구어진 CD 인해 설치가 중단되지 않도록 OK 눌러 CD 테스트하는 것이 좋습니다.
  3. 언어 선택 창에서 English 선택하고 OK 눌러 계속합니다. 그런 다음 키보드 모델을 선택하거나 기본 모델을 사용합니다.
  4. 원할 경우 파티셔닝 대화 상자에 액세스하여 기존의 파티션을 삭제할 있습니다. 기존의 파티션에 데이터가 들어 있을 있으므로 주의하십시오. 직접 만든 장비의 성능을 최대화하기 위해 개의 디스크로 구성된 RAID0 어레이를 만들 것입니다. GRUB 부트 로더는 RAID0에서 부팅할 없으므로 전용 부트 파티션을 만들어야 합니다.
    1. 모든 디스크에서 모든 파티션을 지웁니다.
    2. sda에서 ext3 파일 시스템을 포함하는 256MB/부트 파티션을 만듭니다( 번째 SATA 디스크). 여기에는 VM Server 하이퍼바이저를 부팅하는 필요한 initrd 이미지와 커널이 포함됩니다. 작성 "Force to be primary partition" 선택하여 x86 기본 파티션이 되도록 합니다. 이름을 sda1 지정합니다.
    3. sda 1GB 정도의 스왑 파티션을 만듭니다. (참고: Oracle VM dom0 기본적으로 최대 512MB 메모리를 사용하도록 구성되고 메모리를 많이 사용하는 애플리케이션이 없으므로 단지 스왑용으로 GB 스토리지를 할애할 필요는 없습니다. Dom0 기본적으로 실제 I/O 수행하고 하드웨어 작업을 처리하는 작업만 담당합니다. 하지만 domU[실제 VM] 필요에 따라 적절한 크기의 개별 스왑 공간이 필요합니다.)
    4. sda에서 Fill all available space 옵션 선택하여 "소프트웨어 RAID 파티션" 만들고, 이름을 sda3으로 지정합니다.
    5. sdb에서 Fill all available space 옵션 선택하여 "소프트웨어 RAID 파티션" 만들고, 이름을 sdb1 지정합니다.
    6. sdc에서 Fill all available space 옵션 선택하여 "소프트웨어 RAID 파티션" 만들고 이름을 sdc1 지정합니다. .
    7. 디스크가 여러 개일 경우 스토리지 성능이 극대화될 있도록 디스크에 RAID 파티션을 만듭니다.
    8. RAID 버튼을 클릭하여 소프트웨어 RAID 어레이를 만듭니다. RAID0 선택한 어레이에 포함시킬 모든 소프트웨어 RAID 파티션을 선택합니다( 시나리오의 경우: sda3, sdb1, sdc1). 파일 시스템이 "ext3"이고 마운트 지점이 "/"인지 확인합니다. (참고: 기본 RAID0 스트라이프는 256kB입니다.) Oracle VM 설치 프로그램을 사용하여 소프트웨어 RAID 어레이를 만드는 동안에는 값을 변경할 없습니다. 하지만 원할 경우 설치 전에 Alt-F2 눌러 번째 가상 콘솔로 전환하여 기존 어레이를 내리고 mdadm 사용하여 RAID 어레이를 다시 만들 있습니다. , 실제로 테스트해 보지는 않았습니다!)
    9. 변경 사항을 적용하고 OK 버튼을 눌러 파티션 변경을 저장합니다.
    10. 다음 화면에서는 부트 로더(GRUB) 설치할 위치를 선택해야 합니다. MBR(마스터 부트 레코드) 배치하십시오.
    11. 이제 관리 인터페이스로 사용할 이더넷 인터페이스를 결정해야 합니다. 예에서는 "eth0"(처음으로 검색된 이더넷 PCI 네트워크 카드) 사용합니다. 네트워크 카드를 선택했으면 올바른 IP 주소를 설정해야 합니다.
      1. "Enable IPv4 support" 옵션과 "Activate on boot" 옵션만 선택하십시오.
      2. "IPv4" 필드에 IP 주소를 입력하여 구성합니다. 시나리오에서는 "10.99.1.2" 사용합니다. 올바른 접두어/넷마스크(: "255.255.255.0" 경우 "24") 입력해야 합니다.
      3. OK 클릭하여 구성을 적용합니다.
      4. IPv4 게이트웨이와 DNS 네임 서버를 묻는 메시지가 표시됩니다(: "10.99.1.1").
      5. Hostname Configuration에서 manual 모드를 선택하고 해당 서버를 위한 알기 쉬운 호스트 이름(: "quadovm") 입력합니다.
    12. 네트워킹을 구성하면 다음을 선택하라는 메시지가 표시됩니다
      1. 시간대(해당 시간대 선택).
      2. Oracle VM Agent 암호 - Oracle VM Manager에서 Oracle VM Server 관리하는 사용할 암호이므로 신중하게 지정하고 공개되지 않도록 관리합니다.
      3. 루트 암호 - Oracle VM Server 대한 기본 관리 암호이므로 신중하게 지정해야 합니다. .

이제 설치가 완료될 때까지 기다립니다. CD 트레이가 자동으로 배출됩니다. 다시 부팅하면 Oracle VM Server 표시됩니다. 다음 위치에서 루트 사용자로 로그인할 있습니다

  • 직접 콘솔 또는 KVM에서 로그인
  • 워크스테이션에서 ssh -l root 10.99.1.2 사용하여 SSH 통해 로그인. 참고: Oracle VM Server Xen dom0 도메인에 대해 512MB RAM 제공합니다. 시스템에 설치된 RAM 이보다 경우에도 마찬가지입니다. 이는 정상적인 동작이며 나머지 메모리는 게스트 VM 사용됩니다. 다음을 실행하여 실제 사용 가능한 메모리를 확인할 있습니다.

[root@quadovm ~]# xm info | grep mem
total_memory : 8182
free_memory : 7537
[root@quadovm ~]#

4. Oracle VM Manager 설치

Oracle VM Manager 설치는 비교적 간단합니다. Oracle VM Manager ISO CD 넣으면 설치 프로그램이 시작됩니다.

[root@xeno ~]# cd /mnt/cdrom
[root@xeno cdrom]# sh runInstaller.sh
[..]
Welcome to Oracle VM Manager

Please enter the choice: [1|2]

  1. Install Oracle VM Manager
  2. Uninstall Oracle VM Manager

"1" 선택하면 설치가 계속 진행됩니다. 워크스테이션에 Oracle VM Manager만을 위한 2GB 여유 공간이 있어야 합니다. 설치는 비교적 간단합니다.

 

Starting Oracle VM Manager installation ...

 

 

Checking the supported platforms ... Done

 

 

Checking the prerequisite packages are installed ... Done

 

 

Checking the available disk space ... Done

 

 

Installing the oracle-xe-univ package (rpm) ... Done

 

 

Oracle Database 10g Express Edition Configuration ------------------------------------------------- This will configure on-boot properties of Oracle Database 10g Express Edition. The following questions will determine whether the database should be starting upon system boot, the ports it will use, and the passwords that will be used for database accounts. Press <Enter> to accept the defaults. Ctrl-C will abort.

 

 

 

 

 

Specify the HTTP port that will be used for Oracle Application Express [8080]: We chose the default tomcat 8080 port, but you can always pick any other port in this case. Specify a port that will be used for the database listener [1521]: <ENTER>

 

 

Specify a password to be used for database accounts. Note that the same password will be used for SYS and SYSTEM. Oracle recommends the use of different passwords for each database account. This can be done after initial configuration: Confirm the password: Here we pick an unbreakable password. Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]: <ENTER>

 

 

Starting Oracle Net Listener...Done Configuring Database...Done Starting Oracle Database 10g Express Edition Instance...Done Installation Completed Successfully. To access the Database Home Page go to http://127.0.0.1:8080/apex

 

 

 

 

 

Installing the ovs-manager package (rpm) ... Done

 

 

Set default schema to 'OVS'. Please enter the password for OVS: <ENTER PASSWORD HERE> Please re-enter the password for OVS: <ENTER PASSWORD HERE> Again, we pick a secret password for the VM Manager schema. Creating the Oracle VM Manager database schema ...Done

 

 

Installing the oc4j package (rpm) ... Done The default password for oc4jadmin is oracle. You can change the default password after the installation completes. To access the OC4J Home Page and change the password go to http://127.0.0.1:8888/em Starting OC4J ... Done OC4J logfiles can be found in /var/log/ovm-manager/oc4j.log.

 

 

Deploying Oracle VM Manager application to OC4J container. Please enter the password for oc4jadmin: oracle Please enter the Oracle Net Listener Port , default is [1521] ? <ENTER> Creating connection pool ...

 

 

Deploying Oracle VM Manager application to OC4J container. Please enter the password for oc4jadmin: Please enter the Oracle Net Listener Port , default is [1521] ? <ENTER> Creating connection pool ... Done Creating data source ... Done Deploying application ... Done Deploying application help ... Done Configuring Oracle VM Manager DataCollector ... Done

 

 

Configuring SMTP server ... Please enter the outgoing mail server (SMTP) hostname: localhost Setting the SMTP hostname server to localhost ... Done

 

 

Configuring e-mail address for Oracle VM Manager account 'admin'... Please enter an e-mail address for the admin account : localuser


 

"localuser" 메일 전송을 위한 본인의 로컬 사용자 이름으로 대체합니다. 지침에 따라 http://127.0.0.1:8888/OVS 이동하여 Oracle VM Manager 액세스합니다. 다시 부팅한 /etc/init.d/oracle-xe 스크립트와 /etc/init.d/oc4j 스크립트를 사용하여 Oracle VM Manager 시작하고 중지할 있습니다.

5. VM(Virtual Machine) 설정

먼저 Oracle VM Server(quadvm) Oracle VM Manager 새로운 "스풀" 마스터로 등록해야 합니다. 스풀은 하나 이상의 물리적인 서버를 포함하는 논리적인 독립 영역입니다.

Servers Pools 탭으로 이동한 Create Server Pool에서 quadvm Oracle VM Server 서버 마스터, VM 서버, 유틸리티 마스터가 되도록 정보를 입력하고 스풀에 대해 spool1 같은 알기 쉬운 이름을 지정합니다.


그림 3

다음 화면에서 "admin" 사용자를 선택합니다.


그림 4

모든 항목을 확인하여 새로운 스풀을 만듭니다.


그림 5


그림 6

VM(Virtual Machine) 만들기

앞에서도 말했듯이 가상화를 사용하면 템플릿 이미지를 복사하여 시스템을 복제할 있습니다. 다음은 이를 수행하는 방법입니다.

템플릿 업로드하기

먼저 VM 템플릿과 OpenFiler VM Server 보내야 합니다.

[vnull@xeno OracleVM]$ scp -r OVM_EL5U1_X86_64_PVM_4GB root@10.99.1.2:/root/ root@10.99.1.2's password: vm.cfg 100% 318 0.3KB/s 00:00 system.img 100% 6144MB 8.8MB/s 11:41 README 100% 158 0.2KB/s 00:00 [vnull@xeno OracleVM]$ cd ~/ISO [vnull@xeno ISO]$ scp openfiler-2.2-x86_64.img.gz root@10.99.1.2:/root root@10.99.1.2's password: openfiler-2.2-x86_64.img.gz 100% 175MB 10.9MB/s 00:16 [vnull@xeno ISO]$

그런 다음 나중에 VM Server 서브에이전트에서 자동으로 검색할 있도록 VM 템플릿을 해당 디렉토리로 옮겨야 합니다.

[root@quadovm ~]# ls -al OVM_EL5U1_X86_64_PVM_4GB/ total 6297632 drwxr-xr-x 2 root root 4096 May 6 14:04 . drwxr-x--- 4 root root 4096 May 6 13:52 .. -rw-r--r-- 1 root root 158 May 6 14:04 README -rwxr-xr-x 1 root root 6442450945 May 6 14:04 system.img -rw-r--r-- 1 root root 318 May 6 13:52 vm.cfg [root@quadovm ~]# mv OVM_EL5U1_X86_64_PVM_4GB /OVS/seed_pool/ [root@quadovm ~]#

Resources 가서 Import 누릅니다. Internal Virtual Machine Template 선택합니다.


그림 7

템플릿 정보를 입력합니다. 템플릿 이름 OVM_EL5U1_X86_64_PVM_4GB 자동으로 검색되어야 하며 자동으로 검색되지 않을 경우 로그아웃한 다시 로그온하십시오.


그림 8

가져오기 작업을 확인합니다.


그림 9

템플릿이 표시되어야 하며 템플릿을 선택하고 Approve 버튼을 클릭합니다.


그림 10

OEL 템플릿을 기반으로 RAC VM 만들기

로그아웃하고 다시 로그인하여 Virtual Machines -> Create Virtual Machine으로 이동한 Create Virtual Machine based on Virtual Machine template 선택합니다.


그림 11

"spool1" 서버 풀을 선택합니다.


그림 12

Source탭에서 방금 추가한 템플릿을 선택합니다. 1개가 있어야 합니다.


그림 13

Virtual Machine Info 탭에서 원하는 VM 이름(: rac1), 암호 하나의 인터페이스를 입력합니다.


그림 14

요약 화면에서 모든 항목을 다시 확인한 Confirm 클릭합니다.


그림 15

기본 VM 화면에 새로 추가한 rac1 VM Creating 상태로 표시되어야 합니다. Oracle VM에서 템플릿을 시스템으로 복사하고 있습니다.


그림 16

"rac2" 노드에 대해 단계를 반복합니다. 단계에서 Oracle RAC 설치에 사용할 있는 대의 Linux 시스템이 있어야 합니다. 시스템을 Oracle 소프트웨어 설치를 위해 메모리와 공간을 늘리도록 다시 구성합니다.

Virtual Machines으로 가서 "rac1" 또는 "rac2" 클릭합니다. General Information에서 Edit 갑니다. RAM 크기를 1,024MB에서 2,048MB 변경합니다.


그림 17

Virtual Disk 탭으로 가서 Create New Virtual Disk 클릭합니다. 여기서 번째 시스템에 대해 추가 디스크에서 필요한 공간을 지정합니다. 다음 값을 사용합니다.

가상 디스크 이름: oracle_software

가상 디스크 크기(MB): 8,192

작성을 마치면 Virtual Disks 화면에 8GB 디스크가 생성되었다는 메시지가 나타납니다.


그림 18

OpenFiler VM 만들기

이제 iSCSI 스토리지 장치(OpenFiler) 만들어 보겠습니다. 단계는 Oracle VM Manager 없이 수동으로 수행해야 하므로 OpenFilers VM Manager 콘솔에서 관리하지 않습니다

[root@quadovm ~]# cd /OVS/running_pool/ [root@quadovm running_pool]# ls 132_rac1 134_rac2 [root@quadovm running_pool]# mkdir 60_iscsi1 62_iscsi2 [root@quadovm running_pool]# gzip -d /root/openfiler-2.2-x86_64.img.gz [root@quadovm running_pool]# cp /root/openfiler-2.2-x86_64.img 60_iscsi1/ [root@quadovm running_pool]# cp /root/openfiler-2.2-x86_64.img 62_iscsi2/

앞에서도 보았듯이 OpenFiler Xen 장치는 하나의 이미지 파일로 다운로드할 있지만 Xen에서 VM 부팅하려면 커널과 initrd 이미지가 필요하며 이들은 이미 파일 내에 있습니다. 문제를 해결하려면 제공된 이미지에서 initrd 커널 이미지를 추출하여 dom0에서 처음 512바이트(MBR - Master Boot Record) 건너뛰어야 합니다. 그런 다음 내부 파일 시스템을 루프백 마운트하고 필요한 부분을 복사합니다.

[root@quadovm running_pool]# losetup -o 512 /dev/loop4 /root/openfiler-2.2-x86_64.img [root@quadovm running_pool]# mount -o ro /dev/loop4 /mnt [root@quadovm running_pool]# cp /mnt/boot/initrd* /mnt/boot/vmlinuz* 60_iscsi1/ [root@quadovm running_pool]# cp /mnt/boot/initrd* /mnt/boot/vmlinuz* 62_iscsi2/ [root@quadovm running_pool]# umount /mnt [root@quadovm running_pool]# losetup -d /dev/loop4

시스템, 커널, initrd 이미지를 준비했으면 이제 iSCSI LUN 저장할 전용 디스크가 필요합니다. 패딩이 0 파일을 작성하면 되며 OpenFiler VM에서 파일을 실제 디스크로 사용하게 됩니다.

[root@quadovm running_pool]# dd if=/dev/zero of=60_iscsi1/volume1.img bs=1M count=12000 12000+0 records in 12000+0 records out 12582912000 bytes (13 GB) copied, 83.3836 seconds, 151 MB/s [root@quadovm running_pool]# [root@quadovm running_pool]# dd if=/dev/zero of=62_iscsi2/volume1.img bs=1M count=12000 12000+0 records in 12000+0 records out 12582912000 bytes (13 GB) copied, 88.5499 seconds, 142 MB/s [root@quadovm running_pool]#

이제 Xen 구성 파일을 만드는 단계만 남았습니다. 단계는 번째 SSH 세션에 대해 60_iscsi1 62_iscsi2 변경하여 수행해야 합니다.

[root@quadovm running_pool]# cd 60_iscsi1 [root@quadovm 60_iscsi1]# cat > vm.cfg name = "iscsi1" kernel = "/OVS/running_pool/60_iscsi1/vmlinuz-2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU" ramdisk = "/OVS/running_pool/60_iscsi1/initrd-2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU.img" disk = [ 'tap:aio:/OVS/running_pool/60_iscsi1/openfiler-2.2-x86_64.img,xvda,w', 'tap:aio:/OVS/running_pool/60_iscsi1/volume1.img,xvdb,w' ] root = "/dev/xvda1 ro" vif = ['bridge=xenbr0','bridge=sanbr0'] memory = 768 <CTRL+D> [root@quadovm 60_iscsi1]# xm create -c vm.cfg Using config file "./vm.cfg". Started domain iscsi1 Bootdata ok (command line is root=/dev/xvda1 ro ) Linux version 2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU (conary.rpath.com@rpl:1-xen) (gcc version 3.4.4) #1 SMP Wed Dec 6 02:05:30 EST 2006 [..] Registering block device major 202 xvda: xvda1 xvdb: unknown partition table [..] Welcome to Openfiler NAS/SAN Appliance 2.2 Press 'I' to enter interactive startup. [..many errors please ignore them..]

위에서 다음과 같은 사실을 확인할 있습니다.

  1. OpenFiler에서 해당 시스템 디스크를 xvdaand 표시하고 디스크(아직 파티션으로 초기화하지 않음) xvdb 표시합니다.
  2. 번째 이더넷 인터페이스가 xenbr0 브릿지에 연결되고 번째 이더넷 인터페이스가 sanbr0 연결되도록 구성했습니다.
  3. OpenFiler 최대 768MB RAM 할당했습니다.

VM(Virtual Machine) 구성하기

제공된 Xen 이미지는 미리 구성되어 있지 않으므로 직접 구성해야 합니다. iscsi1 루트로 로그인한 다음 새로운 OpenFiler iscsi1 VM 템플릿에 맞게 네트워킹을 다시 구성합니다. 먼저 /etc/hosts, /etc/resolv.conf sysconfig 이더넷 구성 파일을 설정합니다. 마지막으로 모든 네트워킹을 다시 시작하여 VM 재시작 없이 새로운 설정을 적용합니다.

Openfiler NAS/SAN Appliance Powered by rPath Linux To administer this appliance, please use a web browser from another system to navigate to

 

 

For further information and commercial support, please visit http://www.openfiler.com

localhost login: root [root@localhost ~]# cd /etc [root@localhost etc]# echo -e "10.99.1.101\tiscsi1">> hosts [root@localhost sysconfig]# cd sysconfig [root@localhost sysconfig]# cat > network NETWORKING=yes GATEWAY=10.99.1.1 HOSTNAME=iscsi1 <CTRL+D> [root@localhost sysconfig]# cat >network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet USERCTL=no IPV6INIT=no NETMASK=255.255.255.0 IPADDR=10.99.1.101 <CTRL+D> [root@localhost sysconfig]# cat >network-scripts/ifcfg-eth1 DEVICE=eth1 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet USERCTL=no IPV6INIT=no NETMASK=255.255.255.0 IPADDR=10.98.1.101 MTU=9000 <CTRL+D> [root@localhost sysconfig]# echo "nameserver10.99.1.1" > /etc/resolv.conf [root@localhost sysconfig]# service network restart Shutting down interface eth0: [ OK ] Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface : [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface eth1: [ OK ] [root@localhost sysconfig]#

인터페이스의 IP 주소를 확인합니다.

[root@localhost sysconfig]# ip a ls 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:14:53:73 brd ff:ff:ff:ff:ff:ff inet 10.99.1.101/24 brd 10.99.1.255 scope global eth0 inet6 fe80::216:3eff:fe14:5373/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:68:4f:c7 brd ff:ff:ff:ff:ff:ff inet 10.98.1.101/24 brd 10.98.1.255 scope global eth1 inet6 fe80::216:3eff:fe68:4fc7/64 scope link valid_lft forever preferred_lft forever 4: sit0: <NOARP> mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.0 [root@localhost sysconfig]# [root@localhost sysconfig]# ip ro ls | grep ^default default via 10.99.1.1 dev eth0 [root@localhost sysconfig]# [root@localhost sysconfig]# ping -c 1 iscsi1 PING iscsi1 (10.99.1.101) 56(84) bytes of data. 64 bytes from iscsi1 (10.99.1.101): icmp_seq=0 ttl=64 time=0.019 ms

--- iscsi1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.019/0.019/0.019/0.000 ms, pipe 2 [root@localhost sysconfig]#

혼동을 피하기 위해 iscsi1 다시 로그인하여 새로운 호스트 이름이 표시되도록 명령 프롬프트를 변경합니다.

OpenFiler 암호가 설정되지 않은 상태로 제공되므로 이제 루트에 대한 암호를 변경합니다.

[root@iscsi1 ~]# passwd Changing password for user root. New UNIX password: BAD PASSWORD: it's WAY too short Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@iscsi1 ~]#

iscsi2 OpenFiler 템플릿에서 다른 SSH 세션 로그인을 루트로 사용하여, iscsi1 대해 수행했던 것과 동일한 절차를 수행합니다.

[root@quadovm ~]# cd /OVS/running_pool/62_iscsi2/ [root@quadovm 62_iscsi2]# cat > vm.cfg name = "iscsi2" kernel = "/OVS/running_pool/62_iscsi2/vmlinuz-2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU" ramdisk = "/OVS/running_pool/62_iscsi2/initrd-2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU.img" disk = [ 'tap:aio:/OVS/running_pool/62_iscsi2/openfiler-2.2-x86_64.img,xvda,w', 'tap:aio:/OVS/running_pool/62_iscsi2/volume1.img,xvdb,w' ] root = "/dev/xvda1 ro" vif = ['bridge=xenbr0','bridge=sanbr0'] <CTRL+D> [root@quadovm 62_iscsi2]# [root@quadovm 62_iscsi2]# xm create -c vm.cfg Using config file "./vm.cfg". Started domain iscsi2 Bootdata ok (command line is root=/dev/xvda1 ro ) Linux version 2.6.16.29-0.11.smp.gcc3.4.x86_64.xen.domU (conary.rpath.com@rpl:1-xen) (gcc version 3.4.4) #1 SMP Wed Dec 6 02:05:30 EST 2006 [..] INIT: version 2.85 booting Welcome to Openfiler NAS/SAN Appliance 2.2 Press 'I' to enter interactive startup. [..]

localhost login: root [root@localhost ~]# cd /etc [root@localhost etc]# echo -e "10.99.1.102\tiscsi2" >> hosts [root@localhost etc]# cd sysconfig/ [root@localhost sysconfig]# cat > network NETWORKING=yes GATEWAY=10.99.1.1 HOSTNAME=iscsi2 <CTRL+D> [root@localhost sysconfig]# cat > network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet USERCTL=no IPV6INIT=no NETMASK=255.255.255.0 IPADDR=10.99.1.102 <CTRL+D> [root@localhost sysconfig]# cat > network-scripts/ifcfg-eth1 DEVICE=eth1 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet USERCTL=no IPV6INIT=no NETMASK=255.255.255.0 IPADDR=10.98.1.102 MTU=9000 <CTRL+D> [root@localhost sysconfig]# echo "nameserver 10.99.1.1" > /etc/resolv.conf [root@localhost sysconfig]# service network restart Shutting down interface eth0: [ OK ] Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface eth1: [ OK ] [root@localhost sysconfig]#

IP 네트워킹을 확인합니다.

[root@localhost sysconfig]# ip a ls 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:3c:bd:4a brd ff:ff:ff:ff:ff:ff inet 10.99.1.102/24 brd 10.99.1.255 scope global eth0 inet6 fe80::216:3eff:fe3c:bd4a/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:15:b7:51 brd ff:ff:ff:ff:ff:ff inet 10.98.1.102/24 brd 10.98.1.255 scope global eth1 inet6 fe80::216:3eff:fe15:b751/64 scope link valid_lft forever preferred_lft forever 4: sit0: <NOARP> mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.0 [root@localhost sysconfig]# ip ro ls | grep ^def default via 10.99.1.1 dev eth0 [root@localhost sysconfig]# passwd Changing password for user root. New UNIX password: BAD PASSWORD: it's WAY too short Retype new UNIX password: passwd: all authentication tokens updated successfully.

이후에 혼동되지 않도록 다시 로그인합니다. 이제 네트워크 브라우저에서 다음으로 이동할 있습니다.

  • http://10.99.1.101:446/ (iscsi1)
  • http://10.99.1.102:446/ (iscsi2)

참고: iSCSI 스토리지 장치에 대해 단계를 번씩 수행합니다.

먼저 라이센스에 동의하는지를 묻는 메시지가 표시되고 동의하면 다음 자격 증명을 사용하여 로그인할 있습니다

  • 로그인: openfiler
  • 암호: password

: OpenFiler 루트 암호는 인터페이스 암호와 동일하지 않지만 관리를 용이하게 하기 위해 동일하게 유지할 있습니다.


그림 19

Volumes 탭으로 Physical Storage Mgmt.에서 /dev/xvdb (사용자가 만든 12GB 번째 이미지 데이터 파일) 클릭합니다.


그림 20

Volume Group Mgmt.에서 "물리적 볼륨"(LVM) 유형으로 하나의 x86 파티션을 만듭니다.


그림 21

Volume Group Mgmt. 다시 가서 /dev/xvdb1 물리적 볼륨(LVM 용어로 "PV") 포함하는 "racdata1" / "racdata2"이라는 볼륨 그룹을 만듭니다.


그림 22

볼륨을 만들고 나면 하나의 볼륨 그룹이 나타납니다. Create New Volumes 탭으로 갑니다..


그림 23

이제 개의 iSCSI LUN 만들어야 합니다.

  • ocr (320MB)
  • voting (320MB)
  • asmdata1 ( 예에서는 최대 11GB 여유 공간)


그림 24

이러한 LUN 만들고 나면 "racdata1" / "racdata2"라는 이름의 스토리지 할당 볼륨 그룹을 나타내는 그래프를 있습니다.


그림 25

Services -> Enable/disable iSCSI target 활성화합니다.


그림 26

General -> Local Networks으로 가서 Network Access Configuration 아래에 "san1" 만들어 10.98.1.0/24 네트워크(SAN 네트워크)로부터의 iSCSI 연결을 허용합니다.


그림 27

Volumes -> 기존 볼륨 목록에서 iSCSI LUN으로 전환한 모든 iSCSI LUN 편집합니다. "iSCSI host access" 섹션 아래에서, san1 네트워크에서 iSCSI LUN 액세스할 있도록 확인합니다. update 클릭하여 저장합니다.

이제 Oracle RAC에서 사용하기 위한 LUN 내보내는 개의 iSCSI 시스템이 만들어졌습니다.

확장 RAC 맞게 RAC VM 다시 구성하기

eth0 외의 물리적 이더넷 어댑터가 없을 경우 Oracle VM 물리적 인터페이스 없이 브릿지를 만들 없기 때문에 수동으로 어댑터를 에뮬레이션해야 합니다. 특히 iSCSI 트래픽을 위한 SAN 네트워크와 RAC Cache Fusion 위한 Interconnect 네트워크를 추가할 있습니다.

이더넷 브릿지를 추가로 생성하기 위해서는 /etc/rc.d/rc.local 간단히 다음을 추가하면 됩니다. Oracle VM 다시 시작하지 않으려면 이러한 명령을 수동으로 실행해야 합니다

[root@quadovm ~]# cat >> /etc/rc.d/rc.local brctl addbr sanbr0 brctl addbr ibr0 ip link set dev sanbr0 up ip link set dev ibr0 up <CTRL+D> [root@quadovm ~]#

이제 성능상의 이유로 SAN 브릿지와 Interconnect 브릿지의 MTU 항상 9000 되도록 해야 합니다. Xen에서 netfront netback 네트워크 가상화 드라이버를 동기화할 때까지 MUT 설정을 연기해야 하기 때문에 이러한 방법으로 시도할 있습니다.

 

[root@quadovm ~]# cat > fixbrmtu.sh #!/bin/sh

bridge=$1 if [ "$bridge" != "sanbr0" -a "$bridge" != "ibr0" ]; then logger -t fixbrmtu -p syslog.notice Skipping MTU fix for bridge=$bridge exit 0 fi

logger -t fixbrmtu -p syslog.notice Fixing MTU for bridge=$bridge

while : ; do cd /sys/class/net/$bridge/brif || exit 1 err=0 for iface in *; do ip link set dev $iface mtu 9000 > /dev/null 2>&1 if [ $? -ne 0 ]; then err=$[err+1] fi done if [ $err -eq 0 ]; then break fi sleep 1 done

ip link set dev $bridge mtu 9000 exit 0 <CTRL+D> [root@quadovm ~]# chmod 700 fixbrmtu.sh

다음에는 vi 통해 /etc/xen/scripts/vif-bridge 파일을 수정하고 "success" 바로 다음 굵은체 행을 추가합니다.

log debug "Successful vif-bridge $command for $vif, bridge $bridge." if [ "$command" = "online" ] then success (/root/fixbrmtu.sh "$bridge") & fi

Oracle VM 루트로 로그온한 상태에서 /OVS/running_pool/ 전환한 rac1 rac2 대해 vm.cfg 편집하고 vif 행을 다음과 같이 변경합니다.

vif = ['bridge=xenbr0', 'bridge=ibr0', 'bridge=sanbr0']

, 다음과 같은 방법으로 RAC VM 브릿지에 연결되도록 있습니다.

  • xenbr0 eth0 연결(Oracle VM 서버의 번째 물리적 이더넷을 통해 연계. brctl show 명령을 사용하여 이를 확인할 있음) - Oracle VM 클라이언트를 위한 공용 인터페이스
  • ibr0 eth1 연결 - Cache Fusion 위한 Interconnect 네트워크
  • sanbr0 eth2 연결 - iSCSI SAN 네트워크

참고: 추가 인터페이스는 Oracle VM Manager에서 표시되지 않습니다.

이제 rac1 rac2 대해 VM 시작합니다.

[root@quadovm 134_rac2]# xm create vm.cfg Using config file "./vm.cfg". Started domain 134_rac2 [root@quadovm 134_rac2]#

실행되는 가상 시스템을 확인합니다. 문제가 없으면 다음과 비슷한 화면이 나타납니다.

[root@quadovm ~]# xm list Name ID Mem VCPUs State Time(s) 132_rac1 7 2048 1 -b---- 12.8 134_rac2 8 2048 1 r----- 7.2 Domain-0 0 512 4 r----- 287.6 iscsi1 5 768 1 -b---- 4.8 iscsi2 6 768 1 -b---- 4.8 [root@quadovm ~]#

기본적으로 Oracle VM 템플릿은 다음 자격 증명에 적합하게 구성되어 있습니다.

  • 사용자: root
  • 암호: ovsroot

rac1 노드를 다시 구성하여 시작한 로컬 콘솔을 통해 노드에 연결합니다.

 

[root@quadovm ~]# xm console 132_rac1 rtc: IRQ 8 is not free. i8042.c: No controller found.

Enterprise Linux Enterprise Linux Server release 5.1 (Carthage) Kernel 2.6.18-53.1.13.9.1.el5xen on an x86_64

localhost.localdomain login: root Password: <type "ovsroot"> Last login: Wed Feb 20 14:21:42 from ca-ostest246.us.oracle.com [root@localhost ~]#

네트워크 구성 유틸리티를 실행합니다.

[root@localhost ~]# export TERM=linux [root@localhost ~]# system-config-network-tui

system-config-network-tuiis 사용하고 손쉽고도 간단하게 네트워킹을 구성할 있습니다. 공용 인터페이스(Oracle VM 외부에서 있는 IP 네트워크에 대한 관리 인터페이스) 구성 작업은 "eth0" 선택하고 IP 주소, 넷마스크, 게이트웨이 등을 설정하는 단계로 구성됩니다.


그림 28


그림 29

"eth0" 성공적으로 구성했으면 "eth1"(Interconnect) 구성할 있습니다. <New device> 선택하여 인터페이스를 만든 다음 Ethernet IP 네트워킹을 설정하면 됩니다. eth2(SAN) 대해 단계를 반복합니다.


그림 30


그림 31


그림 32

완료했으면 네트워크 구성(DNS 분석기, 호스트 이름 MTU 변경 설정) 마칩니다.

[root@localhost ~]# echo 'nameserver 10.99.1.1' > /etc/resolv.conf [root@localhost ~]# cat > /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=rac1 <CTRL+D> [root@localhost ~]# echo "MTU=9000" >> /etc/sysconfig/network-scripts/ifcfg-eth1 [root@localhost ~]# echo "MTU=9000" >> /etc/sysconfig/network-scripts/ifcfg-eth2 [root@localhost ~]# service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface eth1: [ OK ] Bringing up interface eth2: [ OK ] [root@localhost ~]#

/etc/hosts 파일을 다음과 같이 저장합니다.

127.0.0.1 localhost.localdomain localhost

# eth0: public network 10.99.1.91 rac1 10.99.1.92 rac2

# eth1: interconnect 10.97.1.1 rac1-priv 10.97.1.2 rac2-priv

# VIPs 10.99.1.201 rac1-vip 10.99.1.202 rac2-vip

# eth2: iSCSI SAN 10.98.1.101 iscsi1 10.98.1.102 iscsi2

# PUB for openfilers 10.99.1.101 iscsi1-pub 10.99.1.102 iscsi2-pub

시스템에 적합한 시간대를 설정합니다( 예의 경우 폴란드 시간대).

[root@localhost ~]# ln -sf /usr/share/zoneinfo/Europe/Warsaw /etc/localtime

rac1에서 로그아웃한 다시 로그인하면 셸에 "root@rac1"라고 나타납니다. 또한 게이트웨이와의 연결을 확인합니다. rac2 대해 적합한 IP 주소를 사용하여 동일한 작업을 수행해야 한다는 것을 잊지 마십시오.

기본적으로 Oracle VM 템플릿에는 iSCSI 이니시에이터 유틸리티의 사용자 공간 부분이 제공되지 않습니다. Oracle Enterprise Linux ISO 이미지(3~4GB)에서 부분을 얻을 있지만, 신속하게 진행하기 위해 대신 여기 에서 워크스테이션으로 다운로드할 있습니다.

그런 다음 워크스테이션에서 iSCSI 이니시에이터의 사본을 RAC 노드 모두에 업로드합니다.

[vnull@xeno RPMS_el51]$ scp iscsi-initiator-utils*.rpm root@10.99.1.91:. root@10.99.1.91's password: iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm 100% 528KB 528.2KB/s 00:00 [vnull@xeno RPMS_el51]$ scp iscsi-initiator-utils*.rpm root@10.99.1.92:. root@10.99.1.92's password: iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm 100% 528KB 528.2KB/s 00:00 [vnull@xeno RPMS_el51]$

이제 iSCSI 이니시에이터를 설치하고, 기본 구성으로 설정한 RAC 노드에서 활성화합니다. rac2 대한 InitiatorAlias 변경하는 것을 잊지 마십시오.

[root@rac1 ~]# rpm -Uhv iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm Preparing... ########################################### [100%] 1:iscsi-initiator-utils ########################################### [100%] [root@rac1 ~]# rm iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm rm: remove regular file `iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm'? y [root@rac1 ~]# [root@rac1 ~]# echo "InitiatorAlias=rac1" >> /etc/iscsi/initiatorname.iscsi [root@rac1 ~]# service iscsid start Turning off network shutdown. Starting iSCSI daemon: [ OK ] [ OK ] [root@rac1 ~]# chkconfig iscsid on [root@rac1 ~]# chkconfig iscsi on

RAC 노드에서 필요 없는 서비스를 비활성화합니다

[root@rac1 ~]# chkconfig --level 0123456 bluetooth off [root@rac1 ~]# chkconfig --level 0123456 cups off [root@rac1 ~]# chkconfig --level 0123456 ip6tables off [root@rac1 ~]# chkconfig --level 0123456 iptables off [root@rac1 ~]# chkconfig --level 0123456 o2cb off [root@rac1 ~]# chkconfig --level 0123456 o2cb off [root@rac1 ~]# chkconfig --level 0123456 ocfs2 off [root@rac1 ~]# chkconfig --level 0123456 sendmail off [root@rac1 ~]# reboot

RAC 노드에 대해 추가 로컬 하드 디스크에서 Oracle 소프트웨어 마운트 위치(/u01) 위한 파티션을 준비합니다.

[root@rac1 ~]# fdisk /dev/hdd Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.

 

The number of cylinders for this disk is set to 1044. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1044, default 1): <ENTER> Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): <ENTER> Using default value 1044

Command (m for help): p

Disk /dev/hdd: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/hdd1 1 1044 8385898+ 83 Linux

Command (m for help): w The partition table has been altered!

Calling ioctl() to re-read partition table. Syncing disks. [root@rac1 ~]# [root@rac1 ~]# mkfs.ext3 -j /dev/hdd1 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 1048576 inodes, 2096474 blocks 104823 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2147483648 64 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 29 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@rac1 ~]# [root@rac1 ~]# mkdir /u01 [root@rac1 ~]# echo -e '/dev/hdd1\t\t/u01\t\t\text3\tdefaults,noatime\t1 2' >> /etc/fstab [root@rac1 ~]# mount /u01

동적 장치 관리를 설정하여 iSCSI SAN 위한 적절한 이름 지정 방식을 만듭니다. 먼저 RAC 노드에서 실행하여 /etc/udev/rules.d/55-openiscsi.rulesfile 만듭니다.

[root@rac1 ~]# cat > /etc/udev/rules.d/55-openiscsi.rules # /etc/udev/rules.d/55-openiscsi.rules KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b", SYMLINK+="iscsi/%c{1}/lun%c{2}/part%n", OWNER="oracle", MODE="0640", GROUP="disk" <CTRL+D> [root@rac1 ~]#

udevd 현재의 실제 장치에 대한 파일만 포함하는 동적 장치 디렉토리를 제공합니다. 또한 /dev 디렉토리에서 장치 노드 파일을 만들거나 제거하고, 시스템에 장착된 새로운 장치에 대해 커널로부터 이벤트를 받아 작동합니다. 이벤트가 발생할 때마다 새로운 장치 속성에 대해 규칙 파일이 점검됩니다. 이를 기준으로 symlink 만들고, 소유권과 액세스 권한을 변경하며, 외부 프로그램을 실행할 있습니다.

규칙 파일은 새로운 모든 SCSI 장치에 대해 다음을 실행하여 작성된 iscsidev.sh 스크립트를 시작합니다.

[root@rac2 ~]# mkdir -p /etc/udev/scripts [root@rac2 ~]# cat > /etc/udev/scripts/iscsidev.sh #!/bin/sh #iscsidev.sh BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" target_name=`echo $(cat ${file}) | cut -d":" -f2`

if [ -z "${target_name}" ]; then exit 1 fi

echo "${target_name} ${LUN}" <CTRL+D> [root@rac2 ~]# chmod 755 /etc/udev/scripts/iscsidev.sh

스크립트는 전달된 SCSI 장치가 실제 iSCSI이며 이에 대한 정보를 udev 반환하는지를 결정합니다. iSCSI 이니시에이터를 구성하면 iSCSI 대상 검색을 수행하여 RAC 실행되는 스토리지 어레이에 연결할 있습니다.

[root@rac1 ~]# iscsiadm -m discovery -t sendtargets -p 10.98.1.101 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.asm1 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.ocr 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.voting [root@rac1 ~]# iscsiadm -m discovery -t sendtargets -p 10.98.1.102 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.asm1 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.ocr 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.voting [root@rac1 ~]# iscsiadm -m discovery -l 10.98.1.101:3260 via sendtargets 10.98.1.102:3260 via sendtargets [root@rac2 ~]# iscsiadm -m node | sort 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.asm1 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.ocr 10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.voting 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.asm1 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.ocr 10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.voting [root@rac1 ~]#

이제 RAC 노드에서 스토리지에 로그인합니다.

[root@rac1 ~]# iscsiadm -m node -L all Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata2.asm1, portal: 10.98.1.102,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata2.ocr, portal: 10.98.1.102,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting, portal: 10.98.1.101,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.ocr, portal: 10.98.1.101,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.asm1, portal: 10.98.1.101,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata2.voting, portal: 10.98.1.102,3260] [root@rac1 ~]#

이제 iSCSI LUN 분할해야 합니다. 검색된 모든 iSCSI 장치에서 LUN별로 파티션을 하나 만들 것입니다. ((경고! 스크립트는 모든 iSCSI LUN 파티션 테이블을 지우는 위험한 스크립트입니다!)

다음 스크립트를 저장하십시오.

#!/bin/sh [ -d /dev/iscsi ] || exit 100 for LUN in `find /dev/iscsi -type l`; do echo $LUN dd if=/dev/zero of=$LUN bs=512 count=1 echo -en "0,\n;\n;\n;\n" | sfdisk -q $LUN done

노드에서만 실행 권한을 부여하고 실행합니다.

[root@rac2 ~]# chmod 700 partit.sh [root@rac2 ~]# ./partit.sh [..lots of partitioning output..]

rac2에서 수행한 변경을 번째 노드에서 있습니다.

[root@rac1 ~]# partprobe

후에 fdisk -l 사용하여 파티션을 검사할 있습니다.

iSCSI 조정

성능을 최적화하기 위해 iSCSI 스토리지를 조정해야 합니다. iSCSI 프로토콜이 TCP 기반으로 하므로 작업은 주로 TCP/IP 스택 조정과 연관됩니다. OpenFilers(iscsi1 iscsi2)에서 /etc/init.d/iscsi-target 편집하고 MEM_SIZE 변수를 1073741824 설정합니다. 이렇게 하면 iscsi1 iscsi2에서 iSCSI 대상을 시작하기 전에 TCP 네트워크 버퍼를 올바르게 설정할 있습니다.

그런 다음 기존 /etc/ietd.conf to /etc/ietd.conf.old 백업하고 여기에 다음을 추가합니다.

MaxConnections 1 InitialR2T No ImmediateData Yes MaxRecvDataSegmentLength 16776192 MaxXmitDataSegmentLength 16776192 MaxBurstLength 16776192 FirstBurstLength 16776192 MaxOutstandingR2T 16 Wthreads 16 DataDigest None HeaderDigest None

변경을 마친 iscsi1 iscsi2 다시 부팅합니다.
참고: 파일은 iSCSI LUN 새로 추가되거나, 다시 구성되거나, 삭제될 때마다 다시 생성됩니다.
이제 iSCSI 성능을 최적화하기 위해 RAC 노드를 다시 구성해야 합니다. rac1 rac2 노드에서 /etc/sysctl.conf 편집하고 다음 매개 변수를 적절히 변경합니다.

net.core.rmem_max = 1073741824 net.core.wmem_max = 1073741824 net.ipv4.tcp_rmem = 1048576 16777216 1073741824 net.ipv4.tcp_wmem = 1048576 16770216 1073741824 net.ipv4.tcp_mem = 1048576 16770216 1073741824

RAC에서 /etc/iscsi/iscsid.conf(iSCSI 이니시에이터 구성) 변경하고 마지막으로 다시 부팅하여 변경을 적용합니다. iSCSI 클라이언트 재시작과 함께 sysctl -p 수행할 있습니다.

[root@rac2 ~]# cat > /etc/iscsi/iscsid.conf node.startup = automatic node.session.timeo.replacement_timeout = 120 node.conn[0].timeo.login_timeout = 15 node.conn[0].timeo.logout_timeout = 15 node.conn[0].timeo.noop_out_interval = 10 node.conn[0].timeo.noop_out_timeout = 15 node.session.initial_login_retry_max = 4 node.session.cmds_max = 128 node.session.queue_depth = 128 node.session.iscsi.InitialR2T = No node.session.iscsi.ImmediateData = Yes node.session.iscsi.FirstBurstLength = 16776192 node.session.iscsi.MaxBurstLength = 16776192 # the default is 131072 node.conn[0].iscsi.MaxRecvDataSegmentLength = 16776192 # the default is 32768 discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 16776192 node.conn[0].iscsi.HeaderDigest = None node.session.iscsi.FastAbort = No <CTRL+D> [root@rac2 ~]# reboot

참고: OpenFiler 대한 이번 변경과 앞의 변경을 통해 기본 순차 쓰기(sequential-write) iSCSI 성능이 극대화되었으며 이는 블록 크기를 1MB 지정한 dd 명령을 통해 iSCSI LUN에서 직접 테스트했습니다. 성능은 사용하는 하드웨어, 소프트웨어 버전 기타 요소에 따라 시스템마다 다를 있습니다.

6. Oracle 소프트웨어 설치 준비하기

Oracle Database Oracle Clusterware rac1 VM에서 압축을 풉니다.

[root@rac1 ~]# cd /u01/install/ [root@rac1 install]# unzip linux.x64_11gR1_database.zip [root@rac1 install]# unzip linux.x64_11gR1_clusterware.zip

RAC 노드에서 oracle 계정의 암호를 변경하고 Database Clusterware 위한 디렉토리를 설정합니다

[root@rac1 ~]# passwd oracle Changing password for user oracle. New UNIX password: BAD PASSWORD: it is WAY too short Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@rac1 ~]# mkdir -p /u01/app/oracle [root@rac1 ~]# chown -R oracle:oinstall /u01/app [root@rac1 ~]# chmod -R 775 /u01/app [root@rac1 ~]# [root@rac1 ~]# mkdir -p /u01/app/crs [root@rac1 ~]# chown -R oracle:oinstall /u01/app/crs [root@rac1 ~]# chmod -R 775 /u01/app/crs

rac1 rac2에서 oracle 사용자 .bash_profile 스크립트를 다음과 같이 편집합니다. , RAC 노드에서 ORACLE_SID 개별적으로 설정해야 합니다.

# ~oracle .bash_profile

# Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi

alias ls="ls -FA"

# User specific environment and startup programs export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1 export ORA_CRS_HOME=/u01/app/crs export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin

# Each RAC node must have a unique ORACLE_SID. export ORACLE_SID=erac1

export PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin export ORACLE_TERM=xterm export TNS_ADMIN=$ORACLE_HOME/network/admin export ORA_NLS10=$ORACLE_HOME/nls/data export LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib export CLASSPATH=$ORACLE_HOME/JRE export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib export THREADS_FLAG=native export TEMP=/tmp export TMPDIR=/tmp

Oracle SSH 사용자 동격 설정

"사용자 동격" RSH/SSH 사용하여 로컬 사용자 계정이 암호 없이 클러스터의 다른 모든 노드에 액세스할 있도록 하는 방법입니다. 사용자 동격은 주로 Oracle 설치 프로그램에서 암호를 묻지 않고 나머지 노드에 설치를 수행하기 위해 사용됩니다. 명령줄은 예는 SSH 기반의 인증을 사용하여 간편하게 사용자 동격을 설정하는 방법을 설명합니다.

[root@rac1 ~]# su - oracle [oracle@rac1 ~]$ mkdir -p ~/.ssh [oracle@rac1 ~]$ chmod 700 ~/.ssh [oracle@rac1 ~]$ /usr/bin/ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/oracle/.ssh/id_rsa): <ENTER> Enter passphrase (empty for no passphrase): <ENTER> Enter same passphrase again: <ENTER> Your identification has been saved in /home/oracle/.ssh/id_rsa. Your public key has been saved in /home/oracle/.ssh/id_rsa.pub. The key fingerprint is: cb:a6:d0:4a:cc:39:9d:78:70:24:f7:5b:99:14:7e:53 oracle@rac1 [oracle@rac1 ~]$ [oracle@rac1 ~]$ ssh rac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys The authenticity of host 'rac1 (10.99.1.91)' can't be established. RSA key fingerprint is 1e:8c:1f:f7:dc:2e:10:75:0f:08:01:13:a8:49:31:0c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'rac1,10.99.1.91' (RSA) to the list of known hosts. oracle@rac1's password: [oracle@rac1 ~]$ ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys The authenticity of host 'rac2 (10.99.1.92)' can't be established. RSA key fingerprint is 1e:8c:1f:f7:dc:2e:10:75:0f:08:01:13:a8:49:31:0c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'rac2,10.99.1.92' (RSA) to the list of known hosts. oracle@rac2's password: [oracle@rac1 ~]$ scp .ssh/authorized_keys rac2:.ssh/ oracle@rac2's password: authorized_keys 100% 786 0.8KB/s 00:00 [oracle@rac1 ~]$ chmod 600 ~/.ssh/authorized_keys

그래픽 인터페이스의 설치 프로그램에 대한 X11 워크스테이션 주소와 함께 암호를 묻지 않도록 셸을 설정합니다.

[oracle@rac1 ~]$ exec /usr/bin/ssh-agent $SHELL [oracle@rac1 ~]$ /usr/bin/ssh-add Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa) [oracle@rac1 ~]$ [oracle@rac1 ~]$ export DISPLAY=10.99.1.1:0

동일한 세션에서 SSH 사용자 동격이 예상한 대로 작동하는지 확인해 봅니다.

[oracle@rac1 ~]$ ssh rac1 date Sat May 10 13:16:43 CEST 2008 [oracle@rac1 ~]$ ssh rac2 date Sat May 10 13:16:45 CEST 2008 [oracle@rac1 ~]$

워크스테이션에서 그래픽 인터페이스의 설치 구성 유틸리티에 대해 RAC 노드로부터의 원격 X11 연결을 허용하도록 X11 환경을 구성해야 합니다.

[vnull@xeno ~]$ xhost +10.99.1.91 10.99.1.91 being added to access control list [vnull@xeno ~]$ xhost +10.99.1.92 10.99.1.92 being added to access control list [vnull@xeno ~]$

사용자와 해당 노드 간의 모든 방화벽을 통해 rac1 rac2 시스템에서 트래픽을 전달할 있어야 합니다(일반적으로 TCP 포트 6000).

ASMLib 구성

ASMLIB I/O 작업 스토리지 관리를 위한 효율적인 메커니즘으로서 선택 사항입니다. Linux에서 ASMLIB 주로, 표준 UNIX I/O 호출을 생략하고 해당 작업을 수행하는 전용 커널 부분을 제공함으로써 컨텍스트 전환과 이에 따른 CPU 사용량을 최소화하도록 도와 줍니다. 그러나 시나리오에서의 역할은 장치 관리를 용이하게 하는 것입니다.

노드에서 ASMLib 구성을 수행합니다.

[root@rac1 ~]# /etc/init.d/oracleasm configure Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library driver. The following questions will determine whether the driver is loaded on boot and what permissions it will have. The current values will be shown in brackets ('[]'). Hitting <ENTER> without typing an answer will keep that current value. Ctrl-C will abort.

Default user to own the driver interface []: oracle Default group to own the driver interface []: oinstall Start Oracle ASM library driver on boot (y/n) [n]: y Scan for Oracle ASM disks on boot (y/n) [y]: y Writing Oracle ASM library driver configuration: done Initializing the Oracle ASMLib driver: [ OK ] Scanning the system for Oracle ASMLib disks: [ OK ] [root@rac1 ~]#

ASMLIB 관리에 개의 iSCSI LUN 추가합니다. rac1에서만 수행하십시오

[root@rac1 ~]# /etc/init.d/oracleasm createdisk VOL1ASM1 /dev/iscsi/racdata1.asm1/lun0/part1 Marking disk "VOL1ASM1" as an ASM disk: [ OK ] [root@rac1 ~]# /etc/init.d/oracleasm createdisk VOL2ASM1 /dev/iscsi/racdata2.asm1/lun0/part1 Marking disk "VOL2ASM1" as an ASM disk: [ OK ] [root@rac1 ~]# [root@rac1 ~]# /etc/init.d/oracleasm listdisks VOL1ASM1 VOL2ASM1 [root@rac1 ~]#

rac2에서 새로운 ASM 디스크를 다시 검사합니다.

[root@rac2 ~]# /etc/init.d/oracleasm scandisks Scanning the system for Oracle ASMLib disks: [ OK ] [root@rac2 ~]# /etc/init.d/oracleasm listdisks VOL1ASM1 VOL2ASM1 [root@rac2 ~]#

7. Oracle Clusterware 설치

Oracle Clusterware 데이터베이스와 RAC 관련 헬퍼 애플리케이션을 포함하는 핵심 구성 요소입니다. 이를 통해 DBA 하나 또는 여러 개의 Oracle 인스턴스를 클러스터에 등록하고 호출할 있습니다. 일상적인 작업을 수행하는 동안 Oracle Clusterware 클러스터에 구성된 모든 노드에 특별한 ping 작업을 통해 "하트비트"라는 메시지를 보냅니다. 어떤 노드에 대해 하트비트가 실패하면 공유 디스크에 있는 Oracle Clusterware 구성 파일을 검사하여 실제 노드 실패인지 네트워크 실패인지를 식별합니다.

Oracle Clusterware 설치하면 Oracle Database 소프트웨어(다음 단원 참조) 설치하는 사용되는 Oracle Universal Installer(OUI) 자동으로 이러한 노드를 인식합니다. 단원에서 수행할 Oracle Clusterware 설치와 마찬가지로 Oracle Database 소프트웨어 또한 노드에서만 실행해야 합니다. OUI RAC 클러스터에 구성된 모든 노드에 소프트웨어 패키지를 복사합니다.

번째 노드를 NFS 서버로

보팅 디스크를 위한 번째 위치를 데이터 센터와 지리적으로 독립시킬 것이므로 RAC 노드에서 번째 위치에 연결하는 어떤 스토리지 프로토콜을 어떻게 사용할지를 고려해야 합니다. 번째 iSCSI 어레이/서버를 사용할 있지만, 실제로 보팅 디스크용으로 스토리지의 MB 사용하기 위해 iSCSI 스토리지를 구입하는 것은 비용 낭비입니다. 다행히도 Oracle Clusterware 원격 UNIX/Linux 서버에 설치할 있는 NFS 스토리지에 보팅 디스크를 설정할 있는 옵션을 제공합니다

여기서는 자신의 관리 워크스테이션을 보팅 디스크 파일을 포함하는 3 NFS 위치로 사용합니다. 파일은 하나의 디스크로 사용됩니다
해당 워크스테이션에 CRS 보팅 의사(pseudo) 디스크 파일을 포함하는 NFS 내보내기를 만드십시오.

[root@xeno ~]# mkdir /votedisk [root@xeno ~]# echo '/votedisk *(rw,sync,all_squash,anonuid=500,anongid=500)' >> /etc/exports [root@xeno ~]# service portmap start Starting portmap: [ OK ] [root@xeno ~]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] [root@xeno ~]# chkconfig --level 0123456 nfs on [root@xeno ~]# chkconfig --level 0123456 portmap on [root@xeno ~]# dd if=/dev/zero of=/votedisk/third_votedisk.crs bs=1M count=320 320+0 records in 320+0 records out 335544320 bytes (336 MB) copied, 1.32737 seconds, 253 MB/s [root@xeno ~]#

RAC 노드에서 다음을 수행합니다. bash 명령에 fstab 행을 입력합니다

[root@rac1 ~]# echo -e '10.99.1.1:/votedisk\t/votedisk\tnfs\t rw,bg,hard,intr,rsize=32768,wsize=32768,tcp,noac,vers=3,timeo=600\t0\t0' >> /etc/fstab [root@rac1 ~]# service portmap start Starting portmap: [ OK ] [root@rac1 ~]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] [root@rac1 ~]# chkconfig --level 0123456 nfs on [root@rac1 ~]# mkdir /votedisk [root@rac1 ~]# mount /votedisk [root@rac1 ~]# ls -al /votedisk total 328024 drwxr-xr-x 2 oracle dba 4096 May 27 19:36 . drwxr-xr-x 26 root root 4096 May 27 20:40 .. -rw-r--r-- 1 oracle dba 335544320 May 27 19:36 third_votedisk.crs [root@rac1 ~]#

기본 설치

우선 시스템의 비호환성을 검토해야 합니다. 전체 시스템에서 누락된 라이브러리, 커널 매개 변수 등이 있는지 확인할 있도록 Oracle에서는 runcluvfy.sh라는 특별한 도구를 Clusterware 함께 제공합니다. 자세한 내용은 Jeff Hunter "Build Your Own Oracle RAC Cluster on Oracle Enterprise Linux and iSCSI"에서 20 단원을 참조하십시오. 이제 다음과 같이 설치해야 합니다.

[root@rac1 clusterware]# cd /u01/install/clusterware/rpm/ [root@rac1 rpm]# rpm -Uhv cvuqdisk-1.0.1-1.rpm Preparing... ########################################### [100%] 1:cvuqdisk ########################################### [100%] [root@rac1 rpm]#

그런 다음 rac2 노드로 이를 전송해야 합니다.

[root@rac1 rpm]# scp cvuqdisk-1.0.1-1.rpm root@10.99.1.92:. The authenticity of host '10.99.1.92 (10.99.1.92)' can't be established. RSA key fingerprint is 1e:8c:1f:f7:dc:2e:10:75:0f:08:01:13:a8:49:31:0c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.99.1.92' (RSA) to the list of known hosts. root@10.99.1.92's password: cvuqdisk-1.0.1-1.rpm 100% 7273 7.1KB/s 00:00 [root@rac1 rpm]#

... and install it on rac2 too:

[root@rac2 ~]# rpm -Uhv cvuqdisk-1.0.1-1.rpm Preparing... ########################################### [100%] 1:cvuqdisk ########################################### [100%] [root@rac2 ~]#

다음을 사용하여 Clusterware 위한 사전 요구 사항 보고서를 작성할 있습니다.

[oracle@rac1 clusterware]$ ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose

보고서를 검토합니다

Check: Membership of user "oracle" in group "oinstall" [as Primary] Node Name User Exists Group Exists User in Group Primary Comment ---------------- ------------ ------------ ------------ ------------ ------------ rac2 yes yes yes no failed rac1 yes yes yes no failed Result: Membership check for user "oracle" in group "oinstall" [as Primary] failed.

Administrative privileges check failed.

[..]

Check: Package existence for "glibc-2.5-12" Node Name Status Comment ------------------------------ ------------------------------ ---------------- rac2 failed rac1 failed Result: Package existence check failed for "glibc-2.5-12".

Check: Package existence for "glibc-2.5-12" Node Name Status Comment ------------------------------ ------------------------------ ---------------- rac2 glibc-2.5-18 passed rac1 glibc-2.5-18 passed Result: Package existence check passed for "glibc-2.5-12".

oinstall 그룹의 누락된 oracle "glibc-2.5-12" 대한 번째 오류는 무시해도 됩니다. runclvfy.sh에서 생성하는 모든 알림과 오류를 해결하도록 하십시오. 이러한 오류가 나중에 심각한 문제로 이어질 있습니다.

다음의 CVU 실행 검사는 하드웨어 운영 체제 설정을 확인합니다

[oracle@rac1 clusterware]$ ./runcluvfy.sh stage -post hwos -n rac1,rac2 -verbose

"No errors"라는 메시지가 나타나야 합니다.

이제 Clusterware 설치 프로그램을 실행합니다.

[oracle@rac1 clusterware]$ export DISPLAY=10.99.1.1:0

[oracle@rac1 clusterware]$ ./runInstaller


그림 33

Clusterware 설치 프로그램이 실행됩니다.


그림 34

대상 디렉토리로 /u01/app/oraInventory 설정했는지 확인합니다.


그림 35

Clusterware 홈을 /u01/app/crs 설정합니다. CRS 설치와 Database 소프트웨어어 설치를 독립적으로 수행할 것입니다


그림 36

Clusterware 시스템에 문제나 비호환 요소가 있는지 확인합니다. 모두 문제가 없어야 합니다.


그림 37

Edit 버튼을 클릭한 다음과 같이 네트워크 어댑터를 지정합니다.

  • eth0 공용으로 지정합니다.
  • eth1 전용(RAC Cache Fusion/Interconnect)으로 지정합니다
  • eth2 CRS에서 사용할 없어야 합니다. iSCSI 위한 SAN 인터페이스입니다


그림 38

OCR 미러하도록 지정합니다. 개의 iSCSI 스토리지 장치 간에 OCR 미러할 있습니다. 기본 OCR 위치로 /dev/iscsi/racdata1.ocr/lun0/part1 입력합니다. 백업 OCR 위치로 /dev/iscsi/racdata2.ocr/lun0/part1 입력합니다


그림 39

보팅 디스크에 대해 "Normal redundancy" 선택합니다. 쿼럼 요구 사항을 만족하기 위해 개의 보팅 디스크가 필요합니다.

  • /dev/iscsi/racdata1.voting/lun0/part1
  • /dev/iscsi/racdata2.voting/lun0/part1
  • /votedisk/voting_disk_file.crs ("xeno" 워크스테이션에서 NFS 마운트 위치의 파일)

참고: 여기서 보팅 디스크를 하나만 설정했을 경우 설명서의 뒷부분에서 나머지 디스크를 수동으로 추가하는 방법을 보여 드리겠습니다.


그림 40

보팅 디스크를 구성하고 나면 요약 창이 나타납니다. 설정을 검토하고 Install 누릅니다.


그림 41

설치하는 어느 정도의 시간이 걸립니다.


그림 42

설치가 성공적으로 완료되면 설치 마무리 스크립트를 실행하라는 메시지가 표시됩니다

Clusterware 설치 확인

가지 유틸리티를 사용하여 Clusterware 성공적으로 설치되었는지 확인할 있습니다. 여기서는 crs_stat crsctl 사용하여 설치를 확인합니다:

[oracle@rac1 clusterware]$ $ORA_CRS_HOME/bin/crs_stat -t -v Name Type R/RA F/FT Target State Host ---------------------------------------------------------------------- ora.rac1.gsd application 0/5 0/0 ONLINE ONLINE rac1 ora.rac1.ons application 0/3 0/0 ONLINE ONLINE rac1 ora.rac1.vip application 0/0 0/0 ONLINE ONLINE rac1 ora.rac2.gsd application 0/5 0/0 ONLINE ONLINE rac2 ora.rac2.ons application 0/3 0/0 ONLINE ONLINE rac2 ora.rac2.vip application 0/0 0/0 ONLINE ONLINE rac2 [oracle@rac1 clusterware]$ $ORA_CRS_HOME/bin/crsctl check crs Cluster Synchronization Services appears healthy Cluster Ready Services appears healthy Event Manager appears healthy [oracle@rac1 clusterware]$

노드에서 모두 온라인 상태이면 Oracle Database 11g 설치로 진행해도 됩니다

8. Oracle Database 소프트웨어 설치

먼저 시스템을 확인해야 합니다.

[oracle@rac1 clusterware]$ ./runcluvfy.sh stage -pre dbinst -n rac1,rac2 -r 11gR1

Clusterware에서처럼 glibc 대한 메시지가 나타나지만 최신 버전이므로 경고를 무시해도 됩니다.

설치 프로그램의 압축을 풉니다.

[root@rac1 ~]# cd /u01/install/ [root@rac1 install]# ls clusterware linux.x64_11gR1_clusterware.zip linux.x64_11gR1_database.zip [root@rac1 install]# rm -rf clusterware linux.x64_11gR1_clusterware.zip [root@rac1 install]# unzip linux.x64_11gR1_database.zip [root@rac1 install]# rm linux.x64_11gR1_database.zip

Run it:

[oracle@rac1 ~]$ cd /u01/install/database/

[oracle@rac1 database]$ ./runInstaller

설치 창이 나타나면 Custom 선택하여 RAC 데이터베이스를 위한 개별 구성 요소를 선택합니다.


그림 43

Oracle 베이스에 대해 /u01/app/oracle 선택하고 NamPath 기본값인 Software Location으로 둡니다.


그림 44

Cluster Installation 선택하고 rac1(이미 선택되어 있음) 노드와 rac2 노드를 활성화합니다.


그림 45

설치 프로그램에서 해당 환경을 확인합니다. 현재 구성에서 스왑 공간이 충분하지 않을 있으나 문제가 되지는 않으므로 넘어가도 됩니다. 또한 커널 rmem_default 매개 변수 공지도 무시해도 됩니다.


그림 46

In Product Components에서 필요한 구성 요소를 선택합니다. 구성 요소를 적게 선택할수록 설치 시간이 적게 걸립니다. 예에서는 Enterprise Edition에서 "Real Application Testing" "Partitioning"만을 선택했습니다.


그림 47

Privileged Operating Systems Groups 프롬프트에서 모두 "dba" 그룹을 선택했는지 확인합니다. 정식 구현에서는 보안상의 이유로 이러한 그룹을 분리해야 합니다.


그림 48

나중에 데이터베이스를 만들 것이므로 Install database software only 선택합니다.


그림 49

모든 항목을 다시 확인한 Install 클릭합니다.


그림 50

설치가 수행됩니다. iSCSI 스토리지 최적화를 아직 수행하지 않았으므로 하드웨어에 따라 최대 1시간 정도 걸릴 있습니다.


그림 51

설치가 끝나면 노드에서 설치 스크립트를 실행하라는 메시지가 나타납니다

NetCA: RAC 맞게 Oracle TNS 서비스 구성하기

netca 실행합니다.

[oracle@rac1 ~]$ cd /u01/app/oracle/product/11.1.0/db_1/bin/ [oracle@rac1 bin]$ ./netca

Cluster 선택합니다.


그림 52

리스너를 구성할 것입니다.


그림 53

Add 선택합니다.


그림 54

기본 이름인 "LISTENER" 사용합니다.


그림 55

"TCP" 프로토콜만 선택합니다.


그림 56

리스너는 Oracle 기본 설정인 TCP 포트 1521에서 실행되어야 합니다.


그림 57

리스너는 하나면 충분합니다.


그림 58

종료합니다.

이제 리스너가 데이터를 제대로 수신하는지 확인합니다.

[root@rac2 ~]# ps -ef | grep lsnr | grep -v 'grep' | awk '{print $9}' LISTENER_RAC2 [root@rac2 ~]# /u01/app/crs/bin/crs_stat ora.rac2.LISTENER_RAC2.lsnr NAME=ora.rac2.LISTENER_RAC2.lsnr TYPE=application TARGET=ONLINE STATE=ONLINE on rac2

[root@rac2 ~]#

DBCA: Database Creation

[oracle@rac1 ~]$ cd /u01/app/oracle/product/11.1.0/db_1/bin/ [oracle@rac1 bin]$ ./dbca

Real Application Clusters 선택합니다.


그림 59

Create a Database 선택합니다.


그림 60

노드가 모두 선택되었는지 확인합니다.


그림 61

Custom Database 선택하여 데이터베이스 생성 프로세스의 유연성을 높입니다.


그림 62

데이터베이스 이름을 지정합니다. 설명서의 목적에 따라 "erac.world"라고 이름을 지정하겠습니다. "erac" SID 접두어가 자동으로 붙습니다. SID 각각 "erac1" .. "eracN" 형식으로 추가됩니다.


그림 63

Oracle Enterprise Manager 설치할 것인지를 결정합니다. 설치하려면 적절히 구성합니다.


그림 64

테스트를 위해 중요한 모든 Oracle 계정에 대해 간단한 암호를 선택할 있습니다.


그림 65

확장 RAC 구성을 하려면 스토리지 옵션으로 ASM 선택해야 합니다.


그림 66

모든 ASM 인스턴스에 대해 공유하지 않는 PFILE 사영할 것입니다. 공유 SPFILE 사용하도록 선택하여 중앙에서 ASM 구성할 있지만 경우 중요한 파일을 어느 스토리지 어레이에 저장해야 하는지와 같은 문제가 발생합니다


그림 67

Create Diskgroup Window 창에서 Change Disk Discovery Path 클릭하면 팝업 창이 열립니다. iSCSI LUN 찾도록 Disk Discovery Path 다시 구성해야 합니다. "/dev/iscsi/*/*/part1" 입력합니다. 이렇게 하면 ASM에서 모든 iSCSI LUN 번째 파티션만 고려합니다.


그림 68

이제 서로 다른 스토리지 노드에 있는 개의 iSCSI LUN에서 NORMAL 리던던시(미러링) "DATA1" ASM 디스크 그룹을 만듭니다. LUN 서로 다른 스토리지 노드에 있고 이들을 미러링할 것이므로 개의 페일 그룹을 갖는 DISKGROUP 만들 있습니다. 나중에 배울 것이지만 구성은 하나의 전체 스토리지 어레이가 손실되어도 안전합니다.


그림 69

새로운 +DATA1 디스크 그룹에서 Oracle-Managed Files 선택합니다.


그림 70

개발을 위해 Flashbacks and Archiving 비활성화해도 됩니다.


그림 71

필요 없는 모든 데이터베이스 구성 요소(: Oracle Text, Oracle XML DB) 비활성화합니다. 이렇게 하면 데이터베이스 작성 시간을 상당히 단축할 있습니다.

Initialization Parameters에서 인스턴스에서 사용할 메모리 크기( 크기) 구성할 있습니다. 값은 나중에 memory_target 매개 변수를 변경하여 수정할 있습니다. 필요에 따라 다른 데이터베이스 매개 변수를 사용자 정의합니다.


그림 72

Oracle Database 11g 새로운 보안 옵션을 많이 제공하며 이들은 기본적으로 활성화됩니다. 이러한 옵션을 모두 사용하도록 합니다.


그림 73

Enable automatic maintenance tasks 선택했는지 확인합니다.


그림 74

Database Storage에서 REDO 로그 컨트롤 파일 등과 관련된 매개 변수를 조정할 있습니다. 테스트에는 기본값이 적합합니다.


그림 75

새로운 실험을 위해 기존 DB 삭제한 DB 새로 작성하는 속도를 높이는 데이터베이스 스크립트를 생성하려면 Create Database; 선택합니다.


그림 76

어떤 옵션이 설치되는지를 보여 주는 요약 화면이 나타납니다. 데이터베이스를 작성하는 시간은 설치한 옵션과 사용하는 스토리지에 따라 어느 정도 시간이 걸릴 있습니다. 마지막으로 작성한 데이터베이스에 대한 간단한 요약 화면이 나타납니다.


그림 77

시작 인스턴스 {erac1, erac2}에서 데이터베이스를 사용할 있습니다.


그림 78

확장 Oracle RAC 맞게 데이터베이스 조정

Oracle Database 11g 확장 RAC 클러스터를 위해 유용한 개의 솔루션을 제공합니다. ASM 11g 기능을 사용한 확장 RAC 대한 자세한 내용은 Nitin Vengurlekar 등이 Oracle Automatic Storage Management, Under-the-Hood & Practical Deployment Guide(Oracle Press 2008) 또는 Oracle Storage Administrators Guide 참조하십시오.

선호 읽기(Preferred reads)

Oracle Database 11g "선호 읽기(preferred reads)"라는 새로운 기능을 제공합니다. 기능을 사용하여 DBA 로컬 읽기에 대해 페일 그룹을 지정할 있습니다. 일반적으로 페일 그룹은 지리적으로 데이터베이스 인스턴스에 가까이 있습니다. 선호 읽기 기능은 ASM 인스턴스 전용인 ASM_PREFERRED_READ_FAILURE_GROUPS 매개 변수를 설정하여 활성화할 있습니다.

먼저 어떤 페일 그룹과 디스크 그룹을 사용할 있는지 확인해야 합니다

[oracle@rac1 ~]$ ORACLE_SID=+ASM1 sqlplus / as sysdba [..] SQL> col inst format 9 SQL> col path format a36 SQL> col diskgroup format a8 SQL> col diskname format a10 SQL> col failgroup format a10 SQL> col PR format a2

SQL> SELECT inst_id inst, path, g.name diskgroup,d.name diskname, failgroup, preferred_read PR 2 FROM v$asm_disk d JOIN gv$asm_diskgroup g ON(d.group_number=g.group_number) 3 WHERE mount_status='CACHED' ORDER BY 1;

inst PATH DISKGROU DISKNAME FAILGROUP PR ---- ------------------------------------ -------- ---------- ---------- -- 1 /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 DATA1_0000 U 1 /dev/iscsi/racdata2.asm1/lun0/part1 DATA1 DATA1_0002 DATA1_0001 U 2 /dev/iscsi/racdata2.asm1/lun0/part1 DATA1 DATA1_0002 DATA1_0001 U 2 /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 DATA1_0000 U

4 rows selected.

SQL>

PR 열의 "U" 디스크 그룹에 정의된 읽기 페일 그룹이 없음을 의미합니다. 따라서 특정 페일 그룹에 대해 ASM 선호 읽기를 지정할 있습니다. ASM_PREFERRED_READ_FAILURE_GROUPS 구문은 diskgroup_name.failure_group_name,...'입니다.

SQL> ALTER SYSTEM SET ASM_PREFERRED_READ_FAILURE_GROUPS='DATA1.DATA1_0000' SID='+ASM1';

System altered.

SQL> ALTER SYSTEM SET ASM_PREFERRED_READ_FAILURE_GROUPS='DATA1.DATA1_0001' SID='+ASM2';

System altered.

SQL>

erac1 노드의 ASM 경우 DATA1_0000(/dev/iscsi/racdata1.asm1/lun0/* LUN 포함하는 iscsi1)으로부터 읽고 erac2 노드의 경우 DATA1_0001 페일 그룹으로부터 읽는다고 했습니다. ASM 인스턴스에서 GV$ASM_DISK 쿼리를 수행하여 매개 변수가 적용되었는지 확인할 있습니다.

SQL> SELECT path, g.name diskgroup, d.name diskname, failgroup, mode_status 2 FROM v$asm_disk d JOIN v$asm_diskgroup g ON(d.group_number=g.group_number) 3 WHERE mount_status='CACHED';

INST PATH DISKGROU DISKNAME FAILGROUP PR ---- ------------------------------------ -------- ---------- ---------- -- 1 /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 DATA1_0000 N 1 /dev/iscsi/racdata2.asm1/lun0/part1 DATA1 DATA1_0002 DATA1_0001 Y 2 /dev/iscsi/racdata2.asm1/lun0/part1 DATA1 DATA1_0002 DATA1_0001 Y 2 /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 DATA1_0000 N

4 rows selected.

SQL>

읽기 집중 트래픽이 생성된 다음 쿼리를 사용하여 시스템이 올바른 스토리지 어레이에서 읽는지를 확인할 있습니다.

SQL> SELECT inst_id, failgroup, sum(reads), sum(writes) FROM GV$ASM_DISK GROUP BY inst_id, failgroup;

INST_ID FAILGROUP SUM(READS) SUM(WRITES) ---------- ---------- ---------- ----------- 1 1 DATA1_0000 16976 3778 1 DATA1_0001 3800 2344 2 2 DATA1_0000 2865 2217 2 DATA1_0001 17401 2217

6 rows selected.

SQL>

Oracle erac1 노드의 경우 DATA1_0000 페일 그룹에서 읽고, erac2 노드의 경우 DATA1_0001 페일 그룹에서 읽는 것을 확인할 있습니다.

참고: ASM 인스턴스에서 SPFILE 대신 IFILE 사용하여 ASM_PREFERRED_READ_FAILURE_GROUPS 설정할 경우(: 클러스터로 연결된 파일 시스템이 없는 RAC 클러스터) 설정을 /u01/app/oracle/admin/+ASM/pfile/init.ora 파일에도 추가하여 설정을 영구적으로 적용합니다.

빠른 디스크 재동기화

Oracle Database 11g 페일 그룹 동기화를 수행하는 필요한 시간을 상당히 단축시킵니다. 여기서 11g 10g 주요 차이점은 10g에서는 오류가 발생한 디스크가 디스크 그룹에서 완전히 삭제되는 반면, 11g에서는 Oracle 수정되거나 쓰여진 범위만 업데이트하는 동기화 방식을 구현한다는 것입니다. 빠른 디스크 재동기화(빠른 미러 재동기화) 기능을 사용하려면 ASM 디스크 그룹이 11.1 수준의 호환성을 갖춰야 합니다. 빠른 디스크 재동기화 기능을 사용하는 방법에 대한 자세한 내용은 Oracle Database Storage Administrator's Guide 11g Release 1 4장을 참조하십시오.

확장 RAC 위한 OCR 미러 보팅(Voting) 디스크 확인

설치가 끝났으면 클러스터에 문제가 없는지 확인해야 합니다.

[root@rac1 ~]# cd /u01/app/crs/bin [root@rac1 bin]# ./crs_stat -t Name Type Target State Host ------------------------------------------------------------ ora.erac.db application ONLINE ONLINE rac1 ora....c1.inst application ONLINE ONLINE rac1 ora....c2.inst application ONLINE ONLINE rac2 ora....SM1.asm application ONLINE ONLINE rac1 ora....C1.lsnr application ONLINE ONLINE rac1 ora.rac1.gsd application ONLINE ONLINE rac1 ora.rac1.ons application ONLINE ONLINE rac1 ora.rac1.vip application ONLINE ONLINE rac1 ora....SM2.asm application ONLINE ONLINE rac2 ora....C2.lsnr application ONLINE ONLINE rac2 ora.rac2.gsd application ONLINE ONLINE rac2 ora.rac2.ons application ONLINE ONLINE rac2 ora.rac2.vip application ONLINE ONLINE rac2 [root@rac1 bin]#

11g에서는 보팅 디스크를 온라인으로 관리할 있습니다. Clusterware 설치할 보팅 디스크를 추가하지 않았을 경우 여기서 iSCSI 스토리지 #2 NFS 보팅 디스크 개를 수동으로 추가해 보겠습니다.

[root@rac1 bin]# ./crsctl query css votedisk 0. 0 /dev/iscsi/racdata1.voting/lun0/part1 Located 1 voting disk(s). [root@rac1 bin]# ./crsctl add css votedisk /dev/iscsi/racdata2.voting/lun0/part1 Now formatting voting disk: /dev/iscsi/racdata2.voting/lun0/part1. Successful addition of voting disk /dev/iscsi/racdata2.voting/lun0/part1. [root@rac1 bin]# ./crsctl add css votedisk /votedisk/third_votedisk.crs Now formatting voting disk: /votedisk/third_votedisk.crs. Successful addition of voting disk /votedisk/third_votedisk.crs. [root@rac1 bin]#

보팅 디스크 구성을 확인합니다.

[root@rac1 bin]# ./crsctl query css votedisk 0. 0 /dev/iscsi/racdata1.voting/lun0/part1 1. 0 /dev/iscsi/racdata2.voting/lun0/part1 2. 0 /votedisk/third_votedisk.crs Located 3 voting disk(s). [root@rac1 bin]# ./crsctl check crs Cluster Synchronization Services appears healthy Cluster Ready Services appears healthy Event Manager appears healthy [root@rac1 bin]#

Oracle Clusterware 로그(/u01/app/crs/log/rac1/alertrac1.log) 다음과 비슷한 내용이 기록됩니다.

2008-05-31 17:07:32.302 [cssd(4506)]CRS-1605:CSSD voting file is online: /dev/iscsi/racdata2.voting/lun0/part1. Details in /u01/app/crs/ log/rac1/cssd/ocssd.log. [cssd(4506)]CRS-1601:CSSD Reconfiguration complete. Active nodes are rac1 rac2 . 2008-05-31 17:08:07.341 [cssd(4506)]CRS-1605:CSSD voting file is online: /votedisk/third_votedisk.crs. Details in /u01/app/crs/log/rac1/ cssd/ocssd.log. [cssd(4506)]CRS-1601:CSSD Reconfiguration complete. Active nodes are rac1 rac2.

또한 OCR OCRmirror 통해 보호되고 있는지 확인합니다.

[root@rac1 bin]# ./ocrcheck Status of Oracle Cluster Registry is as follows : Version : 2 Total space (kbytes) : 327188 Used space (kbytes) : 3848 Available space (kbytes) : 323340 ID : 2120916034 Device/File Name : /dev/iscsi/racdata1.ocr/lun0/part1 Device/File integrity check succeeded Device/File Name : /dev/iscsi/racdata2.ocr/lun0/part1 Device/File integrity check succeeded

Cluster registry integrity check succeeded

[root@rac1 bin]#

아무런 문제가 없으면 이제 Oracle RAC 장애 조치 기능을 중점적으로 테스트해 있습니다.

9. 장애 조치(Failover) 기능 테스트

설명서에서 베타 버전을 사용한 orajdbcstat 무료 GPL-d Java 애플리케이션으로서, 이를 통해 여러분은 장애 발생 클라이언트에서 인스턴스 간에 어떻게 전환하는지를 간편하게 살펴볼 있으며 성능을 측정할 수도 있습니다.

ERAC1에서의 인스턴스 실패

우선 유휴 데이터베이스에서 orajdbcstat 실행합니다.

[vnull@xeno orajdbcstat]$ ./orajdbcstat.sh -d ERAC -i ERAC1 -i ERAC2 1 ------ ------conntime------ -----------stmt------------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 15:35:22 ERAC 2 0 49 1 3 0 2 2 0 15:35:22 +ERAC1 1 0 45 1 19 0 2 2 0 15:35:22 +ERAC2 2 0 60 2 4 0 2 14 0 15:35:23 ERAC 1 0 44 1 3 0 2 3 0 15:35:23 +ERAC1 1 0 65 1 2 0 2 3 0 15:35:23 +ERAC2 2 0 46 2 3 0 3 2 0 [..utility still running, output trimmed for clarity..]

출력에서 스레드("ERAC" TNS 설명자) 1번으로 인스턴스에 연결되었음을 있습니다. "conntime"에는 장애 조치 기능을 통해 RAC 인스턴스 TNS 설명자에 새로 연결되는 시간 측정이 표시됩니다. "tcpping" 현재 구현되지 않았습니다. "stmt" 아래에서는 FCF(Fast Connection Failover) 풀의 연결(현재 RAC 인스턴스 번호 간단한 SQL 시간 측정) 모니터링할 있습니다. 명령줄의 마지막 "1" orajdbcstat 1초마다 통계를 출력하도록 지정합니다.

다음 명령을 수행하여 RAC 인스턴스 #1 제거를 시뮬레이션합니다

[oracle@rac1 ~]$ srvctl stop instance -d erac -i erac1 -o abort [oracle@rac1 ~]$

orajdbcstat 사용하는 SSH 세션에서 다음과 같은 출력이 나타납니다. 자세한 설명은 예제 밑에 나와 있습니다.

15:36:55 ERAC 1 0 45 1 3 0 1 3 0 15:36:55 +ERAC1 1 0 42 1 43 0 2 2 0 15:36:55 +ERAC2 2 0 49 2 3 0 4 2 0 ------ ------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 15:36:56 ERAC 2 0 49 1->X [ E!17008 ] 15:36:56 +ERAC1 -1 E!01092 E!01092 1->X [ E!17008 ] 15:36:56 +ERAC2 2 0 67 2 17 0 4 2 0 15:36:57 ERAC 2 0 46 X->2 [ E!17008 ] 15:36:57 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:36:57 +ERAC2 2 0 67 2 17 0 4 2 0 15:36:58 ERAC 2 0 46 X->2 [ E!17008 ] 15:36:58 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:36:58 +ERAC2 2 0 67 2 17 0 4 2 0 15:36:59 ERAC 2 0 46 X->2 [ E!17008 ] 15:36:59 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:36:59 +ERAC2 2 0 67 2 17 0 4 2 0 15:37:00 ERAC 2 0 46 X->2 [ E!17008 ] 15:37:00 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:00 +ERAC2 2 0 67 2 17 0 4 2 0 15:37:01 ERAC 2 0 56 2 12 0 7 3 0 15:37:01 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:01 +ERAC2 2 0 51 2 131 0 5 3 0 15:37:02 ERAC 2 0 59 2 178 0 17 29 0 15:37:02 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:02 +ERAC2 2 0 73 2 121 0 203 36 0 ------ ------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 15:37:03 ERAC 2 0 68 2 2 0 3 2 0 15:37:03 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:03 +ERAC2 2 0 45 2 3 0 2 3 0 15:37:04 ERAC 2 0 48 2 7 0 3 2 0 15:37:04 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:04 +ERAC2 2 0 86 2 2 0 3 4 0 15:37:05 ERAC 2 0 47 2 2 0 3 2 0 15:37:05 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:05 +ERAC2 2 0 53 2 3 0 3 3 0 15:37:06 ERAC 2 0 48 2 3 0 2 2 0 15:37:06 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:06 +ERAC2 2 0 46 2 10 0 2 10 0 15:37:07 ERAC 2 0 48 2 2 0 3 3 0 15:37:07 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:07 +ERAC2 2 0 83 2 10 0 3 2 0 15:37:08 ERAC 2 0 48 2 3 0 2 2 0 15:37:08 +ERAC1 -z E!12521 E!12521 X [ E!17008 ] 15:37:08 +ERAC2 2 0 50 2 2 0 3 2 0 15:37:09 ERAC 2 0 48 2 2 0 2 2 0 15:37:09 +ERAC1 -1 E!12521 E!12521 X [ E!17008 ] 15:37:09 +ERAC2 2 0 44 2 3 0 2 3 0 [..utility still running, output trimmed for clarity..]

다음과 같은 상황이 발생했습니다.

  • 15:36:56 ERAC1 대한 모든 연결이 오류를 반환하기 시작하고 ERAC1 FCF 풀의 모든 연결이 정상적으로 작동하지 않습니다. 데이터베이스의 FCF (ERAC TNS 설명자)에서 오류가 감지되어 장애 조치가 시작됩니다.
  • 15:36:57(장애 발생 1) FCF 풀이 RAC#2 인스턴스("X->2") 재연결을 시작합니다.
  • 15:37:00부터 15:37:01 사이에(장애 발생 4~5) FCF 연결이 활성화된 ERAC2 인스턴스로 다시 설정됩니다

"E!NNNNN" 문자열은 SQL 연결 ORA-NNNNN 오류가 발생했음을 나타냅니다. 오류를 판독하려면 oerrutility 사용하십시오. 복구 (ERAC1 인스턴스 시작) 다음과 같이 출력됩니다.

15:47:37 ERAC 2 0 64 2 3 0 2 3 0 15:47:37 +ERAC1 -1 E!01033 E!01033 X [ E!17008 ] 15:47:37 +ERAC2 2 0 57 2 8 0 13 1 0 15:47:38 ERAC 2 0 54 2 3 0 3 2 0 15:47:38 +ERAC1 1 0 481 X->1 [ E!17008 ] 15:47:38 +ERAC2 2 0 52 2 3 0 2 4 0 ------ ------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 15:47:39 ERAC 2 0 54 2 3 0 3 2 0 15:47:39 +ERAC1 1 0 167 1 14 0 4 2 0 15:47:39 +ERAC2 2 0 56 2 8 0 27 3 0

수동적인 개입 없이 ERAC1 FCF 풀에서 인스턴스가 실행되어 다시 작동되기 시작했음을 감지한 것을 있습니다.

치명적인 사이트 오류

확장 RAC 클러스터를 구축하는 목적은 치명적인 사이트 오류(RAC 노드 SAN 제거) 대처하는 것입니다. 워크스테이션에서 orajdbcstat 다시 실행합니다.

------ ------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 17:24:18 ERAC 1 0 46 2 11 0 2 2 0 17:24:18 +ERAC1 1 0 45 1 4 0 3 2 0 17:24:18 +ERAC2 2 0 46 2 4 0 3 3 0 17:24:19 ERAC 1 0 45 2 2 0 4 3 0 17:24:19 +ERAC1 1 0 44 1 15 0 3 2 0 17:24:19 +ERAC2 2 0 44 2 3 0 3 3 0

FCF 풀이 RAC#2 인스턴스를 사용하는 것을 확인할 있으므로 #2 사이트(iscsi2 rac2 노드) 전체를 제거합니다.

[root@quadovm ~]# xm list

Name ID Mem VCPUs State Time(s) 132_rac1 1 2048 1 -b---- 1845.0 134_rac2 6 2048 1 r----- 152.2 Domain-0 0 512 4 r----- 665.3 iscsi1 3 768 1 -b---- 194.0 iscsi2 5 768 1 -b---- 44.3 [root@quadovm ~]# xm destroy 134_rac2 && date && xm destroy iscsi2 && date Sat May 31 17:25:55 CEST 2008 Sat May 31 17:25:56 CEST 2008 [root@quadovm ~]#

이제 orajdbcstat 세션으로 돌아갑니다.

17:25:56 ERAC 2 0 44 2 3 0 3 2 0 17:25:56 +ERAC1 1 0 79 1 8 0 3 2 0 17:25:56 +ERAC2 2 0 44 2 11 0 3 2 0 17:25:57 ERAC 2 0 44 2 3 0 3 2 0 17:25:57 +ERAC1 1 0 79 1 8 0 3 2 0 17:25:57 +ERAC2 2 0 44 2 11 0 3 2 0 17:25:58 ERAC 2 0 44 2 3 0 3 2 0 17:25:58 +ERAC1 1 0 79 1 8 0 3 2 0 17:25:58 +ERAC2 -1 E!12170 E!12170 2 11 0 3 2 0 17:25:59 ERAC 2 0 44 2 3 0 3 2 0 17:25:59 +ERAC1 1 0 79 1 8 0 3 2 0 17:25:59 +ERAC2 -1 E!12170 E!12170 2 11 0 3 2 0 ------ ------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 17:26:00 ERAC 2 0 44 2 3 0 3 2 0 17:26:00 +ERAC1 1 0 79 1 8 0 3 2 0 17:26:00 +ERAC2 -1 E!12170 E!12170 2 11 0 3 2 0 17:26:01 ERAC 2 0 44 2 3 0 3 2 0 17:26:01 +ERAC1 1 0 79 1 8 0 3 2 0 17:26:01 +ERAC2 -1 E!12170 E!12170 2 11 0 3 2 0 17:26:02 ERAC 2 0 44 2 3 0 3 2 0 17:26:02 +ERAC1 1 0 79 1 8 0 3 2 0 17:26:02 +ERAC2 -1 E!12170 E!12170 2 11 0 3 2 0 17:26:03 ERAC 2 0 44 2 3 0 3 2 0 17:26:03 +ERAC1 1 0 79 1 8 0 3 2 0 17:26:03 +ERAC2 -1 E!12170 E!12170 2->X [ E!03113 ] 17:26:04 ERAC -1 E!12170 E!12170 2 3 0 3 2 0 17:26:04 +ERAC1 1 0 43 X [ E!03113 ] 17:26:04 +ERAC2 -1 E!12170 E!12170 2->X [ E!03113 ] 17:26:05 ERAC -1 E!12170 E!12170 2 3 0 3 2 0 17:26:05 +ERAC1 1 0 43 X->1 [ E!03113 ] 17:26:05 +ERAC2 -1 E!12170 E!12170 2->X [ E!03113 ] 17:26:06 ERAC -1 E!12170 E!12170 2 3 0 3 2 0 17:26:06 +ERAC1 1 0 43 X->1 [ E!03113 ] 17:26:06 +ERAC2 -1 E!12170 E!12170 2->X [ E!03113 ]

ERAC1 인스턴스를 포함하여 확장 RAC 전체가 차단되고 있음을 확실하게 있습니다. ERAC1 인스턴스(주로 DBWR LGWR) 현재 사용할 없는 iscsi2 iSCSI 스토리지에 쓰기를 계속 재시도하고 있기 때문입니다. TCP iSCSI 연결에서 iSCSI 시간이 초과되면 Oracle 소프트웨어(Clusterware, ASM, Database) I/O 오류가 발생합니다.

rac1 rac2에서 iSCSI 스택이 120 동안 재시도하도록 앞에서 구성했습니다(/etc/iscsi/iscsid.conf node.session.timeo.replacement_timeout 매개 변수). 지정한 120 동안 커널은 I/O 작업을 재시도하고 스토리지에서 filedescriptor(fd) 사용하는 모든 애플리케이션은 중단된 상태로 나타납니다. 자세한 내용은 dmesg 명령의 출력 ASM 경고 로그 파일에서 확인할 있습니다

시간 경과 :

17:28:17 ERAC -1 E!12571 E!12571 X [ E!03113 ] 17:28:17 +ERAC1 1 0 43 X->1 [ E!03113 ] 17:28:17 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:18 ERAC -1 E!12571 E!12571 X [ E!03113 ] 17:28:18 +ERAC1 1 0 75 X [ E!03113 ] 17:28:18 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:19 ERAC -1 E!12571 E!12571 X [ E!03113 ] 17:28:19 +ERAC1 1 0 91 X->1 29 0 23 23 0 17:28:19 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:20 ERAC -1 E!12571 E!12571 X [ E!03113 ] 17:28:20 +ERAC1 1 0 43 1 8 0 4 1 0 17:28:20 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:21 ERAC -1 E!12571 E!12571 X [ E!03113 ] 17:28:21 +ERAC1 1 0 42 1 8 0 4 2 0 17:28:21 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:22 ERAC -1 E!12571 E!12571 X->1 4 0 8 9 0 17:28:22 +ERAC1 1 0 42 1 7 0 2 2 0 17:28:22 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] ------------conntime------ -----------stmt--------------- tns rac# tcpping jdbc rac# ins sel upd del plsql 17:28:23 ERAC 1 0 45 1 3 0 3 3 0 17:28:23 +ERAC1 1 0 43 1 2 0 3 2 0 17:28:23 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:24 ERAC 1 0 43 1 2 0 2 2 0 17:28:24 +ERAC1 1 0 43 1 2 0 2 2 0 17:28:24 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:25 ERAC 1 0 44 1 19 0 3 2 0 17:28:25 +ERAC1 1 0 43 1 2 0 3 2 0 17:28:25 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:26 ERAC 1 0 44 1 3 0 2 3 0 17:28:26 +ERAC1 1 0 43 1 2 0 1 2 0 17:28:26 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:27 ERAC 1 0 43 1 3 0 1 2 0 17:28:27 +ERAC1 1 0 42 1 2 0 3 2 0 17:28:27 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ] 17:28:28 ERAC 1 0 43 1 8 0 3 2 0 17:28:28 +ERAC1 1 0 43 1 4 0 3 2 0 17:28:28 +ERAC2 -1 E!12571 E!12571 X [ E!03113 ]

다음과 같은 상황이 이루어집니다.

  • 17:28:17부터 17:28:19 사이(장애 발생 2 14 ) ERAC1 TNS에서 새로운 연결을 재설정할 있게 됩니다.
  • 17:28:19(장애 발생 2 16 ) ERAC1 FCF 풀이 정상적으로 작동합니다.
  • 17:28:19부터 17:28:22까지(장애 발생 2 16 ) 마스터 ERAC FCF 풀이 ERAC1 장애 조치 전환을 시도합니다.
  • 17:28:22(장애 발생 2 19 ) 마스터 ERAC FCF 풀이 ERAC1 성공적으로 장애 조치를 전환합니다. 이제 모든 연결이 정상적으로 작동합니다. DATA1_0001 페일 그룹에서 디스크 마운트 상태를 CACHED에서 MISSING으로 변경합니다.

SQL> col path format a36 SQL> col diskgroup format a10 SQL> col failgroup format a10 SQL> SELECT path, dg.name diskgroup, failgroup, mount_status, mode_status FROM v$asm_disk d JOIN v$asm_diskgroup dg ON (d.group_number=dg.group_number) ORDER BY 1;

PATH DISKGROUP FAILGROUP MOUNT_S MODE_ST ------------------------------------ ---------- ---------- ------- ------- /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 CACHED ONLINE DATA1 DATA1_0001 MISSING OFFLINE SQL>

지연 대기의 영향 성능 저하

경고: 이러한 테스트는 설명서를 위한 것이며 실제 상황을 위한 테스트가 아니므로 확장 RAC 클러스터 성능을 실제로 측정하기 위한 테스트로 사용할 없습니다. .

확장 RAC 구성의 가장 중요한 요소는 RAC 노드와 스토리지 어레이 간의 거리입니다. 비용이 많이 드는 하드웨어 없이 대기 지연 시뮬레이션과 관련된 문제를 해결하기 위해 Linux에서 기본적으로 제공하는 네트워크 트래픽 형성 기능(QoS-Quality of Source) 사용할 것입니다. SAN iSCSI 기반으로 하므로 이더넷 레이어에서 간단하게 대기 지연, 패킷 순서 재지정 패킷 삭제를 시험해 있습니다. 이는 NFS 현재 개발되고 있는 FcoE에도 적용됩니다. 목표는 RAC 노드 간의 상호 연결을 위한 것입니다.

시나리오에서는 dom0 내부 Xen 네트워크 장치가 VM 간에 지연을 발생하도록 구성할 것입니다. Linux 트래픽을 형성하는 유틸리티는 "tc"(Traffic Control)입니다. 세부적으로 들어가기 시작하면 문제가 발생합니다. 표준 Oracle VM Server dom0 커널은 250HZ 실행되며 이는 dom0 커널에서 시간과 관련된 모든 작업이 4ms 간격으로 수행됨을 의미합니다. Linux netem 대기열 관리 원칙에 따라 발생하는 대기 지연은 커널의 속도(HZ) 따라 결정되므로 1ms 대기 지연을 시뮬레이션하려면 속도(HZ) 설정을 변경해야 합니다. 적어도 1,000HZ 변경해야 1ms 대기 지연을 시뮬레이션할 있습니다.

커널을 구성하는 것은 다소 까다로운 작업이 있으므로 여기에서 실행 준비가 완료된 dom0 커널 RPM 다운로드하여 사용하는 것이 좋습니다. dom0 Xen 커널을 빌드하는 절차는 "Oracle VM Server 2.1 Xen dom0 위한 커널 작성하기" 섹션 뒷부분에 간단하게 설명되어 있으며, 커널을 새로 설치하는 절차도 나와 있습니다.

Xen 네트워크 인터페이스에서 대기 지연이 발생하도록 구성하는 간단한 스크립트의 이름은 qosracinit.pl이며 dom0에서 실행되었습니다. 스크립트는 여기에서 다운로드할 있습니다.

여러분의 환경에 따라 변수를 변경한 실행합니다.

[root@quadovm ~]# ./qosracinit.pl > /tmp/qos && bash /tmp/qos [root@quadovm ~]#

대기 지연을 피하기 위해 QoS 규칙을 삭제하려면 다음을 실행하면 됩니다

[root@quadovm ~]# ./qosracinit.pl clear > /tmp/qos && bash /tmp/qos [root@quadovm ~]#

테스트는 Dominic Giles Swingbench 2.3 Order Entry 벤치마크를 사용하여 수행되었습니다. Swingbench RAC 환경을 손쉽게 설치할 있는 방법입니다. "Min Think" "Max Think" 시간은 설치의 가능한 트랜잭션 처리 능력을 사용하기 위해 0으로 설정되었습니다. "Think" 시간은 다음 트랜잭션을 지연하는 필요한 시간입니다.

15개의 JDBC 연결로 구성된 개의 부하 생성자(minibench) 개별 RAC 노드에서 부하를 생성했습니다. 부하 생성자는 "xeno" 워크스테이션에서 실행되었습니다. SOE 사용자에 대해 보고된 실제 데이터베이스 크기는 다음과 같습니다

SQL> conn soe/soe Connected. SQL> select sum(bytes)/1024/1024 mb from user_segments;

MB ---------- 2250.72656 SQL>

주요 매개 변수는 다음과 같은 값으로 설정되었습니다.

  • sga_target=1G
  • db_cache_size = 512M
  • pga_aggregate_target=256M
  • memory_target = 0 (disabled)

하한 db_cache_size 설정은 Oracle 데이터베이스에서 상호 연결 SAN 부하를 발생시켜 대기 지연되도록 설정되었습니다.

지연 대기 없음

우선 Vm 간의 실제 지연 대기를 측정합니다. (참고: 모든 ping 테스트는 Swingbench 완전 부하 상태에서 수집되었습니다.)

[oracle@rac2 ~]$ ping -c 10 -i 0.2 -q -s 1200 10.97.1.1; ping -c 10 -i 0.2 -q -s 1200 10.98.1.101; ping -c 10 -i 0.2 -q -s 1200 10.98.1.102 PING 10.97.1.1 (10.97.1.1) 1200(1228) bytes of data.

--- 10.97.1.1 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1816ms rtt min/avg/max/mdev = 0.067/0.091/0.113/0.018 ms PING 10.98.1.101 (10.98.1.101) 1200(1228) bytes of data.

--- 10.98.1.101 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1804ms rtt min/avg/max/mdev = 0.083/0.106/0.132/0.020 ms PING 10.98.1.102 (10.98.1.102) 1200(1228) bytes of data.

--- 10.98.1.102 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1799ms rtt min/avg/max/mdev = 0.079/0.108/0.193/0.034 ms [oracle@rac2 ~]$

테스트는 RAC2 노드와 다음 간의 지연 대기를 보여 줍니다.

  • 10.97.1.1(상호 연결을 통한 RAC1)
  • 10.98.1.101(SAN 통한 iscsi1 openfiler)
  • 10.98.1.102(SAN 통한 iscsi2 openfiler)

1,200바이트 ICMP 에코 패킷을 사용합니다. 확장 RAC 대해 평균 왕복 시간이 중요한 요소이므로 이를 확인할 것입니다. 아래에서 있듯이 벤치마킹 결과는 ~5460TPM입니다.

[oracle@rac1 ~]$ sqlplus -s / as sysdba @tpm 6356 5425 4924 5162 5430 Average = 5459.4

PL/SQL procedure successfully completed.

[oracle@rac1 ~]$

그런 다음 지연 대기를 발생시키고 테스트 시스템에 대한 영향을 살펴 봅니다. 이에 사용되는 tpm.sql 스크립트의 내용은 다음과 같습니다.

set termout on set echo off set serveroutput on DECLARE val1 NUMBER; val2 NUMBER; diff NUMBER; average NUMBER := 0; runs NUMBER := 5; BEGIN FOR V IN 1..runs LOOP SELECT SUM(value) INTO val1 FROM gv$sysstat WHERE name IN ('user commits','transaction rollbacks');

DBMS_LOCK.SLEEP(60);

SELECT SUM(value) INTO val2 FROM gv$sysstat WHERE name IN ('user commits','transaction rollbacks');

diff := val2-val1; average := average + diff; DBMS_OUTPUT.PUT_LINE(diff); END LOOP; DBMS_OUTPUT.PUT_LINE('Average = ' || average/runs); END; /

exit

1ms 지연 대기

앞에서 것처럼 우선 실제 평균 왕복 시간을 측정합니다

[oracle@rac2 ~]$ ping -c 10 -i 0.2 -q -s 1200 10.97.1.1; ping -c 10 -i 0.2 -q -s 1200 10.98.1.101; ping

-c 10 -i 0.2 -q -s 1200 10.98.1.102 PING 10.97.1.1 (10.97.1.1) 1200(1228) bytes of data.

--- 10.97.1.1 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1809ms rtt min/avg/max/mdev = 2.693/3.482/3.863/0.389 ms PING 10.98.1.101 (10.98.1.101) 1200(1228) bytes of data.

--- 10.98.1.101 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1854ms rtt min/avg/max/mdev = 2.481/3.850/6.621/1.026 ms PING 10.98.1.102 (10.98.1.102) 1200(1228) bytes of data.

--- 10.98.1.102 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1812ms rtt min/avg/max/mdev = 0.080/0.135/0.233/0.051 ms [oracle@rac2 ~]$

위의 출력을 봤을 , Linux 출력 네트워크 대기열에 1ms 추가된 실제 평균 왕복 시간이 3.5 – 3.8ms 정도 증가했음을 있습니다. 이는 발신되는 ICMP 에코 요청 패킷이 1ms 동안 지연되고 그에 따라 응답측으로부터의 응답도 1ms만큼 지연되기 때문입니다.나머지 2초는 시스템 부하가 찼을 과부하 시스템에서 Xen 일정 예약 컨텍스트 전환으로 인해 발생합니다. (참고: 현재 4개의 VM 시뮬레이션하고 있으며 실제로는 IO 작업이 dom0에서 수행되며 5번째 VM 4x CPU 시스템에서 실행됩니다.)

[oracle@rac1 ~]$ sqlplus -s / as sysdba @tpm 5173 5610 5412 5094 5624 Average = 5382.6

PL/SQL procedure successfully completed. [oracle@rac1 ~]$

3ms 지연 대기

[oracle@rac2 ~]$ ping -c 10 -i 0.2 -q -s 1200 10.97.1.1; ping -c 10 -i 0.2 -q -s 1200 10.98.1.101; ping

-c 10 -i 0.2 -q -s 1200 10.98.1.102

PING 10.97.1.1 (10.97.1.1) 1200(1228) bytes of data.

--- 10.97.1.1 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1819ms rtt min/avg/max/mdev = 6.326/7.631/9.839/0.881 ms PING 10.98.1.101 (10.98.1.101) 1200(1228) bytes of data.

--- 10.98.1.101 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1806ms rtt min/avg/max/mdev = 6.837/7.643/8.544/0.426 ms PING 10.98.1.102 (10.98.1.102) 1200(1228) bytes of data.

--- 10.98.1.102 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1801ms rtt min/avg/max/mdev = 0.076/0.149/0.666/0.172 ms [oracle@rac2 ~]$

위에서 있듯이 시스템에 대한 Xen 일정 예약 과부하로 인해 1.5-2ms 추가되었습니다(7.5[ms] – 2x3[ms] = 1.5[ms]).

[oracle@rac1 ~]$ sqlplus -s / as sysdba @tpm 5489 4883 5122 5512 4965 Average = 5194.2

PL/SQL procedure successfully completed.

[oracle@rac1 ~]$

테스트에서 지연 대기 없이 5200TPM 5460TPM 성능 저하를 있습니다

10. 문제 해결 기타 정보

섹션에서는 확장 RAC 구조를 구현하는 동안 발생할 있는 다양한 문제에 대해 다룹니다.

RAC 연결 ORA-12545 오류 방지하기

경우에 따라 새로 구성한 RAC 클라이언트에 연결할 ORA-12545 오류("Connect failed because target host or object does not exist") 발생합니다. 문제를 해결하려면 인스턴스에 대해 개별적으로 LOCAL_LISTENER 매개 변수를 변경하십시오

 

SQL> ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.99.1.91)(PORT=1521))' SID='erac1';

System altered.

SQL> ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.99.1.92)(PORT=1521))' SID='erac2'; System altered.

또는 DNS 설정하고 여기에 RAC 노드를 등록하거나, RAC 호스트 이름을 IP 주소로 변환하도록 클라이언트를 다시 구성할 수도 있습니다. 예를 들어, UNIX 유사 JDBC 클라이언트에서 /etc/hosts 주소를 추가합니다.

10.99.1.191 vmrac1-vip vmrac1 10.99.1.192 vmrac2-vip vmrac2

Oracle VM Server 2.1 Xen dom0 커널 빌드하기

dom0 커널을 직접 컴파일하려면 Oracle VM 다음 RPM 업로드해야 합니다

[vnull@xeno Downloads]$ scp -r RPMS_OVM21_kernel_compile root@10.99.1.2:. root@10.99.1.2's password: m4-1.4.5-3.el5.1.i386.rpm 100% 133KB 133.2KB/s 00:00 rpm-build-4.4.2-37.el5.0.1.i386.rpm 100% 547KB 547.5KB/s 00:00 kernel-2.6.18-8.1.6.0.18.el5.src.rpm 100% 48MB 9.6MB/s 00:05 kernel-headers-2.6.18-8.el5.i386.rpm 100% 723KB 723.5KB/s 00:00 glibc-devel-2.5-12.i386.rpm 100% 2034KB 2.0MB/s 00:00 elfutils-0.125-3.el5.i386.rpm 100% 164KB 163.7KB/s 00:00 glibc-headers-2.5-12.i386.rpm 100% 605KB 604.6KB/s 00:00 patch-2.5.4-29.2.2.i386.rpm 100% 64KB 64.0KB/s 00:00 redhat-rpm-config-8.0.45-17.el5.0.1.noarch.rpm 100% 52KB 52.5KB/s 00:00 libgomp-4.1.1-52.el5.i386.rpm 100% 69KB 69.3KB/s 00:00 cpp-4.1.1-52.el5.i386.rpm 100% 2673KB 2.6MB/s 00:01 gcc-4.1.1-52.el5.i386.rpm 100% 5067KB 5.0MB/s 00:00 elfutils-libs-0.125-3.el5.i386.rpm 100% 105KB 105.2KB/s 00:00 [vnull@xeno Downloads]$

그런 다음 설치 패키지를 복사하여 OracleVM Server 설치합니다.

[root@quadovm RPMS_OVM21_kernel_compile]# rpm -Uhv *.rpm [..] [root@quadovm ~]# cd /usr/src/redhat/SPECS/ [root@quadovm SPECS]# vi kernel-2.6.spec

kernel-2.6.spec 다음 변수를 설정해야 합니다.

  • %define buildboot 0
  • %define buildxenovs 1

[root@quadovm SPECS]# rpmbuild -bp --target=`uname -m` kernel-2.6.spec Building target platforms: i686 Building for target i686 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.29959 + umask 022 [..] [root@quadovm SPECS]# cd ../BUILD/kernel-2.6.18/linux-2.6.18.i686/ [root@quadovm linux-2.6.18.i686]# grep HZ .config # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_MACHZ_WDT=m CONFIG_NO_IDLE_HZ=y [root@quadovm linux-2.6.18.i686]# vi .config

.config 다음과 같이 편집하여 HZ 1,000Hz 설정되었는지 확인합니다.
# CONFIG_HZ_100
설정하지 않음
# CONFIG_HZ_250
설정하지 않음
CONFIG_HZ_1000=y
CONFIG_HZ=1000

Makefile 편집하여 커널을 차별화한 다시 빌드합니다

[root@quadovm linux-2.6.18.i686]# vi Makefile change EXTRAVERSION to e.g.: -8.1.6.0.18.el5xen_vnull03 [root@quadovm linux-2.6.18.i686]# make oldconfig [..] [root@quadovm linux-2.6.18.i686]# make config [..disable KERNEL DEBUG!...] [root@quadovm linux-2.6.18.i686]# make rpm scripts/kconfig/conf -s arch/i386/Kconfig [..]

새로 빌드한 커널은 /usr/src/redhat/RPMS/i386 디렉토리에 있어야 합니다

새로운 커널 설치하기

새로운 커널을 설치하는 절차는 대부분 동일하지만 여기서 컴파일한 커널은 설치 프로그램을 사용하지 않으므로 일부 커널 설치 절차를 수동으로 수행해야 합니다.

[root@quadovm ~]# rpm -ihv kernel-2.6.188.1.6.0.18.el5xen_vnull03-1.i386.rpm Preparing... ########################################### [100%] 1:kernel ########################################### [100%] [root@quadovm ~]# depmod -a 2.6.18-8.1.6.0.18.el5xen_vnull03 [root@quadovm ~]# mkinitrd /boot/initrd-2.6.18-8.1.6.0.18.el5xen_vnull03.img 2.6.18-8.1.6.0.18.el5xen_vnull03

이제 새로운 커널에서 부팅하도록 GRUB 부트 로더를 변경해야 합니다.

[root@quadovm ~]# cd /boot/grub [root@quadovm grub]# vi menu.lst

먼저 menu.lst file: default=0에서 기본값이 "0"으로 설정되어 있는지 확인합니다. 설정은 기본적으로 menu.lst에서 번째 커널 항목을 부팅합니다. 다음 GRUB 커널 구성 항목을 앞에 항목으로 넣습니다.

title Oracle VM Server vnull03 root (hd0,0) kernel /xen.gz console=ttyS0,57600n8 console=tty dom0_mem=512M module /vmlinuz-2.6.18-8.1.6.0.18.el5xen_vnull03 ro root=/dev/md0 module /initrd-2.6.18-8.1.6.0.18.el5xen_vnull03.img

치명적인 사이트 오류 신속 복구

여기에서는 장애 시뮬레이션 iscsi2 어레이와 rac2 노드를 정상적으로 작동시키는 간단한 절차를 설명합니다 (참고: 시나리오에서는 iscsi2 LUN 있는 OCRmirror 손실되었습니다.)

  1. iscsi2 시스템의 전원을 켭니다(: /OVS/running_pool/64_iscsi2 xm create vm.cfg 실행).
  2. rac1 노드에서 iscsi2 대한 iSCSI 연결을 감지하도록 설정합니다. /var/log/messages에서 "iscsid: connection4:0 is operational after recovery (314 attempts)" 같은 메시지가 있는지 확인합니다.
  3. ALTER DISKGROUP DATA1 ONLINE ALLon +ASM1 인스턴스를 수행합니다
  4. 누락된 페일 그룹이 이제 동기화됩니다.

PATH DISKGROUP FAILGROUP MOUNT_S MODE_ST ------------------------------------ ---------- ---------- ------- ------- /dev/iscsi/racdata1.asm1/lun0/part1 DATA1 DATA1_0000 CACHED ONLINE /dev/iscsi/racdata2.asm1/lun0/part1 DATA1 DATA1_0001 CACHED SYNCING

  1. 잠깐 후에 ASM 페일 그룹이 정상적으로 작동됩니다(MODE_STATUS=ONLINE).
  2. 보팅 디스크가 CSS 데몬에 의해 자동으로 온라인 상태로 됩니다.
  3. Ocrcheck에서 OCR mirror 하나가 동기화되지 않았다고 나타냅니다

[root@rac1 bin]# ./ocrcheck Status of Oracle Cluster Registry is as follows : Version : 2 Total space (kbytes) : 327188 Used space (kbytes) : 3848 Available space (kbytes) : 323340 ID : 2120916034 Device/File Name : /dev/iscsi/racdata1.ocr/lun0/part1 Device/File integrity check succeeded Device/File Name : /dev/iscsi/racdata2.ocr/lun0/part1 Device/File needs to be synchronized with the other device

Cluster registry integrity check succeeded [root@rac1 bin]#

  1. 이를 해결하려면 ocrconfig 실행한 다음 /u01/app/crs/log/rac1/crsd/crsd.log에서 새로운 OCR 미러에 대한 정보(대체 수행된 작업) 확인합니다

[root@rac1 bin]# ./ocrconfig -replace ocrmirror /dev/iscsi/racdata2.ocr/lun0/part1 [root@rac1 bin]#

  1. rac2 전원을 켜고 확장 클러스터에 대해 정상적으로 작동하도록 합니다.

11. 다음 단계

RAC 클러스터의 장애 복구 기능을 강화하는 방법에는 여러 가지가 있습니다. 먼저 Linux 결합 드라이버를 사용하여 리던던시형의 상호 연결을 설정할 있습니다. iSCSI 통해 IO 멀티 패칭에도 동일하게 적용합니다. 많은 디스크와 iSCSI OpenFiler 시스템 전용 디스크를 사용하면 성능과 테스트가 향상됩니다

12. 감사의

다음 분들에게 감사의 말씀을 드립니다:

  • racle 대해 가르쳐 주시고 관심을 갖게 만들어 주신 Radosław Mańkowski
  • Poznan University of Technology에서 프로젝트로 확장 RAC 대한 내용을 작성할 있도록 허가해 주신 Mariusz Masewicz Robert Wrembel.
  • 설명서의 기반이 RAC 설치에 대한 우수한 자료를 작성하신 Jeffrey Hunter.
  • 확장 RAC 통한 (직접) NFS 대한 기술적 설명을 제공해 주신 Kevin Closson (http://kevinclosson.wordpress.com/) Dan Norris (http://www.dannorris.com/)
Posted by redkite
, |

Silent Install을 사용한 오라클 데이터베이스 설치

가끔 다음과 같은 때가 있다. 오라클 데이터베이스를 설치해야 한다. 그런 데X터미널이 가능한 환경이 없다. 최근엔 노트북 가격이 많이 저렴해서 오퍼레이션 환경으로 사용되는 경우가 많은데 국내에서는 리눅스가 설치 된노트북을보기가드물다. 물론방법이없는것은아니다. 무료소프트웨 어인VMware 플레이어를설치하고적당한리눅스배포판을다운받아설 치하거나 cygwin 같은 오픈소스 소프트웨어를 사용할 수도 있다. 하지만 꼭그럴때에만인터넷이되지않는환경일때가많다.

한번OUI의setup을 실행시켜보자. DISPLAY가 설정되지 않았다는 둥, 지원하지않는환경이라는메시지만이돌아온다. 어떻게하는게좋을까? 또이런경우가있다. 오라클데이터베이스를사용하는애플리케이션을개 발 완료하였다. 이제 인스톨러를 개발해야 하는 단계에 접어들었는데, 오 라클 데이터베이스 설치는 어떻게 해야 할까? 어떤 방법으로든 애플리케 이션 설치 작업 중간에OUI 를 실행시켜 데이터베이스를 사용자가 직접 설치하도록해야하는가? 인스톨중간에자동적으로데이터베이스가설치 되게끔자연스럽게애플리케이션인스톨러에포함시키는방법이없을까? 답은 항상 있는 법이다. 위와 같은 상황에서 우리는 오라클 데이터베이스 의Silent Install 기능과 몇 가지 도구를 사용 함으로서GUI를 통하지 않 으면서도손쉽고빠르게데이터베이스를설치하거나삭제할수있다.

그럼 Silent Install을 통한 오라클 데이터베이스 설치 작업을 전체적으로 살펴보자. 설치는다음과같은작업순서로이루어진다고볼수있다.

작업은크게설치바이너리등의준비를포함하는준비와실제환경에설치 를진행하는두가지단계로나뉜다고볼수있다. 이순서는일반적인오라 클 데이터베이스 설치 순서로써 본 기사에서 언급하는 Silent Install이란 쉽게 말해 이러한 설치의 각 단계에서 사용하는 도구들을GUI 없이 가능 한자동화된방법으로사용하도록해주는것으로생각하면쉽다.

1. 바이너리 준비

준비단계는물론설치할환경용의스테이지바이너리를다운받는것으로 시작한다. 어떠한 경우에라도 설치 작업에서 가장 중요한 것은 설치할 환 경을정확히파악하는것이다. 충분한환경파악및준비없이설치를시작 하게되면커널파라메터의잘못된설정, 디렉토리권한부족등다양한원 인에의해한번의시도로는깔끔하게설치에성공하지못하게될가능성이 높다. 다시 언급 되겠지만 제품 설치 매뉴얼 상에 명시된 소프트웨어/하드 웨어 요구사항과 설치 전 작업 부분을 확인해서 실제 설치 전에 모든 오류 가능성을최대한배제해주는것이현명하다.

2. 데이터베이스 템플릿 준비

다음은 설치 후 생성해 줄 데이터베이스에 대한 준비이다. 목적하고 있는 설치 작업이 만약 기 운용중인 데이터베이스로부터의 마이그레이션 작업 이거나 개발한 애플리케이션의 부속으로서의 데이터베이스 설치라면 이 미구성이완료된데이터베이스를그대로새로설치될데이터베이스에옮 길필요가있을것이다. 이런목적으로사용될수있는것이바로데이터베 이스템플릿파일이며오라클데이터베이스유틸리티인DBCA(DataBase Configuration Assistant)를통해생성되거나사용될수있다. 템플릿파일은템플릿에포함시켜야할데이터가있는가의여부에따라두 가지중하나로선택될수있다. 선택된템플릿유형에따라다음과같은템 플릿파일을사용하게된다.

- 데이터를 포함하는 경우 : dbc, dbf 파일

- 데이터를 포함하지 않는 경우 : dbt 파일

데이터베이스를 생성하면서 메타데이터와 같이 선 입력되어야 할 데이터 가있다면dbc 파일템플릿유형을선택하면된다. 스키마는dbc 파일에저 장되며데이터는dbf 파일에압축되어저장된다. DBCA를사용한템플릿생성은다음과같은옵션을설정해야한다.

- createTemplateFromDB : 데이터베이스 생성 작업을 알리는 옵션

- sourceDB : 데이터베이스 소스

- templateName : 저장할 템플릿 파일명

- sysDBAUserName : DBA 계정

- sysDBAPassword : DBA 계정 암호

해당옵션을설정한후실행하면다음과같은화면을볼수있다.

dbca -createTemplateFromDB -sourceDB localhost:1521:orcl -templateName dbtemp -sysDBAUserName sys sysDBAPassword oracle1 Wed Dec 17 08:54:51 PST 2008 Creating a template from the database 10% complete 20% complete … 100% complete Look at the log file "/u01/app/oracle/oracle/product/10.2.0/db_1/ cfgtoollogs/dbca/silent.log" for further details. Wed Dec 17 08:55:03 PST 2008

이렇게생성된템플릿파일은다음의디렉토리에생성된다. <ORACLE_HOME>/assistants/dbca/templates 여기까지가준비단계이다. 애플리케이션을패키징하는경우라면애플리 케이션 바이너리와 스크립트등을 포함시키자. 오라클 데이터베이스 바이 너리와템플릿파일이준비가되었다면이제타겟시스템에설치준비가다 된것이다.

3. 설치 전 환경 점검

본격적인 설치 작업에 앞서 설치 환경에 대한 점검이 필요하다. 이러한 점 검사항은설치매뉴얼상에자세하게나와있지만일반적으로확인해봐야 하는내용중에는대표적으로다음과같은것들이있다.

- 다른 오라클 제품이 설치 된 것이 있는가?

- 설치할 계정이 생성되어 있는가?

- 충분한 디스크 용량이 확보되어 있는가?

- 네트워크 구성이 되어 있는가

특히 사전에 다른 오라클 제품이 설치되어 있는 경우 OUI (Oracle Universal Installer) 가사용하는OraInventory 디렉토리의사용권한에 제약이걸리거나오라클홈이름이충돌할수가있으므로반드시파악을해 두어야 한다. 이러한 점검을 통해 설치할 계정, 바이너리를 설치할 위치 (ORACLE_BASE), 데이터베이스를 설치할 위치(ORACLE_HOME) 를기록해두자.

본기사에서는설치환경을오라클리눅스로가정한다.

4. 바이너리 복사

이제 타겟 시스템에 로그인하여 오라클 데이터베이스 스테이지를 업로드 하자. 업로드 위치는 중요하지 않지만 설치를 진행할 계정에게 실행 권한 을부여하는것을잊지말자.

5. 사용자 환경 설정

사용자 환경설정은 먼저 oraInst.loc 파일을 생성하는 것으로 시작한다. root 계정으로 접속하여 /etc 디렉토리에 다음의 내용을 포함하는 oraInst.loc 파일을생성해주고이파일에데이터베이스를설치할계정이 파일내용을변경할수있도록권한을부여한다.

> vi /etc/oraInst.loc inventory_loc=<ORACLE_BASE>/oraInventory inst_group=

다음으로 사용자의 환경변수에ORACLE_BASE 를 설정해 준다. 만약 /tmp 디렉토리에400mb 이상의 영역이 확보되지 않았다면 별도의 적절 한영역을확보하여설정해준다.

> vi ./bash_profile $ ORACLE_BASE=/u01/app/oracle $ TMP=<mount_point>/tmp $ TMPDIR=<mount_point>/tmp $ export ORACLE_BASE TMP TMPDIR

6. 오라클 데이터베이스 바이너리 설치

바이너리설치는Oracle Universal Installer (OUI) 에의해진행된다. 이 OUI 에서 제공하는 Silent Install이바로GUI 없이 오라클 데이터베이 스를설치를가능하게해주는기능이다. Silent Install을위해서는설치시 에 요구되는 오라클 홈, 경로 등 각종 입력 값을 미리 정의하고 있는 Response 파일을통해반드시제공해야한다. Response 파일에는다양한 항목이 명시될 수 있으며DBCA를 따로 호출할 필요 없이 기본 데이터베 이스생성도가능하다. 다음의위치에서오라클스테이지에포함되어있는 Response 파일샘플을열어볼수있다.

<ORACLE_STAGE>/response/enterprise.rsp

<ORACLE_STAGE>/response/standard.rsp

다양한 옵션 설정이 가능하지만 간단하게 데이터베이스 바이너리만을 설 치하는경우라면다음의사항들만입력하면충분하다. 설치하려는데이터 베이스종류에따라두파일중적당한샘플파일을복사, 수정하여사용한다.

FROM_LOCATION : 인스톨 미디어 위치. products.xml 파일의 절대경로

ORACLE_HOME : 오라클 데이터베이스가 설치될 위치

ORACLE_HOME_NAME : 오라클 홈 이름

INSTALL_TYPE : 설치하려는 데이터베이스 타입. SE 혹은 EE

COMPONENT_LANGUAGES : 데이터베이스 바이너리의 기본언어

UNIX_GROUP_NAME : 설치 계정의 소속 그룹

n_configurationOption : 기본 데이터베이스를 생성할 것인지의 여부

위의 사항들이 포함된 Response 파일을 noconsole, silent, force 그리고 waitforcompletion 옵션들과더불어실행하면OUI 는사전환경점검을 수행하고오류가없으면그대로인스톨작업을시작한다.

> runInstaller -noconsole -silent -force -waitforcompletion -responseFile ./oui.rsp -monitorFile ./oui_monitor.log Starting Oracle Universal Installer... Checking installer requirements... Preparing to launch Oracle Universal Installer from /tmp/OraInstall2009-02- 12_10-05-22PM. Please wait ...Oracle Universal Installer, Version 10.2.0.1.0 Production Copyright (C) 1999, 2005, Oracle. All rights reserved. You can find a log of this install session at: /usr/oracle/oraInventory/logs/installActions2009-02-12_10-05-22PM.log

옵션에서responseFile에는앞서작성한Response 파일을, Monitor파일 에는 설치 진행에 관련된 로그 파일들의 위치가 출력된다. 이러한 파일들 은현실행위치가경로로잡혀있지않다면절대경로로설정해주어야한다. 옵션으로지정한Monitor파일에는다음과같은메시지가출력된다.

> vi /usr/oracle/oraInventory/logs/installActions2009-02-12_10-05-22PM.log Installactionslog=<ORA_INVENTORY>/logs/installActions2009-01-09_02-09- 44AM.log silentlog=<ORA_INVENTORY>/logs/silentInstall2009-01-09_02-09-44AM.log outlog=<ORA_INVENTORY>/logs/oraInstall2009-01-09_02-09-44AM.out errlog=<ORA_INVENTORY>/logs/oraInstall2009-01-09_02-09-44AM.err

<ORA_INVENTORY>는 일반적으로<ORACLE_BASE> 하위의 oraInventory 디렉토리이며 이곳에 설치 시작 시간을 기준으로 네 가지 로그파일이생성된다. InstallActionslog는설치에서진행된세부단계의 작업로그가출력되며outlog에서는좀더간결한방식으로출력된다. 그러 나가장유용한로그는silentlog로써 이곳에는 설치 작업 시도에 대한 요약된 결과만을 포함한다. 만약 Response 파일에 누락사항이 있거나 오류 가검출되는경우해당사항만이silentlog에출력되므로대처에용이하다. 다음은설치에성공했을때볼수있는silentlog 파일내역이다.

silentInstall2009-02-12_10-05-22PM.log WARNING:The following configuration scripts /usr/oracle/product/10.2.0/db_1/root.sh need to be executed as root for configuring the system. If you skip the execution of the configuration tools, the configuration will not be complete and the product wont function properly. In order to get the product to function properly, you will be required to execute the scripts and the configuration tools after exiting the OUI. The installation of Oracle Database 10g was successful.

만약다른애플리케이션설치작업의일환으로데이터베이스의설치를포 함한다면 outlog 파일의 내용을 주기적으로 검사해서 데이터베이스의 설 치 진행 정도를 확인한 후 애플리케이션 인스톨러의GUI 에 반영시키는 형태의응용을고려해볼수있다. 마지막으로, root 계정으로다음의스크립트를실행함으로써바이너리인 스톨이마무리된다.

<ORACLE_HOME>/root.sh

7. 오라클 리스너 구성

바이너리 인스톨이 완료되면 다음은 오라클 리스너를 설정하고 시작하는 단계이다. 오라클 리스너 구성은 NetCA (Network Configuration Assistant) 를 사용하게 되며 Silent Install이므로OUI 때와 마찬가지로 Response 파일을작성하여야한다. OUI 때와마찬가지로샘플Response 파일을수정하여사용하는것이좋다. NetCA Response 파일에필수적으 로명시해야하는내용은다음과같다.

SHOW_GUI : NetCA 화면이 뜨지 않게 한다. false 로 세팅한다.

LOG_FILE : 표준 출력에 출력하는 내용을 지정한 로그파일에도 출력한다.

작성된Response 파일을써서다음과같이NetCA를기동시킨다. silent, log 옵션을설정한다.

> $ORACLE_HOME/bin/netca /silent /log /responsefile netca.rsp Parsing command line arguments: Parameter "silent" = true Parameter "responsefile" = /home/oracle/workspace/mystage/Ora10gCD/ netca.rsp Done parsing command line arguments. Oracle Net Services Configuration: Configuring Listener:LISTENER Default local naming configuration complete. Listener configuration complete. Oracle Net Listener Startup: Running Listener Control: /usr/oracle/product/10.2.0/db_1/bin/lsnrctl start null Listener Control complete. Listener start failed. Listener may already be running. Default local naming configuration complete. Created net service name: EXTPROC_CONNECTION_DATA Profile configuration complete. Oracle Net Services configuration successful. The exit code is 0

작업이 완료되면 tnsnames.ora와 sqlnet.ora 생성되고 명시된 리스너가 구성된다.

8. 데이터베이스 생성

데이터베이스생성은준비단계에서설명된템플릿파일생성때와마찬가 지로 DBCA의 Silent Install 모드를 통해 수행할 수 있다. OUI 나 NetCA 와마찬가지로상세한설정을Response 파일에하고dbca를실행 하면 된다. Response 파일을 통해서는SGA 영역 설정 등 매우 상세한 내 용까지 설정이 가능하다. 각 항목에 대해서는 샘플 상에 주석으로 설명이 상세히되어있으니참고해보기를권장한다.

본 기사에서는 설치 단계에서 만들었던 데이터베이스 템플릿을 이용하여 데이터베이스를생성하고자한다. 먼저템플릿파일을다음의위치에복사 한다.

$ORACLE_HOME/assistants/dbca/templates/

템플릿을사용해서데이터베이스를생성하는경우dbca 에알려주어야하 는내용이최소화될수있으므로굳이Response 파일을만들필요는없다. 여기서는dbca의옵션을직접설정하여데이터베이스설치를진행한다. 다음은DBCA 실행 시에 사용자가 반드시 설정해 주어야 하는 옵션들이다. Response 파일을사용하는경우에도마찬가지로적용된다.

-templateName : 템플릿 파일 명

-gdbname : 글로벌 데이터베이스명

-sid : 데이터베이스 서비스 ID

-sysPassword : sys 계정 암호

-systemPassword : system 계정 암호

-recoveryAreaDestination : 데이터베이스 로그 파일이 저장될 위치

이제 silent와 createDatabase 옵션을 설정하여 dbca를 기동하면 다음과 같이데이터베이스가생성되는과정을확인할수있다. 데이터베이스가설 치된후에는자동으로데이터베이스가시작된다.

> dbca -silent -createDatabase -templateName optbtemp.dbt -gdbname orcl.jwp.oracle.com -sid orcl -sysPassword oracle1 -systemPassword oracle1 - recoveryAreaDestination /usr/oracle/flash_recovery_area Creating and starting Oracle instance 1% complete Creating database files Creating data dictionary views 21% complete Adding Oracle JVM … Completing Database Creation … 100% complete Look at the log file "/usr/oracle/product/10.2.0/db_1/cfgtoollogs/dbca/orcl/ orcl.log" for further details.

설치 된 후에 설치계정에ORACLE_SID 를 설정한 후 sqlplus로 접속해 볼수있다.

본설정에서는Enterprise Manager(EM)를사용하지않는데이터베이스 임베딩 환경을 가정하였다. EM 의 설치가 필요하다면 emConfiguration 옵션을추가해주어야한다.

결론

이상으로Silent Install을통한오라클데이터베이스설치방법을스텝바 이스텝으로훑어보았다. 보다상세한각설치과정에대한설명이나설치 전의 확인사항 등에 대해서는 반드시 설치 가이드(Oracle Database Installation Guide)를필독하기를권장한다. OUI의발전과더불어오라 클제품의설치는매우간단해졌지만여전히초심자들에게는어렵게느껴 질때가많으며또가끔GUI 기반의설치에부담을느끼는사람들도종종 보게될때가있다. 이런경우Silent Install 기능은설치과정을단순화하 고각과정에어떠한사용자입력이필요한지를한눈에파악할수있게함 으로써 오라클 데이터베이스의 구조 및 설치 과정에 대해 보다 쉽고 빠른 이해를도울수있다. 또한개발한애플리케이션의부속으로서데이터베이 스가임베딩이되는경우, Silent Install 기능을사용하여애플리케이션설 치과정에데이터베이스설치를자연스러운형태로포함함으로서전체설 치과정에대한통제권을확보할수있다. 이를바탕으로사용자실수, 환경 오류등다양한원인으로비롯될수있는설치오류에대해보다유연한대 처가가능할수있으며따라서애플리케이션의신뢰도와품질향상에기여 할수있을것으로희망한다.

11.31 설치시 OS버전에러시

./runInstaller -ignoreSysPrereqs

./runInstaller -noconsole -silent -force -ignoreSysPrereqs -waitforcompletion -responseFile /var/tmp/client/response/clientadmin.rsp -monitorFile /var/tmp/install.log

# oracle profile 수정

$ vi .profile

umask 022

export ORACLE_BASE=/oracle/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/10.2.0

export ORACLE_SID=ORA10g #(instance_name을 지정한다)

export TMPDIR=$ORACLE_BASE/tmp

export TMP=$ORACLE_BASE/tmp

# export DISPLAY=hostname:0.0 #(runInstaller를 띄우기 위해 Display를 잡아준다)

export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

export NLS_LANG=AMERICAN_AMERICA.UTF8 #(DB Character set 지정)

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:/usr/lib

export PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/sbin:/usr/ccs/bin:.:$PATH #<HP-UX 의 경우 추가사항>

# export SHLIB_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:/usr/lib #< AIX 의 경우 추가사항>

export LIBPATH=$ORACLE_HOME/lib:$ORACLE_HOME/network/lib:/usr/lib

export LINK_CNTRL=L_PTHREADS_D7

Posted by redkite
, |

DB Silent Mode 설치

export ORACLE_HOME=/oracle/product/10.2
export ORACLE_BASE=/oracle/product/10.2
export ORACLE_CD=/oracle/product/10.2

runInstaller [ Install ]
----------------------------------------------------------------------------------
필수 사항
=======================================================
export TMPDIR=$ORACLE_BASE/tmp
export TMP=$ORACLE_BASE/tmp
mkdir -p $ORACLE_BASE/tmp

export ORACLE_CD=$ORACLE_BASE
cp $ORACLE_CD/database/response/enterprise.rsp .

vi enterprise.rsp
------------------------------------------------------------------
UNIX_GROUP_NAME="dba"
FROM_LOCATION="/oracle/product/10.2/database/stage/products.xml"
ORACLE_BASE="/oracle/product/10.2"
ORACLE_HOME="/oracle/product/10.2"
ORACLE_HOME_NAME="OUIHome1"
INSTALL_TYPE="EE"
COMPONENT_LANGUAGES={"en","ko"}
n_configurationOption=false
=======================================================

export rsp=enterprise.rsp
cat $rsp | grep ^FROM_LOCATION=> $rsp.out
cat $rsp | grep ^ORACLE_HOME=>> $rsp.out
cat $rsp | grep ^ORACLE_HOME_NAME=>> $rsp.out
cat $rsp | grep ^INSTALL_TYPE=>> $rsp.out
cat $rsp | grep ^COMPONENT_LANGUAGES=>> $rsp.out
cat $rsp | grep ^UNIX_GROUP_NAME=>> $rsp.out
cat $rsp | grep ^n_configurationOption=>> $rsp.out
cat $rsp.out

설치
=====
$ORACLE_CD/database/runInstaller -silent -force -waitforcompletion \
-responseFile `pwd`/$rsp


runInstaller [ Patch ]
----------------------------------------------------------------------------------
필수 사항
=======================================================
export TMPDIR=$ORACLE_BASE/tmp
export TMP=$ORACLE_BASE/tmp
mkdir -p $ORACLE_BASE/tmp

export ORACLE_CD=$ORACLE_BASE
cp $ORACLE_CD/Disk1/response/patchset.rsp .

vi enterprise.rsp
------------------------------------------------------------------
UNIX_GROUP_NAME="dba"
FROM_LOCATION="/oracle/product/10.2/Disk1/stage/products.xml"
ORACLE_HOME="/oracle/product/10.2"
ORACLE_HOME_NAME="OUIHome1"
COMPONENT_LANGUAGES={"en","ko"}
11g
경우 추가
----------------
b_acceptLicense=false
b_useRegistration=false
DECLINE_SECURITY_UPDATES=true
=======================================================

export rsp=patchset.rsp
cat $rsp | grep ^FROM_LOCATION=> $rsp.out
cat $rsp | grep ^ORACLE_HOME=>> $rsp.out
cat $rsp | grep ^ORACLE_HOME_NAME=>> $rsp.out
cat $rsp | grep ^COMPONENT_LANGUAGES=>> $rsp.out
cat $rsp | grep ^UNIX_GROUP_NAME=>> $rsp.out
cat $rsp.out

Patch
=====
$ORACLE_CD/Disk1/runInstaller -silent -force -responseFile `pwd`/$rsp

netca
----------------------------------------------------------------------------------
cp $ORACLE_CD/database/response/netca.rsp .
SHOW_GUI=false

netca /silent /responsefile netca.rsp
$ORACLE_HOME/bin/netca /silent /log /responseFile /data/oracle/media/database/response/netca.rsp
yum install libXp-1.0.0-8.i386.rpm
yum install libXp

dbca
----------------------------------------------------------------------------------
수정 파일: $ORACLE_HOME/assistants/dbca/templates/New_Database.dbt
< option name="SPATIAL" value="false"/>
< initParam name="sga_target" value="140" unit="MB"/>

export DB_UNIQUE_NAME=DB10
export ORACLE_BASE=/oracle

dbca -silent -createDatabase -templateName New_Database.dbt \
-gdbname DB10 -sid DB10 -sysPassword system -systemPassword system \
-datafileDestination /oradata
-recoveryAreaDestination /oradata/DB10/flash_recovery_area
[-characterSet KO16MSWIN949
-characterSet KO16KSC5601
-characterSet UTF-8 ]

dbca -silent -deleteDatabase -sourceDB DB10

dbca -silent -createDatabase -templateName New_Database.dbt \
-gdbname Ora10g -sid Ora10g -sysPassword qodzmxkdns -systemPassword qodzmxkdns \
-datafileDestination /data/oradata -recoveryAreaDestination /data/oradata/Ora10g/flash_recovery_area -characterSet AL16UTF8 -characterSet KO16KSC5601


10205/Disk1/runInstaller -silent -responseFile /HDHOSP/patch/Disk1/response/patchset.rsp
~~~~~~~~~~~~~~~~~~~~~~~~
INFO: The user has chosen to include the collector, but with the shiphomeinfo.properties value, is the collector included for configuration ? : true
INFO: The ORACLE_CONFIG_HOME env var is set to
INFO: The selected Home : /oracle/product/10.2 is selected for upgrade ? false
INFO: Setting the value of COLLECTOR_UPGRADE
INFO: Setting variable 'COLLECTOR_UPGRADE' to 'false'. Received the value from a code block.
INFO: Can we show the collector page ? true

SEVERE:Values for the following variables could not be obtained from the command line or response file(s):
MYORACLESUPPORT_USERNAME(MyOracleSupportUsername)
Silent install cannot continue.

조치
10205/Disk1/runInstaller -silent -responseFile /HDHOSP/patch/Disk1/response/patchset.rsp DECLINE_SECURITY_UPDATES=TRUE

Posted by redkite
, |

6155910_기술노트_60회_Oracle_Database_11gR2_RAC_Install_Step_by_Step_on_vSphere.pdf

VMware 공유 디스크 생성

Vmfkstools.pl –server 192.168.0.100 –c 5g –d eagerzeroedthick –a lsilogic

/vmfs/volumes/datastore1/ordata/crs.vmdk

Vmfkstools.pl –server 192.168.0.100 –c 20g –d eagerzeroedthick –a lsilogic

/vmfs/volumes/datastore1/ordata/data.vmdk

  1. 양쪽 노드에 호스트 파일 등록

    [root@rac1]# cat /etc/hosts

    223.1.1.18 rac1

    223.1.1.19 rac2

    #Private LAN For Oracle RAC Interconnection

    10.1.1.18 rac1-priv1

    10.1.1.19 rac2-priv1


    # Public Oracle Virtual IP

    223.1.1.20 rac1-vip

    223.1.1.21 rac2-vip


    223.1.1.22 rac-scan

  2. 커널 설정
    fs.aio-max-nr = 1048576

    fs.file-max = 6815744

    kernel.shmall = 2097152

    kernel.shmmni = 4096

    kernel.sem = 2700 32000 100 128

    net.ipv4.ip_local_port_range = 9000 65500

    net.core.rmem_default = 262144

    net.core.rmem_max = 4194304

    net.core.wmem_default = 262144

    net.core.wmem_max = 1048586

    kernel.shmmax = 8589934592

  3. /etc/limits.conf 파일에 설정
    oracle soft nofile 131072
    oracle hard nofile 131072
    oracle soft nproc 131072
    oracle hard nproc 131072
    oracle soft core unlimited
    oracle hard core unlimited
    oracle soft memlock 3500000
    oracle hard memlock 3500000
  4. /etc/pam.d/login 파일에 다음을 등록
    session required /lib/security/pam_limits.so
  5. User 쉘 등록 작업
    PATH=$PATH:$HOME/bin
    export PATH
    stty erase ^H
    export ORACLE_BASE=/app/oracle
    export ORACLE_HOME=$ORACLE_BASE/11.2.0.2
    export ORACLE_SID=RAC2
    export ORACLE_UNQNAME=RAC
    export ORACLE_TERM=xterm
    export PATH=/usr/sbin:$PATH
    export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
    export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
    export DISPLAY=192.168.6.40:0.0
    if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
    if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
    else
    ulimit -u 16384 -n 65536
    fi
    umask 022
    fi
  6. ASM Rawdevice 를 사용하기 위해 패키지 설치
    http://www.oracle.com/technetwork/server-storage/linux/downloads/rhel5-084877.html
  7. Oracle ASM을 이용하여 디스크 설정
    fdisk 설정
    #> oracleasm createdisk CRS /dev/sdb1
    #> oracleasm createdisk DATA /dev/sdc1
    #> oracleasm listdisks
    #> oracleasm scandisks
  8. SSH DSA 키 생성 후 패스워드 없이 로그인
    #> ssh-keygen -t dsa
    #> vi authorized_keys
  9. Grid Infrastructure 관련 설치 전 사전 확인
    #> ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose
    6155898_verify.txt

<meta http-equiv="content-type" content="text/html; charset=utf-8">

raw device 연동

/etc/sysconfig/rawdevices

# format: <rawdev> <major> <minor>

# <rawdev> <blockdev>

# example: /dev/raw/raw1 /dev/sda1

# /dev/raw/raw2 8 5

/dev/raw/raw1 dev/sdb1

/dev/raw/raw2 dev/sdb2

/dev/raw/raw3 dev/sdb3

/dev/raw/raw4 dev/sdb4

/dev/raw/raw5 dev/sdc1

/dev/raw/raw6 dev/sdc2

/dev/raw/raw7 dev/sdc3

/dev/raw/raw8 dev/sdc4

 

raw 관련 서비스 재시작

service rawdevices restart

 

권한 관련 설정
/etc/udev/permissions.d/50-udev.permissions (4버전대)

/etc/udev/rules.d/60-raw.rules (5버전대)

ACTION=="add", KERNEL=="raw*", OWNER=="oracle", GROUP=="oinstall", MODE=="0660"

Posted by redkite
, |

0005. 보안 체크리스트

5. DB 취약점 체크리스트(Oracle 기반)

모든 DBA는 오라클이 안정적으로 운영되고 문제발생 시에 해당 원인을 찾아 신속히 대처 해야 할 임무를 갖는다. 이를 위해서 사전에 발생할 수 있는 문제들이 어떠한 것이 있는지 파악하고 있어야 하며, 일단 문제가 발생하였을 경우 오라클 운영 환경을 점검하여 빠른 시간 내에 문제를 해결할 수 있어야 한다.

본 가이드라인은 오라클 운영 중에 고려해야 할 다양한 항목들을 제시하고 있다. 오라클 운영 중 고려해야 할 항목은 크게 DB 전체와 DB를 구성하는 FILE 및 TABLESPACE 종 류 별로 백업, 설정, 모니터링 등의 측면을 구분하여 각각 점검할 사항들을 제시한다. 각 구성요소별 백업, 설정, 모니터링 등의 측면에서 살펴보고, 이것을 업무에 적용함으로 써 오라클 운영과 문제상황에 대해 효과적으로 대처할 수 있다.

가. Database

1) 백업
백업(Backup)에 사용될 테이프와 같은 장비상태가 불안정하다고 판단될 때는 절대로 사용하지 말아야 한다. 또한, 백업된 정보는 즉시 확인할 수 있어야 한다. 즉, 어느 파 일이 어느 백업 위치에 있는지 바로 알 수 있어야 것이다.
시스템 가동 시점에서 백업 절차 전체에 대한 테스트를 수행한 후, 해당 결과를 확인하 여 변경할 사항들이 있는지 확인하여야 한다.
백업 되는 파일 이름은 날짜, 업무 등의 정보를 포함시켜서 나중에 보더라도 알기 쉽도 록 지정한다.
3개월 단위마다 정기적으로 백업을 이용한 복구 테스트(Recovery Test)를 실시한다.

2) 설정
가장 최신의 오라클 패치를 적용하여 시스템이 안정적으로 운영될 수 있도록 해야 한다.
DB_FILES 값의 설정에 주의해야 한다. 이 값을 초과하여 추가 하려고 할 때는 에러가 발생하게 되고, 이러한 상황에서 DB_FILES를 변경하게 되면 DB는 종료(shutdown) 후에 다시 시작(start)되어야 한다.
ENQUEUE_RESOURCES는 OS의 Lock Resource를 조절하는 역할을 한다. 이 값 이 너무 낮게 설정되어 있게 되면 특정 애플리케이션에서 Time Out이 발생하게 된다.
DML_LOCKS값은 Object에 대한 작업을 하는 모든 사용자를 고려하여 최대한 크게 설 정한다. 이 값이 부족하게 되면 애플리케이션에서 에러가 발생하게 된다.
DB를 재생성할 경우에 대비해서 그 절차를 숙지하고 있어야 한다. 그렇지 않으면 소요 작업시간이 길어지게 된다.

3) 모니터링
Alert.log와 Trace 파일의 내용을 점검하여 에러가 없는지, Archive나 Checkpoint 에 대한 Waiting이 발생하지 않았는지 등을 점검한다. 이 파일들을 이용하여 오라클 Internal Error나 다른 Error 정보를 얻을 수 있다.
*_dump_dest의 Free Space여부를 확인한다. InitSID.ora나 configSID.ora에 *_dump_dest가 설정되어 있다. 특히, Alert Log 는 계속 늘어나게 되므로 일정한 크 기가 되었을 때 백업을 받고, Background_dump_dest의 Free Space를 수시로 점검 하여 Space 문제가 발생하지 않도록 주의한다.
Tablespace별로 성장속도를 확인한다. 이렇게 하면 Space 부족으로 발생할 수 있는 DB Hang 문제를 미리 대비할 수 있게 된다.
Utlbstat.sql / utlestat.sql으로 DB 상태를 정기적으로 점검하여 시스템에 대한 통계 정보를 기록해 둔다. 이 자료는 튜닝을 위한 기초자료가 된다.
각 Tablespace에 대해 Fragmentation을 점검한다. Fragmentation이 많이 발생하 여 Free Space가 부족하다면 Coalesce를 수행하거나 Data File을 추가하도록 한다. Disk Space가 거의 존재하지 않는다면 Export를 받은 후 다시 Import를 실시한다.
InitSID.ora 파일에 변경이 있을 때 마다 그 이력(History)를 기록해 둔다. 이렇게 하 면 Parameter의 변경으로 발생하는 문제를 대처할 수 있고, 성능(Performance)의 변 화도 알 수 있다.

나. Database 구성 File

오라클 DB를 구성하는 파일들은 Control 파일, Online Redo Log 파일, Archive Log 파일, Data 파일 등으로 나누어진다. 각각의 파일들은 DB 운영을 위해 중요한 정보들을 포함하고 있으므로 수시로 상태를 점검하여야 한다.

1) CONTROL 파일
백업
?정기적으로 백업을 받도록 한다. Cold Backup일 경우에는 Control 파일자체를 복 사하여 백업을 받고 DB가 운영중일 경우는 다음 명령어를 이용하여 파일을 백업받 도록 한다.

.Data 파일과 Redo Log 파일의 추가나 삭제 등의 원인으로 DB에 변경사항이 있을 때마다 백업 받도록 한다.

.Hot Backup시 End Backup이 발생할 때마다 백업을 받도록 한다.
.백업받은 파일 이름에 날짜와 업무정보 등을 포함시켜 쉽게 알아볼 수 있도록 한다.

설정
.MAXDATAFILES 값은 예상치보다 크게 설정하여야 한다. 디폴트 값은 플랫폼 (Platform)별로 다르게 지정된다. InitSID.ora에서 DB_FILES가 크게 설정되어 있더라도 MAXDATAFILES 값이 너무 작으면, DB에서 동시에 Open할 수 있는 Datafile의 개수는 MAXDATAFILES 값을 넘을 수가 없게 된다. 이 값을 변경하기 위해서는 Control 파일을 재생성해야 한다.
?별도의 디스크와 콘트롤러가 사용되도록 물리적 위치를 지정한다.
?*.ctl과 같이 알기 쉬운 이름을 사용하도록 한다.
?최소 3개가 사용되도록 해야 한다.
?MAXLOGFILES 값을 확인하여 예상치보다 크게 설정하도록 한다.
?MAXLOGMEMBERS 값이 3이상이 되도록 설정한다.
?OPS의 경우 MAXINSTANCES값을 예상치보다 크게 설정하도록 한다.
?MAXLOGHISTORY는 저장될 Log History정보의 양을 지정하므로, Log File이 생성되는 추이를 파악하여 적절한 값을 지정하여야 한다.
?OS 레벨에서 모니터링이 되어 있는지 확인하고 Striping은 하지 않도록 한다.

2) ONLINE REDO LOG 파일
백업
?Hot Backup시에는 End Backup 이후에 'archive log list' 명령어를 수행하여 현재 Log Sequence Number를 먼저 확인해야 한다. 그리고 나서 다음 명령어를 수행하여 Archive를 추가로 생성한 후, 앞서 확인한 Sequence Number까지 Archive Log를 백업 받으면 된다.

?Hot Backup시에는 Archive Log 파일이 Backup되었으면 Online Redo Log는 백업받을 필요가 없다.
?Cold Backup시에는 Restore 할 때의 실수를 방지하기 위하여 주요 DB 파일, 특히 Archive Log 파일과는 다른 위치에 백업을 받는다.
설정
?OPS일 경우 Instance Recovery를 위해서 Log의 모든 Member는 동시에 Access 가 가능하여야 한다.
?각 그룹의 Member들은 Disk와 Controller를 별도로 사용하도록 지정한다.
?Redo의 Thread는 Instance당 1개를 설정하여야 한다.
?Redo Log Group은 최소 3개 이상이 되도록 하고, 각 그룹들은 최소 2개 이상의 Member를 가지도록 한다. 이렇게 Log Mirroring을 하게 되면 돌발적인 파일 삭 제 상황에 대비할 수 있게 된다.
?Redo Log Member의 Size는 Checkpoint에 대한 Waiting이 발생하지 않도록 충 분한 크기를 지정하여야 한다. 사이즈(Size)가 너무 작을 경우에는 잦은 Log Switch 로 인하여 복구 시간이 지나치게 많이 소요될 수 있다.
?Redo Log Member의 사이즈는 모두 같게 한다.
?DB 파일과 다른 물리적인 위치를 지정하도록 한다.
모니터링
?Checkpoint 주기를 점검하도록 한다. 권장할 만한 Checkpoint의 주기는10-15분 정도이다. LOG_CHECKPOINT_INTERVAL을 가장 큰 Redo Log File Size보다 크게 설정하고 LOG_CHECKPOINT_TIMIEOUT을 0으로 설정하게 되면, Log Switch가 일어날 때마다 Checkpoint가 발생하게 되므로 Log File Size 변경을 통 해 Checkpoint 주기를 조정할 수 있게 된다.
잦은 Checkpoint는 Crash 복구 시간은 줄여주지만, Dirty Buffers를 자주 사용하 고 File Headers를 자주 업데이트하게 되어 Overhead를 일으키게 된다. ?Log Switch가 너무 자주 발생하지 않는지 점검한다. Log Switch는 15분 정도 주 기가 적당하다. Log Switch가 너무 자주 발생하면 v$backup을 통해 Hot Backup 상태인 파일이 있는지도 확인한다.
?V$logfile을 통해 Status를 수시로 점검한다. Status가 Invalid나 Stale이 없는지 확인해야 한다.
3) ARCHIVE LOG 파일
백업
?모든 Archive Log가 빠짐없이 백업에 포함되었는지 점검한다. 또한, V$LOG에서 Archived, Status 칼럼을 참조하여 Archive가 완전이 끝난 Log 파일을 백업해야 한다.
?OPS일 경우에는 모든 Thread에서 생성되는 Archive를 전부 백업해야 한다.
?백업된 Archive Log 파일의 Sequence Number가 연속되어 있는지 확인해야 한다.
?Archive Log 파일이 특정 Threshold에 도달할 때마다 백업해야 한다. 가능하다면 매일 백업을 받는 것이 좋다.
?백업된 Archive 파일들은 삭제하도록 한다. 그러나 Disk의 공간을 충분히 하여 최 소한 하루의 Archive Log들은 백업을 받았더라도 삭제하지 않도록 한다. 이것은 장애 시에 복구 시간을 줄이는 역할을 할 수 있다.
?Archived Log File의 개수는 Log 파일의 크기와 Redo의 양에 달려있다. 그리고 Redo 의 양은 Transaction의 양과 연관되어 있다. 이러한 환경을 고려하여 백업의 빈도를 결정하도록 한다.
?백업 위치별로 그 속에 포함된 Log가 어느 기간동안 생성된 것인지에 대한 정보를 기록해 두어야 한다.
?Archive Log 생성속도와 파일의 백업 속도에 대해 알고 있어야 한다.
?Main이 되는 백업 장비에 문제가 있을 것에 대비하여 즉시 사용 가능한 대체장비를 확보하고 있어야 하며, 이 대체장비는 Backup Script에 반영되어 있어야 한다.
설정
?DB가 ARCHIVELOG Mode로 운영 중인지 확인한다. 이것을 위해서는 다음 명령어 를 사용할 수 있다.

?생성되는 Archive 파일의 위치와 파일 이름 형식을 알아보기 쉽도록 지정한다. 이 것은 initSID.ora에서 LOG_ARCHIVE_DEST와 LOG_ARCHIVE_FORMAT을 통해 지정할 수 있다. LOG_ARCHIVE_FORMAT= "LOG%s_%t.ARC"으로 설정 할 경우 %s는 Log Sequence Number, %t는 Thread Number를 의미한다. 특히 OPS인 경우 %t를 설정하여 Thread별로 생성되는 Archive를 구별하여 관리하도 록 한다.
?Archive되는 위치가 Disk인지 확인한다. Tape에서 Disk로 옮기는 시간을 줄여서 복구 시간을 단축할 수 있다. 그러나 Tape에도 Archive를 복사해 두도록 한다. ?Online Redo Log와는 다른 Disk와 Controller를 사용해야 한다.
?DB 파일과는 다른 Disk와 Controller를 사용해야 한다.
?OS 레벨에서 Mirror가 되도록 하고, Striping은 하지 않도록 한다.
모니터링
?Archive 파일이 생성되는 위치에 여유 공간이 있는지 확인해야 한다. Disk에 여유 공간이 없어서 Archive Log를 생성하지 못하는 경우에는 DB Hang이 발생하게 된 다. Archive 위치에 여유공간이 얼마 남지 않았을 경우 경고 메시지를 발생시키도 록 하는 내용을 Backup Script에 포함시킨다.
?Archive와 관련된 에러가 발생하지 않았는지 Alert Log를 점검한다.
?Archived Log 파일의 Sequence Number가 순차적인지 확인한다. Log Switch 가 일어날 때마다 Sequence Number는 하나씩 증가된다.
?DB가 ARCHIVELOG Mode로 작동중인지 확인해 본다. 만약 Archive Log Mode 가 아니라면 다음과 같은 과정을 통해 Mode를 변경할 수 있다.

?ARCH Process가 움직이는지를 자주 확인한다. 이렇게 하면ARCH Process가 움 직이지 않아서 DB가 Hang이 걸리는 문제를 막을 수 있다.

다. TABLESPACE

오라클 DB를 구성하는 Tablespace에는 System Tablespace, Rollback Segment Tablespace, Data Tablespace, Temporary Tablespace 등이 있다. 각 Tablespace 는 Data를 저장하는 논리적인 공간이며, 앞에서 다룬 OS 상의 DB 관련 파일들과 긴밀하 게 연관되어 있다.

1) SYSTEM TABLESPACE
모니터링
?Free Space를 수시로 점검한다.
?Extents의 개수가 MAXEXTENTS/2 지점에 이르지 않았는지 확인한다.
?Tablespace의 size가 적정수준인지 확인한다. 일반적인 System Tablespace의 Size는 30~50M이다.
?일반사용자의 Object나 Temporary Segment가 포함되지 않았는지 점검한다.
?일반사용자에게 사용권한을 부여하지 않도록 한다.
?System Tablespace 이외의 Tablespace에서 발생하는 Extent는 Data Dictionary 의 정보를 사용하게 되므로 작은 Extent가 지나치게 많을 경우 System Tablespace 의 Space도 영향을 받게 된다.
?특별한 경우가 아니면 SYS Object의 Storage절을 변경하지 않도록 한다.
?Disk를 모니터링하고 Striping은 설정하지 않는다.
2) ROLLBACK SEGMENT TABLESPACE
백업
?Hot Backup은 DB Activity가 낮은 시점에서 실시한다.
설정
?알기 쉬운 이름을 사용해야 한다.
?일반적인 용도의 RBS의 크기는 모두 같게 한다.
?INITIAL과 NEXT는 같게 설정한다.
?PCTINCREASE는 0으로 설정한다.
?InitSID.ora에서 UNLIMITED_ROLLBACK_SEGMENTS=FALSE를 지정하여 RBS가 Unlimited Extent Format을 사용하는 것을 방지하도록 한다.
?OS 레벨에서 모니터링을 하고 Striping은 하지 않는다.
모니터링
?InitSID.ora에 RBS들이 등록되어 있는지 확인한다.
?RBS가 Online 상태인지 주기적으로 점검한다. 이 때 dba_rollback_segs를 이용 할 수 있다.
?RBS Tablespace에 다른 Object가 생성되지 않았는지 점검한다.
?RBS의 크기변동률을 점검한다. V$rollstat을 이용하면 RBS가 커지거나 줄어드는 비율과 Wait 정보를 확인할 수 있다.
?Free Space와 Fragmentation 정도를 점검한다.
?ORA-1555에러가 발생하는지 점검한다. 이 경우에 DB는 여전히 사용가능하며 Application Error가 발생할 수 있다. Data 파일을 추가하여 공간을 늘여야 한다.
?RBS당 Transaction의 개수는 4개~5개가 적절하다.
?Batch Job에만 사용되는 큰 크기의 RBS를 별도로 설정하고, OLTP용 RBS와 동시 에 Online되지 않도록 한다. 다음 명령어로 특정 RBS 사용을 지정할 수 있다.

3) DATA TABLESPACE
백업
?READ-ONLY Tablespace일 경우 쓰기, 읽기 권한 관리에 주의하여야 한다. 이러 한 변화는 Control 파일이나 Data 파일의 백업에도 영향을 미치게 된다.
?MTTR을 만족시킬 수 있는 주기 단위로 백업을 실시한다.
?Export를 이용하여 Object 레벨에서 Logical 백업을 받아두어야 한다.
?Hot Backup 시에는 해당 Data 파일의 Transaction 발생을 줄여서 Redo가 적게 발생되도록 해야 한다.
설정
?알아보기 쉬운 이름을 사용하도록 한다.
?서로 다른 Tablespace는 다른 Disk에 위치하도록 하는 것이 좋다. OS 파일이 분실 되는 것은 곧 Tablespace의 분실을 의미하므로 사전에 주의하여야 한다.
?Index Tablespace는 Data와 분리하여 사용하도록 한다.
?Fragmentation을 줄이기 위해서는 Tablespace내에 비슷한 크기의 Object들이 위치하게 하는 것이 좋다.
?OPS의 경우에는 Application별로 Tablespace를 분리하여 운영하는 것이 좋다.
?Autoextend는 비활성화로 설정하여 사용한다.
?7.3 이전 Version에서는 Block Size 별로 Tablespace의 MAX EXTENTS의 값이 제한되어 있었다. 예를 들어, Block Size가 2K일 경우는 121, 8K일 경우는 505 였다. 그러나 7.3이후 Version에서는 MAX EXTENTS값보다 더 많은 값을 직접 지정하는 것이 가능해 졌다. MAX EXTENTS 보다 더 큰 값을 사용하게 되면 새로 운 Block Format이 사용된다.
?Default Storage 절이나 생성되는 Object에 MAXEXTENTS UNLIMTED를 사 용하지 않도록 한다.
?MAXEXTENTS UNLIMITED를 설정할 수도 있으나 권장되는 설정이 아니다. UNLIMITED Extent Format을 사용하려면 COMPATIBLE의 값이 7.3.0이상으 로 설정되어 있어야 한다.
?MAXEXTENTS UNLIMITED를 설정하는 것은 해당 Tablespace의 Free Space 전체를 사용하게 될 위험이 있다. 또, MAXEXTENTS UNLIMITED가 사용될 경우 작은 Extent의 개수가 과도하게 증가하여 DROP TABLE, TRUNCATE TABLE 작업 등을 수행할 때 Space와 관련된 심각한 성능 문제를 유발할 수 있다.
.OS 레벨에서 Mirror되게 한다.
모니터링
.주요 Object에 대해서는 정기적으로 분석을 실시한다.
.문제를 조기에 발견하기 위해서 Object가 MAXEXTENTS/2에 도달했는지를 점검 한다.
.Type이 다른 Object가 동일한 Tablespace에서 혼용되지 않도록 한다.
.DBVERIFY를 사용하여 정기적으로 점검해 본다.
.Null Device에 Export하여 Logical Object의 상태를 점검해 본다.
4) TEMPORARY TABLESPACE
설정
.임시 Tablespace의 개수는 DB 사용자별로 1개, OPS일 경우는 Instance의 개수 만큼으로 생성하도록 한다.
.7.3이상 Version에서는 TEMPORARY Status를 설정하도록 한다.
.PCTINCREASE 는 0으로 설정하도록 한다.
.INITIAL과 NEXT의 값은 sort_area_size의 배수로 설정한다.
.7.3 Version부터 TEMPORARY Tablespace 에 생성되는 Sort Segment는 INITIAL값으로 Tablespace의 NEXT 값을 그대로 사용하게 되고, PCTINCREASE는 0, MAXEXTENTS는 UNLIMITED로 지정된다. 따라서, 임시 Tablespace에 생성되 는 Sort Segments의 EXTENT 전체 크기는 조절할 수 없으므로 Default Storage 절에서 NEXT값 설정에 주의해야 한다.
.Index 생성을 위해 사용되는 임시 tablespace의 크기는 Index Data의 2배 정도가 되어야 한다.
.OS 레벨에서 모니터링을 하고 Striping은 하지 않도록 한다.
모니터링
.일반 사용자가 올바른 임시 Tablespace를 사용하고 있는지 확인한다.
.Tablespace 내에 일반 사용자의 Object가 생성되지 않았는지 점검한다.
.Tablespace가 TEMPORARY 상태인지 확인한다.
.MAXEXTENTS UNLIMTED로 설정된 Tablesapce가 TEMPORARY Segments 를 위해 사용된다면, SMON이 해당 Segments를 Clean-up하는데?? 된다. 또한, Shutdown 작업이 지나치게 길어질 수도 있다.

라. OS 및 기타

오라클 DB는 OS 상에서 동작하기 때문에 안정적인 운영을 위해서 OS의 상태를 점검하는 것은 필수적이다. 또한, 리스너와 같은 오라클 Process들의 작동상태를 수시로 점검하여 애플리케이션 운영에 차질이 없도록 해야 한다.

1) OS
DB에 설정되어 있는 DB_FILES나 MAXDATAFILES 값이 크더라도, DB 사용자가 동시 에 접근하여 사용할 수 있는 파일의 개수는 OS에서 동시에 접근할 수 있는 파일의 개수를 넘을 수 없다.
따라서 사용 중인 Control 파일, Redo Log 파일, Data 파일, Alert.Log, Trace 파일 들의 개수를 모두 고려하여 OS에서 동시에 Open할 수 있는 파일 개수를 지정하여야 한 다. 이 값을 변경하기 위해서는 DB도 Down되어야 하기 때문에 운영 중인 시스템에서는 치명적일 수 있다.
그러므로 Disk나 Controller에 문제가 없는지 자주 확인하고, OS 모니터링이 제대로 동 작하고 있는지도 확인한다.

2) 기타
SQL*NET의 상태를 확인한다. Listener의 Process가 Running상태인지 확인하려면 다 음의 명령어를 사용할 수 있다.

마. 권한 관리

1) Unauthorized Object Owner

단지 SYS, SYSTEM, DB Administrators, 애플리케이션 소유자 계정들만이 운용 DB 시스템상의 Oracle Objects를 소유해야 한다. 개발자 계정은 또한 개발 DB 시스템상의 Object를 소유해야 한다. Object 소유권은 소유 Object에 대한 전체 권한을 의미한다. Database Object 소유자 계정이 인가된 Application 소유자 계정인지에 대해 확인한다. 다음은 새로운 Default Object 소유자 계정을 확인하는 스크립트이다.

2) Active Schema Owner Account

Application Schema Owner 계정은 업데이트와 유지보수 업무를 제외하고는 사용에 제 한을 두어야 한다. Application Schema Owner 계정은 모든 Application Objects에 모든 접근이 가능하다. Application Schema Owner 계정의 사용에 제한을 두는 것은 Application Objects에 추가적인 보안을 제공한다. Application Objects를 소유하고 있는 DB 관리자 계정은 만약 관리자 계정이 애플리케이션에 의해 사용되지 않는다면 사용 을 제한할 필요는 없다.
또한, DB 관리자 계정은 매일 반복되는 특별한 작업에 대해 할당해서는 안된다. 인가된 DBA 계정 리스트나 ISSO에서 제공하는 인가된 DBA 리스트를 얻기 위해서 D03440을 살펴 봐야 한다. DB 관리자간의 상호연동을 위해 각 DBA에 할당된 임의의 DBA 계정은 무관하지만 임의의 다른 계정들의 리스트가 있는지를 확인한다. 다음은 이를 위한 스크립트이다.

3) Oracle Predefined Roles Oracle Predefined Role은 Application Role, Application 사용자 또는 애플리케이션 관리자에게 부여되지 않는다. Application 사용자는 자신의 업무를 수행하기 위한 최소 한의 권한만을 받아야 한다. Oracle Predefined Role은 오라클 업무 기능을 위한 오라클 에 의해 정의된다. Customer Defined Role은 RDBMS에 의해서 생성되고 사용된다. 다음은 이를 위한 스크립트이다.

4) Developer Account Privileges on Production Databases

운용 DB 시스템 또는 공유된 운용·개발 DB 시스템에서 개발자에게 Create, Alter, Drop 와 같은 DBA 권한을 할당해서는 안된다. 운용 환경에서 테스트되지 않은 Objects를 통제 되지 않은 Introduction은 DB 시스템의 알려지지 않은 취약점을 알려줄 수 있고 시스템 자원의 경쟁이 생길 수 있다.
다음 스크립트의 실행 결과로 리스트된 모든 계정들이 인가된 DBA 계정인지와 애플리케 이션 개발자 계정이 아닌지를 확인하기 위해서 운용 DB 시스템상에서 Create, Alter, 또 는 Drop Privilege가 부여된 계정 및 Role의 리스트를 확인한다.

5) Access to System Tables/DBA Views System Tables과 DBA View는 사용자 정보, 시스템 정보, 그리고 데이터 정보와 같은 비인가된 접근을 불러 올 수 있는 정보를 포함하고 있다. SYS 소유의 오브젝트에 직접 접 근할 수 있거나 DBA view (DBA_%)로 접근이 가능한 일반 계정에 부여된 권한을 전부 해 지해야 한다.
다음 스크립트의 실행 결과로 리스트 된 계정에 대해 인가가 되었는지를 확인해야 한다.

6) Roles Assigned to PUBLIC Application Role은 PUBLIC에 부여되며, PUBLIC에 부여된 권한은 DB의 모든 사용자 에게 부여된다. Custom Role은 Application 권한을 특정 애플리케이션 사용자 그룹에 할당하기 위해 사용된다.
다음 스크립트의 결과값을 통해 Public으로 부여된 Role을 확인할 수있다.

7) SYSDBA Privilege Assignments

DBA의 권한을 가지는 SYSDBA의 권한의 사용을 제한해야 한다. SYSDBA 권한은 사용 자에게 DB를 구동하고, 종료시키고, DB를 재설정할 수 있다. 'as sysdba'로 DB에 접속 하게 되면 SYS 스키마안에서 SYS 사용자 권한으로 DB에 연결된다. Oracle의 감사기능 은 SYS 사용자에 의한 실행을 감사하지 못한다. 따라서, SYSDBA 권한을 가진 계정을 엄 격히 관리해야 한다.
인가된 DBA 계정 이외에 SYSDBA 권한을 가진 계정의 인가여부를 확인한다.
다음img src="/publishing/img/knowledge/111221_dqc218.jpg">

8) System Privilege Assignments

시스템 권한은 DB와 DB 오브젝트에 대한 광범위한 변경을 허용한다. 변경 작업에는 테이 블, 뷰, 롤백 세그먼트, 그리고 프로시저의 생성, 삭제, 수정이 해당된다. 이러한 시스템 권한은 DBA나 인가된 사용자 계정에게 제한해서 부여해야 한다.
이를 위해 시스템 권한이 부여된 DBA가 아닌 계정과 Role의 리스트를 검토해야 한다. 또 한, 운용 DB상에서 Create User, Alter User, Drop User가 리스트되는 임의의 계정이 인가된 애플리케이션 관리 롤에 포함되어 있는지를 확인해야 한다. 개발 시스템에서는 개 발자에게 할당된 시스템 권한이 ISSO에 의해 공정하고 인가되었는지를 확인해야 한다. 다음 스크립트의 실행 결과를 통해 비인가된 사용자 계정이나 애플리케이션 사용자 롤이 있는지 확인한다.

9) DBA Includes Non-default Account

DBA Role은 매우 강력하다. 그래서 DBA로의 접근은 제한되어야 한다. DBA Role이 부 여된 임의의 Database 계정이 ISSO에 의해 명백하게 인가되었는지를 검증해야 한다. 비 인가된 계정이 DBA Role에 대한 접근 및 Database Objects에 대한 접근할 수 있다는 것 은 서버 시스템에 대한 모든 접근을 제공할 수도 있다는 것이다. 따라서, DBA 계정들이 DBA 각각에 의해 만들어졌는지와 DBA 계정들이 단지 DBA 기능을 수행하기 위해 사용 되고 있는지를 검증해야 한다.
다음은 인가된 DBA 계정을 확인하는 스크립트이다.

10) With Grant Option

GRANT OPTION을 가진 Object 권한이 있는 사용자는 다른 사용자에게 그가 소유한 오 브젝트의 권한을 부여할 수 있다. 모든 권한을 반드시 롤을 통해서만 부여되어야 한다. 다음은 이를 확인하기 위한 스크립트이다.

11) Role Permissions

기능적인 롤(Role)은 할당된 기능을 수행하는 사용자 계정에 대하여 요청되어지는 최소한 의 오브젝트(Object) 권한을 정의하고 할당하여야 한다. 최소한의 권한에 제한적인 접근 을 하기 위해서는 실행되는 프로시져에 권한을 부여해야 한다. SELECT, EDLETE, 그리고 UPDATE 오브젝트의 권한은 제한적일 필요는 없다. 그러 나 ALTER, INDEX, 그리고 REFERENCE 오프젝트의 권한은 시스템 사용자에게만 권 한을 부여해야 하며 애플리케이션 유저에게는 권한을 부여해서는 안된다. 다음은 ALTER, INDEX, REFERENCE 권한을 할당받은 계정의 인가 여부를 확인하는 스크립트이다.

12) Restricted PL/SQL Packages

UTL_FILE, UTL_SMTP, UTL_TCP, UTL_HTTP, and DBMS_RANDOM PL/SQL 패키지는 다양한 보안상의 취약점들이 소개되고 있다. 그러므로 이러한 패키지에 대한 접 근은 제한적이어야 한다.
다음은 UTL_FILE, UTL_SMTP, UTL_TCP, UTL_HTTP, and DBMS_RANDOM PL/SQL 패키지가 PUBLIC에게 EXECUTE 권한이 부여되었는지 확인하기 위한 스크립 트이다.

13) Privileges Granted With Admin

오라클 시스템의 권한은 직접적으로 부여되는 것이 아니라 롤(Role)을 통해서 부여된다. 롤을 통한 권한의 부여는 DB에 대한 관리적 제어와 효율성을 향상시킨다. 다음은 인가된 DBA 계정 이외에 admin_options='YES' 인 계정의 인가 여부를 확인하는 스크립트이다.

14) PUBLIC System Privileges

시스템 권한은 사용자 그리고 롤에 부여될 수 있으며 사용자 그룹 PUBLIC에 부여될 수 있 다. PUBLIC으로 부여된 모든 권한은 DB안에 있는 모든 사용자들에게 접근을 허용한다. 일반적으로 이러한 권한은 롤에 부여되며 따라서 적당한 롤을 사용자들에게 부여해야 한 다. 시스템 권한은 결코 PUBLIC 계정에 부여해서는 안된다. 왜냐하면 일반 사용자들이 DB에 침투하는 것을 허용할 수 있기 때문이다.
다음은 PUBLIC 계정에 시스템 권한을 부여되었는지를 확인하는 스크립트이다.

15) Roles Granted With Admin

Database 롤에 부여된 권한은 인가된 DBA와 Application Administrators로 제한되어 야 한다. 다음은 인가된 DBA 계정들인지 또는 Application Administrator 롤인지를 확인한는 스크립트이다.

16) Replication Account Use

Replication을 지원하기 위해 사용된 계정은 인가된 DBA의 접근만 가능하도록 제한해 야 한다.

Replication을 위해 Replication Administrator, Replication Propagator, Replication Receiver 3가지 롤 형태가 있다. 일반적으로 모든 롤은 단일 사용자 계정 에 의해 수행된다. Replication 계정(Default는 REPADMIN, 변경가능)이 단지 ISSO에서 리스트된 인 가된 사용자로 제한되어 있는지 DBA와 인터뷰한다. 그렇지 않다면 Finding이다. 그리 고 하나 이상의 계정이 있는 경우에는 해당 계정들이 공정한지를 확인한다.

17) Database Demonstration Objects

데모 계정과 Object는 DB 시스템에서 제거해야 한다. DB 데모 계정과 애플리케이션은 취약점을 가지고 있어서 운용 DB 시스템상에서는 필요하지 않다. 다음 스크립트 결과에 의해 리스트된 계정들은 제거되어야ledge/111221_dqc229.jpg">

18) Account Permissions

계정에 권한을 부여하는 것은 실수를 유발할 수 있고 이러한 실수를 반복될 수 있다. 기능 별로 할당된 권한을 그룹으로 관리하는 롤을 사용해야 한다. 이를 통해 잘못된 권한을 할 당할 가능성이 줄어든다. 롤에 권한을 할당하고 롤을 계정에 부여해야 한다. 이를 위해 다음 스크립트의 실행 결과값이 있는지 확인한다. 결과값에 대해서는 DBA와 인터뷰를 한다.

19) Default Accounts and Passwords

오라클 DB 시스템은 몇 가지 잘 알려져 있는 기본 계정과 디폴트 패스워드가 있다. 이 러한 기본 계정 및 패스워드는 서버 시스템에 비인가된 접근을 허용할 수 있게 된다. 따 라서, 이러한 기본 계정을 사용하지 않을 경우에는 계정을 잠그고 기간을 만료 시켜야 한다.
기본 계정 중에 연결이 되는 계정이 있는지 확인해야 하며 발견된 기본 계정에 대해 DBA와 인터뷰해야 한다.

바. 패스워드 관리

1) Password Life Time

PASSWORD_LIFE_TIME 값은 패스워드가 파기되는 시점을 의미한다. PASSWORD_ LIFE_TIME 값의 설정으로 사용자들이 패스워드를 변경하고 있는지 확인할 수 있다. PASSWORD_LIFE_TIME은 사용기간으로 설정할 수 있다. 또한, UNLIMITED로 설정 하면 영구히 사용할 수 있으며 디폴트 프로필에 지정된 값을 사용할 수도 있다. PASSWORD _LIFE_TIME 값을 UNLIMITED 로 두는 것은 사용자가 현재 설정된 패스워드를 영원히 사용하는 것을 허용하게 된다. 이러한 설정은 프로필에 설정되며 계정과 연관된다. 다음 스크립트를 실행하여 패스워드의 사용기간을 확인한 결과에 대해 DBA와 인터뷰해 야 한다.

2) Password Reuse PASSWORD_REUSE_MAX값은 패스워드를 다시 사용하기 전에 패스워드를 바꿔야 하 는 횟수를 나타낸다.
PASSWORD_REUSE_MAX 값은 DEFAULT로 설정할 수 있고 UNLIMITED로 설정할 수도 있으며 특별한 숫자로 설정할 수 있다. 이러한 설정은 DEFAULT 프로필 안에 나타 난다. 이러한 DEFAULT 프로필은 각 계정에 대해 설정해야 한다. PASSWORD_REUSE_MAX는 PASSWORD_REUSE_TIME와 배타적이다. 만약 PASSWORD_ REUSE_MAX를 설정하였다면, PASSWORD_REUSE_TIME는 같은 프로필 안 에 UNLIMITED로 설정해야 한다.
PASSWORD_REUSE_MAX의 최대 허용치는 '10'이며, PASSWORD_REUSE_TIME 값의 최대 허용치는 365일이다.
PASSWORD_REUSE_MAX 값과 PASSWORD_REUSE_MAX 값이 설정되어 있는지를 확인한 후 각 값이 허용치를 넘지 않았는지를 확인한다. 다음은 이를 위한 스크립트들이다.

3) Password Verify Function

PASSWORD_VERITY_FUNCTION의 값은 프로필에 할당되어 있는 사용자가 DB에 로 그인할 때 패스워드를 확인하는데 사용되는 PL/SQL의 함수값이다. 이 기능은 PL/SQL 을 통과하기 위해 필요한 패스워드를 검증하기 위해 사용될 수 있다. 이러한 기능은 반드 시 프로필이 적용되는 DB가 지역적으로 실행될 때 가능하다. 오라클은 이를 위해 디폴틀 스크립트(utlpwdmg.sql)을 제공한다. 그러나 오너는 오너의 함수를 생성할 수 있다. 패스워드 검증 함수의 소유권은 반드시 SYS여야 한다. PASSWORD_VERIFY_FUNTION 파라미터 기본값은 NULL이다. 이는 패스워드 검증 없이 수행됨을 의미한다. 다음 스크립트를 통해 PASSWORD_VERITY_FUNCTION의 값이 UNLIMITED나 NULL인지 확인할 수 있다.

4) REMOTE_LOGIN_PASSWORDFILE

EXCLUSIVE로 설정된 REMOTE_LOGIN_PASSWORDFILE은 SYS계정으로 로그인 하는 DBA에 대해 감사를 실시한다. 만약, EXCLUSIVE로 설정되어 있지 않다면 'internal' 이나 'SYSDBA'의 연결에 대해 로그를 남기지 않는다.
다음 스크립트를 통해 REMOTE_LOGIN_PASSWORDFILE의 값이 EXCLUSIVE로 설 정되었는지를 확인한다.

5) Database Link Password Encryption

오라클의 설정 파라메터인 DBLINK_ENCRYPT_LOGIN은 암호화된 패스워드를 사용하 여 원격지의 오라클 DB에 접속하는 파라미터이다.
오라클 7.2 버전 전에는 네트워크를 통해 패스워드가 전달될 때 암호화되지 않았다. 오래 된 서버에 연결하는 수단으로 오라클은 연결이 실패된 서버에 대해 암호화되지 않은 패스 워드를 사용하여 재연결을 시도할 때 이 파라미터를 사용한다. 만약, DBLINK_ENCRYPT_LOGIN 파라미터가 TRUE이면 커넥션은 실패할 것이고 다 시 연결을 시도하지 않는다. 만약 이 파라미터가 FALSE이면 처음 연결은 실패할 것이지 만, 오라클은 계속해서 암호화되지 않은 패스워드를 사용하여 연결을 시도할 것이다. DBLIKE_ENCRYPT_LOGIN 파라미터가 FALSE로 설정된 서버는 링크된 서버 사이에 암호화된 패스워드를 주고 받는다. 오라클 9i이후의 버전에서 이 파라미터는 TRUE로 기 본 설정되어 있다. 이 파라미터를 오라클 9i의 init.ora 파일에 추가하면, 에러 메시지들 을 볼 수 있다.
다음은 DBLINK_ENCRYPT_LOGIN의 파라미터 값이 'TRUE'인지를 확인하는 스크립트이다.

사. 환경설정

1) Audit Table Ownership

Audit Table은 SYS, SYSTEM 또는 이와 유사하게 보호받고 제한되고 접근이 문서화되 어 있는 DB 계정의 소유이어야 한다. Audit Table Ownership은 Audit Table에 비인가 된 접근을 막는데 도움을 준다.
Audit Table 소유자 계정이 단지 ISSO에서 리스트된 인가된 사용자로 제한되고 있는지 DBA에게 알아본다. 아울러, Audit Table 소유자 계정이 Audit Data의 검토 및 유지보 수 이외의 접근을 차단하고 있는지도 확인한다.

앞의 스크립트를 수행한 결과값이 'DB' 가 아니면 Audit Table을 사용하지 않는 것이다. 만약, 결과값이 'DB'이면 다음 스크립트를 실행한다.

앞의 스크립트를 수행한 결과, 리스트 된 소유자 계정이 'SYS' 또는 'SYSTEM' 이 아니라 면 해당 계정에 대해 검증한다.

2) Oracle Instance Names

DB 인스턴스 이름에 버전 숫자를 사용하는 것은 차후의 업그레이드에 있어 인스턴스 이름 의 사용을 제한하게 된다. 운용 DB의 DB 인스턴스 이름의 변경은 불필요한 관리적 부하 를 야기할 수 있고 보안 네트워크 설정에 침해가 발생할 수 있다. 다음은 결과값의 첫 부분이 숫자이거나 혹은 오라클의 릴리즈 번호인지를 확인하는 스크 립트이다.

3) Oracle Control Files

Control Files는 DB의 물리적 상태를 정의하는 바이너리 형식의 파일로 다음과 같은 정 보가 저장되어 있다.
DB 명(SID : System ID)
DB 파일과 REDO 로그파일명
현 로그 순서 번호(Log Sequence number)
체크 포인트 정보
Control Files가 손상되면 DB의 기동이 불가능하다. 여러 개의 컨트롤 파일(물론 각각의 내용은 동일하다.)을 지정하여 손상에 대비하는 것이 일반적이다. 하나의 물리적 디스크 나 RAID 디스크상에는 하나의 오라클 Control 파일이 존재한다. 따라서, 물리적으로 분 리된 여러 개의 디스크에 오라클 Control 파일을 준비하는 것이 필요하다. 다음을 통해 물리적으로 분리된 두개 이상의 디스크에 오라클 Control 파일이 있는지 확 인할 수 있다.

4) Oracle Redo Log Files

두 개 이상의 Redo Log 파일이 있는 Oracle Redo Log 그룹을 둘 이상 생성하는 것은 바 람직하지 않다. 다음을 통해 오라클 Redo Log 그룹이 둘 이상 나오는지 확인할 수 있다.

5) SQL*Plus HOST Command

SQL*PLUS에서는 OS의 명령어를 사용할 수 있다. 따라서, HOST 명령어는 권한이 있 는 사용자로 제한해야 한다. 다음은 SQL*PLUS에서 OS 명령어의 실행이 인가된 사용자로 제한되어 있는지 확인하는 스크립트이다.

6) Audit Trail Location

오라클의 감사는 DB 또는 OS 파일의 감사 자료를 기록하도록 설정할 수 있다. DB에 대해 서 기록된 이벤트들은 뷰를 통해 OS 사용자에게 제공된다. Audit를 사용하는 경우에 audit_trail의 값은 TRUE, DB, OS로 설정되어야 하며 NONE 으로 설정하면 audit_trail을 사용하지 않게 된다. 다음을 통해 audit_trail의 값이 NONE인지를 확인한다. 만약, 파라미터값을 변경하면 DB를 재실행해야 한다.

7) Audit Table Permissions

Audit Table에 대한 권한은 Audit Table에 접근하는 계정들을 제한한다. 과도한 권한의 부여는 Audit Trail Data를 함부로 수정할 수 있게 된다. 계정들에게 단지 Audit Data 가 저장된 테이블(SYS.AUD$)에서 select, insert, delete 또는 update 기능을 수행할 수 있는 권한이 부여되었는지 점검해야 한다.
다음 스크립트를 통해 리스트된 계정들이 인가된 DBA 계정들인지 또는 제 3의 Audit 모 니터링 계정 문서에 등록되었는지를 확인할 수 있다.

8) Idle Time Resource Usage Limit

Idle Time Resource 사용 설정은 하나의 세션에서 허용될 수 있는 최대 Idle Time을 제 한해야 한다. Idle Time은 하나의 세션에서 비활성 시간(분으로 표시)의 간격이다. 실행 시간이 긴 쿼리나 다른 작업들은 이러한 제한이 필요하지 않다. Idle Time Resource Usage 제한 설정은 사용자가 그들의 자리에서 이탈할 때 애플리케이션을 열어두는 것을 막는다.
다음의 스크립트를 통해 리스트 된 Idle time이 60분 이상으로 나오면 애플리케이션 사용 자에게 어떤 프로필이 할당되었는지 확인할 수 있다.

9) Failed Login Attempts

FAILED_LOGIN_ATTEMPTS 값은 로긴 시도의 횟수를 제한하는 값으로 제한된 로긴 시도횟수 이후에는 계정이 잠기게 된다. 이 값을 설정함으로써 비인가된 사용자가 패스워 드를 추측하게 하는 것을 방지할 수 있다.
다음 스크립트를 통해 FAILED_LOGIN_ATTEMPTS의 값이 UNLIMITED나 NULL로 설정되어 있는지 확인할 수 있다.

10) Trusting Remote OS Authentication Setting

REMOTE_OS_AUTHENT 값이 TRUE로 설정되어 있으면 안전하지 않는 커넥션을 통한 원격지의 OS의 인증을 허용한다. 원격지 OS를 신뢰하는 것은 원격지 OS의 사용자인 것 처럼 속이는 사용자를 허용?용한다. 따 라서, 설정 값은 FALSE로 설정해야 한다. 만약, 설정 값을 변경하게 되면 DB를 재시동 해야 한다.
다음 스크립트를 통해 REMOTE_OS_AUTHENT 값이 FALSE인지 확인할 수 있다.

11) Trusting Remote OS for Roles Setting

REMOTE_OS_ROLES가 TRUE이면 OS의 그룹들이 오라클의 롤을 조절할 수 있다. 만 약, FALSE 값이면 롤은 DB 시스템에 의해 관리되고 인식된다. REMOTE_ OS_ROLE이 TRUE로 설정된다면 원격 사용자는 네트워크가 연결된 상태에서 다른 OS 사용자 역할을 할 수 있다. 따라서, REMOTE_OS_ROLES의 값은 FALSE로 설정되어야 한다. 다음 스크립트를 통해 REMOTE_OS_ROLES의 값이 FALSE인지 확인할 수 있다.

12) Oracle SQL92_SECURITY

SQL92_SECURITY 파라미터의 설정은 해당 참조 테이블 열값의 갱신 또는 삭제를 실행 하는 데 테이블 수준 SELECT 권한이 필요한지 여부를 지정한다. 만약, 이 옵션이 TRUE 로 설정되어 있으면 갱신 권한이 실행될 때 SELECT 권한을 사용할 수 있다. 다음 스크립트를 통해 SQL92_SECURITY가 TRUE로 설정되어 있는지 확인할 수 있다.

13) UTL_FILE_DIR Setting

UTL_FILE 패키지는 오라클 DB 프로세스나 서비스가 호스트 파일에 접근하는 것을 허용 한다. 이 패키지가 사용할 수 있는 모든 파일들은 데이터 베이스의 UTL_FILE 실행 권한 이 있는 어떠한 DB 사용자도 사용할 수 있기 때문에 주의해서 사용해야 한다. UTL_FILE_DIR 값이 '*'로 설정되어 있으면 오라클 DB 프로세스는 UTL_FILE 패키지 를 통해 모든 디렉토리에 접근할 수 있다. UTL_FILE_DIR 리스트는 보호해야 할 디렉토 리와 권한을 부여해야 할 디렉토리를 명확히 기술해야하며 경로명을 전부 포함해서는 안 된다.
UTL_FILE PACKAGE를 통해 모든 디렉토리에 대해 읽고 쓰기가 가능하도록 설정되어 있는지 확인한다. 만약, 결과값으로 '*'가 나오면 모든 디렉토리가 접근 가능한 것이므로 설정을 변경해야 한다.

14) Data Dictionary Accessibility

SELECT ANY TABLE 권한을 갖는 계정이 암호화된 패스워드와 같은 Data Dictionary Table에 있는 중요한 데이터에 접근을 제한하고 있는지를 확인한다. 이 기능은 오라클 8에서 07_DICTIONARY_ACCESSIBILITY 파라미터를 통해 제공된 다. 만약, 이 파라미터 값이 FALSE이면 Data Dictionary 내에 있는 민감한 정보에 접근 하는 것을 제한한다.
다음 스크립트를 통해 07_DICTIONARY_ACCESSIBILITY 값이 FALSE인지를 확인할수 있다.

15) Database Link Permissions

Database Link 패스워드는 SYS.LINK$ 테이블에 암호화되지 않은 상태로 저장이 되는 데, 이 테이블에 대한 접근은 제한되어야 한다.
이를 위해 다음 스크립트의 수행 결과값이 있는지를 확인한다.

16) Resource Limits Not Enabled

RESOURCE_LIMIT 파라미터는 DB 프로파일에 리소스 제한의 강제 수행 여부를 결정한 다. FALSE값으로 설정하면 리소스 제한의 강제 적용을 비활성화하고, TRUE값으로 설 정하면 리소스 제한의 강제 적용을 활성화한다. RESOURCE_LIMIT 파라미터의 기본값 은 FALSE이다. 이 값은 패스워드 리소스에는 적용되지 않는다.
다음 스크립트를 통해 RESOURCE_LIMIT 의 설정이 'TRUE'로 설정되어 있는지를 확인 할 수 있다.

17) Current Oracle Version

다음은 현재 DB 시스템의 버전을 확인하는 스크립트이다.

5. DB 취약점 체크리스트(Oracle 기반)

모든 DBA는 오라클이 안정적으로 운영되고 문제발생 시에 해당 원인을 찾아 신속히 대처 해야 할 임무를 갖는다. 이를 위해서 사전에 발생할 수 있는 문제들이 어떠한 것이 있는지 파악하고 있어야 하며, 일단 문제가 발생하였을 경우 오라클 운영 환경을 점검하여 빠른 시간 내에 문제를 해결할 수 있어야 한다.

본 가이드라인은 오라클 운영 중에 고려해야 할 다양한 항목들을 제시하고 있다. 오라클 운영 중 고려해야 할 항목은 크게 DB 전체와 DB를 구성하는 FILE 및 TABLESPACE 종 류 별로 백업, 설정, 모니터링 등의 측면을 구분하여 각각 점검할 사항들을 제시한다. 각 구성요소별 백업, 설정, 모니터링 등의 측면에서 살펴보고, 이것을 업무에 적용함으로 써 오라클 운영과 문제상황에 대해 효과적으로 대처할 수 있다.

가. Database

1) 백업
백업(Backup)에 사용될 테이프와 같은 장비상태가 불안정하다고 판단될 때는 절대로 사용하지 말아야 한다. 또한, 백업된 정보는 즉시 확인할 수 있어야 한다. 즉, 어느 파 일이 어느 백업 위치에 있는지 바로 알 수 있어야 것이다.
시스템 가동 시점에서 백업 절차 전체에 대한 테스트를 수행한 후, 해당 결과를 확인하 여 변경할 사항들이 있는지 확인하여야 한다.
백업 되는 파일 이름은 날짜, 업무 등의 정보를 포함시켜서 나중에 보더라도 알기 쉽도 록 지정한다.
3개월 단위마다 정기적으로 백업을 이용한 복구 테스트(Recovery Test)를 실시한다.

2) 설정
가장 최신의 오라클 패치를 적용하여 시스템이 안정적으로 운영될 수 있도록 해야 한다.
DB_FILES 값의 설정에 주의해야 한다. 이 값을 초과하여 추가 하려고 할 때는 에러가 발생하게 되고, 이러한 상황에서 DB_FILES를 변경하게 되면 DB는 종료(shutdown) 후에 다시 시작(start)되어야 한다.
ENQUEUE_RESOURCES는 OS의 Lock Resource를 조절하는 역할을 한다. 이 값 이 너무 낮게 설정되어 있게 되면 특정 애플리케이션에서 Time Out이 발생하게 된다.
DML_LOCKS값은 Object에 대한 작업을 하는 모든 사용자를 고려하여 최대한 크게 설 정한다. 이 값이 부족하게 되면 애플리케이션에서 에러가 발생하게 된다.
DB를 재생성할 경우에 대비해서 그 절차를 숙지하고 있어야 한다. 그렇지 않으면 소요 작업시간이 길어지게 된다.

3) 모니터링
Alert.log와 Trace 파일의 내용을 점검하여 에러가 없는지, Archive나 Checkpoint 에 대한 Waiting이 발생하지 않았는지 등을 점검한다. 이 파일들을 이용하여 오라클 Internal Error나 다른 Error 정보를 얻을 수 있다.
*_dump_dest의 Free Space여부를 확인한다. InitSID.ora나 configSID.ora에 *_dump_dest가 설정되어 있다. 특히, Alert Log 는 계속 늘어나게 되므로 일정한 크 기가 되었을 때 백업을 받고, Background_dump_dest의 Free Space를 수시로 점검 하여 Space 문제가 발생하지 않도록 주의한다.
Tablespace별로 성장속도를 확인한다. 이렇게 하면 Space 부족으로 발생할 수 있는 DB Hang 문제를 미리 대비할 수 있게 된다.
Utlbstat.sql / utlestat.sql으로 DB 상태를 정기적으로 점검하여 시스템에 대한 통계 정보를 기록해 둔다. 이 자료는 튜닝을 위한 기초자료가 된다.
각 Tablespace에 대해 Fragmentation을 점검한다. Fragmentation이 많이 발생하 여 Free Space가 부족하다면 Coalesce를 수행하거나 Data File을 추가하도록 한다. Disk Space가 거의 존재하지 않는다면 Export를 받은 후 다시 Import를 실시한다.
InitSID.ora 파일에 변경이 있을 때 마다 그 이력(History)를 기록해 둔다. 이렇게 하 면 Parameter의 변경으로 발생하는 문제를 대처할 수 있고, 성능(Performance)의 변 화도 알 수 있다.

나. Database 구성 File

오라클 DB를 구성하는 파일들은 Control 파일, Online Redo Log 파일, Archive Log 파일, Data 파일 등으로 나누어진다. 각각의 파일들은 DB 운영을 위해 중요한 정보들을 포함하고 있으므로 수시로 상태를 점검하여야 한다.

1) CONTROL 파일
백업
?정기적으로 백업을 받도록 한다. Cold Backup일 경우에는 Control 파일자체를 복 사하여 백업을 받고 DB가 운영중일 경우는 다음 명령어를 이용하여 파일을 백업받 도록 한다.

.Data 파일과 Redo Log 파일의 추가나 삭제 등의 원인으로 DB에 변경사항이 있을 때마다 백업 받도록 한다.

.Hot Backup시 End Backup이 발생할 때마다 백업을 받도록 한다.
.백업받은 파일 이름에 날짜와 업무정보 등을 포함시켜 쉽게 알아볼 수 있도록 한다.

설정
.MAXDATAFILES 값은 예상치보다 크게 설정하여야 한다. 디폴트 값은 플랫폼 (Platform)별로 다르게 지정된다. InitSID.ora에서 DB_FILES가 크게 설정되어 있더라도 MAXDATAFILES 값이 너무 작으면, DB에서 동시에 Open할 수 있는 Datafile의 개수는 MAXDATAFILES 값을 넘을 수가 없게 된다. 이 값을 변경하기 위해서는 Control 파일을 재생성해야 한다.
?별도의 디스크와 콘트롤러가 사용되도록 물리적 위치를 지정한다.
?*.ctl과 같이 알기 쉬운 이름을 사용하도록 한다.
?최소 3개가 사용되도록 해야 한다.
?MAXLOGFILES 값을 확인하여 예상치보다 크게 설정하도록 한다.
?MAXLOGMEMBERS 값이 3이상이 되도록 설정한다.
?OPS의 경우 MAXINSTANCES값을 예상치보다 크게 설정하도록 한다.
?MAXLOGHISTORY는 저장될 Log History정보의 양을 지정하므로, Log File이 생성되는 추이를 파악하여 적절한 값을 지정하여야 한다.
?OS 레벨에서 모니터링이 되어 있는지 확인하고 Striping은 하지 않도록 한다.

2) ONLINE REDO LOG 파일
백업
?Hot Backup시에는 End Backup 이후에 'archive log list' 명령어를 수행하여 현재 Log Sequence Number를 먼저 확인해야 한다. 그리고 나서 다음 명령어를 수행하여 Archive를 추가로 생성한 후, 앞서 확인한 Sequence Number까지 Archive Log를 백업 받으면 된다.

?Hot Backup시에는 Archive Log 파일이 Backup되었으면 Online Redo Log는 백업받을 필요가 없다.
?Cold Backup시에는 Restore 할 때의 실수를 방지하기 위하여 주요 DB 파일, 특히 Archive Log 파일과는 다른 위치에 백업을 받는다.
설정
?OPS일 경우 Instance Recovery를 위해서 Log의 모든 Member는 동시에 Access 가 가능하여야 한다.
?각 그룹의 Member들은 Disk와 Controller를 별도로 사용하도록 지정한다.
?Redo의 Thread는 Instance당 1개를 설정하여야 한다.
?Redo Log Group은 최소 3개 이상이 되도록 하고, 각 그룹들은 최소 2개 이상의 Member를 가지도록 한다. 이렇게 Log Mirroring을 하게 되면 돌발적인 파일 삭 제 상황에 대비할 수 있게 된다.
?Redo Log Member의 Size는 Checkpoint에 대한 Waiting이 발생하지 않도록 충 분한 크기를 지정하여야 한다. 사이즈(Size)가 너무 작을 경우에는 잦은 Log Switch 로 인하여 복구 시간이 지나치게 많이 소요될 수 있다.
?Redo Log Member의 사이즈는 모두 같게 한다.
?DB 파일과 다른 물리적인 위치를 지정하도록 한다.
모니터링
?Checkpoint 주기를 점검하도록 한다. 권장할 만한 Checkpoint의 주기는10-15분 정도이다. LOG_CHECKPOINT_INTERVAL을 가장 큰 Redo Log File Size보다 크게 설정하고 LOG_CHECKPOINT_TIMIEOUT을 0으로 설정하게 되면, Log Switch가 일어날 때마다 Checkpoint가 발생하게 되므로 Log File Size 변경을 통 해 Checkpoint 주기를 조정할 수 있게 된다.
잦은 Checkpoint는 Crash 복구 시간은 줄여주지만, Dirty Buffers를 자주 사용하 고 File Headers를 자주 업데이트하게 되어 Overhead를 일으키게 된다. ?Log Switch가 너무 자주 발생하지 않는지 점검한다. Log Switch는 15분 정도 주 기가 적당하다. Log Switch가 너무 자주 발생하면 v$backup을 통해 Hot Backup 상태인 파일이 있는지도 확인한다.
?V$logfile을 통해 Status를 수시로 점검한다. Status가 Invalid나 Stale이 없는지 확인해야 한다.
3) ARCHIVE LOG 파일
백업
?모든 Archive Log가 빠짐없이 백업에 포함되었는지 점검한다. 또한, V$LOG에서 Archived, Status 칼럼을 참조하여 Archive가 완전이 끝난 Log 파일을 백업해야 한다.
?OPS일 경우에는 모든 Thread에서 생성되는 Archive를 전부 백업해야 한다.
?백업된 Archive Log 파일의 Sequence Number가 연속되어 있는지 확인해야 한다.
?Archive Log 파일이 특정 Threshold에 도달할 때마다 백업해야 한다. 가능하다면 매일 백업을 받는 것이 좋다.
?백업된 Archive 파일들은 삭제하도록 한다. 그러나 Disk의 공간을 충분히 하여 최 소한 하루의 Archive Log들은 백업을 받았더라도 삭제하지 않도록 한다. 이것은 장애 시에 복구 시간을 줄이는 역할을 할 수 있다.
?Archived Log File의 개수는 Log 파일의 크기와 Redo의 양에 달려있다. 그리고 Redo 의 양은 Transaction의 양과 연관되어 있다. 이러한 환경을 고려하여 백업의 빈도를 결정하도록 한다.
?백업 위치별로 그 속에 포함된 Log가 어느 기간동안 생성된 것인지에 대한 정보를 기록해 두어야 한다.
?Archive Log 생성속도와 파일의 백업 속도에 대해 알고 있어야 한다.
?Main이 되는 백업 장비에 문제가 있을 것에 대비하여 즉시 사용 가능한 대체장비를 확보하고 있어야 하며, 이 대체장비는 Backup Script에 반영되어 있어야 한다.
설정
?DB가 ARCHIVELOG Mode로 운영 중인지 확인한다. 이것을 위해서는 다음 명령어 를 사용할 수 있다.

?생성되는 Archive 파일의 위치와 파일 이름 형식을 알아보기 쉽도록 지정한다. 이 것은 initSID.ora에서 LOG_ARCHIVE_DEST와 LOG_ARCHIVE_FORMAT을 통해 지정할 수 있다. LOG_ARCHIVE_FORMAT= "LOG%s_%t.ARC"으로 설정 할 경우 %s는 Log Sequence Number, %t는 Thread Number를 의미한다. 특히 OPS인 경우 %t를 설정하여 Thread별로 생성되는 Archive를 구별하여 관리하도 록 한다.
?Archive되는 위치가 Disk인지 확인한다. Tape에서 Disk로 옮기는 시간을 줄여서 복구 시간을 단축할 수 있다. 그러나 Tape에도 Archive를 복사해 두도록 한다. ?Online Redo Log와는 다른 Disk와 Controller를 사용해야 한다.
?DB 파일과는 다른 Disk와 Controller를 사용해야 한다.
?OS 레벨에서 Mirror가 되도록 하고, Striping은 하지 않도록 한다.
모니터링
?Archive 파일이 생성되는 위치에 여유 공간이 있는지 확인해야 한다. Disk에 여유 공간이 없어서 Archive Log를 생성하지 못하는 경우에는 DB Hang이 발생하게 된 다. Archive 위치에 여유공간이 얼마 남지 않았을 경우 경고 메시지를 발생시키도 록 하는 내용을 Backup Script에 포함시킨다.
?Archive와 관련된 에러가 발생하지 않았는지 Alert Log를 점검한다.
?Archived Log 파일의 Sequence Number가 순차적인지 확인한다. Log Switch 가 일어날 때마다 Sequence Number는 하나씩 증가된다.
?DB가 ARCHIVELOG Mode로 작동중인지 확인해 본다. 만약 Archive Log Mode 가 아니라면 다음과 같은 과정을 통해 Mode를 변경할 수 있다.

?ARCH Process가 움직이는지를 자주 확인한다. 이렇게 하면ARCH Process가 움 직이지 않아서 DB가 Hang이 걸리는 문제를 막을 수 있다.

다. TABLESPACE

오라클 DB를 구성하는 Tablespace에는 System Tablespace, Rollback Segment Tablespace, Data Tablespace, Temporary Tablespace 등이 있다. 각 Tablespace 는 Data를 저장하는 논리적인 공간이며, 앞에서 다룬 OS 상의 DB 관련 파일들과 긴밀하 게 연관되어 있다.

1) SYSTEM TABLESPACE
모니터링
?Free Space를 수시로 점검한다.
?Extents의 개수가 MAXEXTENTS/2 지점에 이르지 않았는지 확인한다.
?Tablespace의 size가 적정수준인지 확인한다. 일반적인 System Tablespace의 Size는 30~50M이다.
?일반사용자의 Object나 Temporary Segment가 포함되지 않았는지 점검한다.
?일반사용자에게 사용권한을 부여하지 않도록 한다.
?System Tablespace 이외의 Tablespace에서 발생하는 Extent는 Data Dictionary 의 정보를 사용하게 되므로 작은 Extent가 지나치게 많을 경우 System Tablespace 의 Space도 영향을 받게 된다.
?특별한 경우가 아니면 SYS Object의 Storage절을 변경하지 않도록 한다.
?Disk를 모니터링하고 Striping은 설정하지 않는다.
2) ROLLBACK SEGMENT TABLESPACE
백업
?Hot Backup은 DB Activity가 낮은 시점에서 실시한다.
설정
?알기 쉬운 이름을 사용해야 한다.
?일반적인 용도의 RBS의 크기는 모두 같게 한다.
?INITIAL과 NEXT는 같게 설정한다.
?PCTINCREASE는 0으로 설정한다.
?InitSID.ora에서 UNLIMITED_ROLLBACK_SEGMENTS=FALSE를 지정하여 RBS가 Unlimited Extent Format을 사용하는 것을 방지하도록 한다.
?OS 레벨에서 모니터링을 하고 Striping은 하지 않는다.
모니터링
?InitSID.ora에 RBS들이 등록되어 있는지 확인한다.
?RBS가 Online 상태인지 주기적으로 점검한다. 이 때 dba_rollback_segs를 이용 할 수 있다.
?RBS Tablespace에 다른 Object가 생성되지 않았는지 점검한다.
?RBS의 크기변동률을 점검한다. V$rollstat을 이용하면 RBS가 커지거나 줄어드는 비율과 Wait 정보를 확인할 수 있다.
?Free Space와 Fragmentation 정도를 점검한다.
?ORA-1555에러가 발생하는지 점검한다. 이 경우에 DB는 여전히 사용가능하며 Application Error가 발생할 수 있다. Data 파일을 추가하여 공간을 늘여야 한다.
?RBS당 Transaction의 개수는 4개~5개가 적절하다.
?Batch Job에만 사용되는 큰 크기의 RBS를 별도로 설정하고, OLTP용 RBS와 동시 에 Online되지 않도록 한다. 다음 명령어로 특정 RBS 사용을 지정할 수 있다.

3) DATA TABLESPACE
백업
?READ-ONLY Tablespace일 경우 쓰기, 읽기 권한 관리에 주의하여야 한다. 이러 한 변화는 Control 파일이나 Data 파일의 백업에도 영향을 미치게 된다.
?MTTR을 만족시킬 수 있는 주기 단위로 백업을 실시한다.
?Export를 이용하여 Object 레벨에서 Logical 백업을 받아두어야 한다.
?Hot Backup 시에는 해당 Data 파일의 Transaction 발생을 줄여서 Redo가 적게 발생되도록 해야 한다.
설정
?알아보기 쉬운 이름을 사용하도록 한다.
?서로 다른 Tablespace는 다른 Disk에 위치하도록 하는 것이 좋다. OS 파일이 분실 되는 것은 곧 Tablespace의 분실을 의미하므로 사전에 주의하여야 한다.
?Index Tablespace는 Data와 분리하여 사용하도록 한다.
?Fragmentation을 줄이기 위해서는 Tablespace내에 비슷한 크기의 Object들이 위치하게 하는 것이 좋다.
?OPS의 경우에는 Application별로 Tablespace를 분리하여 운영하는 것이 좋다.
?Autoextend는 비활성화로 설정하여 사용한다.
?7.3 이전 Version에서는 Block Size 별로 Tablespace의 MAX EXTENTS의 값이 제한되어 있었다. 예를 들어, Block Size가 2K일 경우는 121, 8K일 경우는 505 였다. 그러나 7.3이후 Version에서는 MAX EXTENTS값보다 더 많은 값을 직접 지정하는 것이 가능해 졌다. MAX EXTENTS 보다 더 큰 값을 사용하게 되면 새로 운 Block Format이 사용된다.
?Default Storage 절이나 생성되는 Object에 MAXEXTENTS UNLIMTED를 사 용하지 않도록 한다.
?MAXEXTENTS UNLIMITED를 설정할 수도 있으나 권장되는 설정이 아니다. UNLIMITED Extent Format을 사용하려면 COMPATIBLE의 값이 7.3.0이상으 로 설정되어 있어야 한다.
?MAXEXTENTS UNLIMITED를 설정하는 것은 해당 Tablespace의 Free Space 전체를 사용하게 될 위험이 있다. 또, MAXEXTENTS UNLIMITED가 사용될 경우 작은 Extent의 개수가 과도하게 증가하여 DROP TABLE, TRUNCATE TABLE 작업 등을 수행할 때 Space와 관련된 심각한 성능 문제를 유발할 수 있다.
.OS 레벨에서 Mirror되게 한다.
모니터링
.주요 Object에 대해서는 정기적으로 분석을 실시한다.
.문제를 조기에 발견하기 위해서 Object가 MAXEXTENTS/2에 도달했는지를 점검 한다.
.Type이 다른 Object가 동일한 Tablespace에서 혼용되지 않도록 한다.
.DBVERIFY를 사용하여 정기적으로 점검해 본다.
.Null Device에 Export하여 Logical Object의 상태를 점검해 본다.
4) TEMPORARY TABLESPACE
설정
.임시 Tablespace의 개수는 DB 사용자별로 1개, OPS일 경우는 Instance의 개수 만큼으로 생성하도록 한다.
.7.3이상 Version에서는 TEMPORARY Status를 설정하도록 한다.
.PCTINCREASE 는 0으로 설정하도록 한다.
.INITIAL과 NEXT의 값은 sort_area_size의 배수로 설정한다.
.7.3 Version부터 TEMPORARY Tablespace 에 생성되는 Sort Segment는 INITIAL값으로 Tablespace의 NEXT 값을 그대로 사용하게 되고, PCTINCREASE는 0, MAXEXTENTS는 UNLIMITED로 지정된다. 따라서, 임시 Tablespace에 생성되 는 Sort Segments의 EXTENT 전체 크기는 조절할 수 없으므로 Default Storage 절에서 NEXT값 설정에 주의해야 한다.
.Index 생성을 위해 사용되는 임시 tablespace의 크기는 Index Data의 2배 정도가 되어야 한다.
.OS 레벨에서 모니터링을 하고 Striping은 하지 않도록 한다.
모니터링
.일반 사용자가 올바른 임시 Tablespace를 사용하고 있는지 확인한다.
.Tablespace 내에 일반 사용자의 Object가 생성되지 않았는지 점검한다.
.Tablespace가 TEMPORARY 상태인지 확인한다.
.MAXEXTENTS UNLIMTED로 설정된 Tablesapce가 TEMPORARY Segments 를 위해 사용된다면, SMON이 해당 Segments를 Clean-up하는데 시간이 오래 걸 리게 되어 많은 자원을 소모하게 된다. 또한, Shutdown 작업이 지나치게 길어질 수도 있다.

라. OS 및 기타

오라클 DB는 OS 상에서 동작하기 때문에 안정적인 운영을 위해서 OS의 상태를 점검하는 것은 필수적이다. 또한, 리스너와 같은 오라클 Process들의 작동상태를 수시로 점검하여 애플리케이션 운영에 차질이 없도록 해야 한다.

1) OS
DB에 설정되어 있는 DB_FILES나 MAXDATAFILES 값이 크더라도, DB 사용자가 동시 에 접근하여 사용할 수 있는 파일의 개수는 OS에서 동시에 접근할 수 있는 파일의 개수를 넘을 수 없다.
따라서 사용 중인 Control 파일, Redo Log 파일, Data 파일, Alert.Log, Trace 파일 들의 개수를 모두 고려하여 OS에서 동시에 Open할 수 있는 파일 개수를 지정하여야 한 다. 이 값을 변경하기 위해서는 DB도 Down되어야 하기 때문에 운영 중인 시스템에서는 치명적일 수 있다.
그러므로 Disk나 Controller에 문제가 없는지 자주 확인하고, OS 모니터링이 제대로 동 작하고 있는지도 확인한다.

2) 기타
SQL*NET의 상태를 확인한다. Listener의 Process가 Running상태인지 확인하려면 다 음의 명령어를 사용할 수 있다.

마. 권한 관리

1) Unauthorized Object Owner

단지 SYS, SYSTEM, DB Administrators, 애플리케이션 소유자 계정들만이 운용 DB 시스템상의 Oracle Objects를 소유해야 한다. 개발자 계정은 또한 개발 DB 시스템상의 Object를 소유해야 한다. Object 소유권은 소유 Object에 대한 전체 권한을 의미한다. Database Object 소유자 계정이 인가된 Application 소유자 계정인지에 대해 확?? 확인하는 스크립트이다.

2) Active Schema Owner Account

Application Schema Owner 계정은 업데이트와 유지보수 업무를 제외하고는 사용에 제 한을 두어야 한다. Application Schema Owner 계정은 모든 Application Objects에 모든 접근이 가능하다. Application Schema Owner 계정의 사용에 제한을 두는 것은 Application Objects에 추가적인 보안을 제공한다. Application Objects를 소유하고 있는 DB 관리자 계정은 만약 관리자 계정이 애플리케이션에 의해 사용되지 않는다면 사용 을 제한할 필요는 없다.
또한, DB 관리자 계정은 매일 반복되는 특별한 작업에 대해 할당해서는 안된다. 인가된 DBA 계정 리스트나 ISSO에서 제공하는 인가된 DBA 리스트를 얻기 위해서 D03440을 살펴 봐야 한다. DB 관리자간의 상호연동을 위해 각 DBA에 할당된 임의의 DBA 계정은 무관하지만 임의의 다른 계정들의 리스트가 있는지를 확인한다. 다음은 이를 위한 스크립트이다.

3) Oracle Predefined Roles Oracle Predefined Role은 Application Role, Application 사용자 또는 애플리케이션 관리자에게 부여되지 않는다. Application 사용자는 자신의 업무를 수행하기 위한 최소 한의 권한만을 받아야 한다. Oracle Predefined Role은 오라클 업무 기능을 위한 오라클 에 의해 정의된다. Customer Defined Role은 RDBMS에 의해서 생성되고 사용된다. 다음은 이를 위한 스크립트이다.

4) Developer Account Privileges on Production Databases

운용 DB 시스템 또는 공유된 운용·개발 DB 시스템에서 개발자에게 Create, Alter, Drop 와 같은 DBA 권한을 할당해서는 안된다. 운용 환경에서 테스트되지 않은 Objects를 통제 되지 않은 Introduction은 DB 시스템의 알려지지 않은 취약점을 알려줄 수 있고 시스템 자원의 경쟁이 생길 수 있다.
다음 스크립트의 실행 결과로 리스트된 모든 계정들이 인가된 DBA 계정인지와 애플리케 이션 개발자 계정이 아닌지를 확인하기 위해서 운용 DB 시스템상에서 Create, Alter, 또 는 Drop Privilege가 부여된 계정 및 Role의 리스트를 확인한다.

5) Access to System Tables/DBA Views System Tables과 DBA View는 사용자 정보, 시스템 정보, 그리고 데이터 정보와 같은 비인가된 접근을 불러 올 수 있는 정보를 포함하고 있다. SYS 소유의 오브젝트에 직접 접 근할 수 있거나 DBA view (DBA_%)로 접근이 가능한 일반 계정에 부여된 권한을 전부 해 지해야 한다.
다음 스크립트의 실행 결과로 리스트 된 계정에 대해 인가가 되었는지를 확인해야 한다.

6) Roles Assigned to PUBLIC Application Role은 PUBLIC에 부여되며, PUBLIC에 부여된 권한은 DB의 모든 사용자 에게 부여된다. Custom Role은 Application 권한을 특정 애플리케이션 사용자 그룹에 할당하기 위해 사용된다.
다음 스크립트의 결과값을 통해 Public으로 부여된 Role을 확인할 수있다.

7) SYSDBA Privilege Assignments

DBA의 권한을 가지는 SYSDBA의 권한의 사용을 제한해야 한다. SYSDBA 권한은 사용 자에게 DB를 구동하고, 종료시키고, DB를 재설정할 수 있다. 'as sysdba'로 DB에 접속 하게 되면 SYS 스키마안에서 SYS 사용자 권한으로 DB에 연결된다. Oracle의 감사기능 은 SYS 사용자에 의한 실행을 감사하지 못한다. 따라서, SYSDBA 권한을 가진 계정을 엄 격히 관리해야 한다.
인가된 DBA 계정 이외에 SYSDBA 권한을 가진 계정의 인가여부를 확인한다.
다음은 이를 위한 스크립트이다.

8) System Privilege Assignments

시스템 권한은 DB와 DB 오브젝트에 대한 광범위한 변경을 허용한다. 변경 작업에는 테이 블, 뷰, 롤백 세그먼트, 그리고 프로시저의 생성, 삭제, 수정이 해당된다. 이러한 시스템 권한은 DBA나 인가된 사용자 계정에게 제한해서 부여해야 한다.
이를 위해 시스템 권한이 부여된 DBA가 아닌 계정과 Role의 리스트를 검토해야 한다. 또 한, 운용 DB상에서 Create User, Alter User, Drop User가 리스트되는 임의의 계정이 인가된 애플리케이션 관리 롤에 포함되어 있는지를 확인해야 한다. 개발 시스템에서는 개 발자에게 할당된 시스템 권한이 ISSO에 의해 공정하고 인가되었는지를 확인해야 한다. 다음 스크립트의 실행 결과를 통해 비인가된 사용자 계정이나 애플리케이션 사용자 롤이 있는지 확인한다.

9) DBA Includes Non-default Account

DBA Role은 매우 강력하다. 그래서 DBA로의 접근은 제한되어야 한다. DBA Role이 부 여된 임의의 Database 계정이 ISSO에 의해 명백하게 인가되었는지를 검증해야 한다. 비 인가된 계정이 DBA Role에 대한 접근 및 Database Objects에 대한 접근할 수 있다는 것 은 서버 시스템에 대한 모든 접근을 제공할 수도 있다는 것이다. 따라서, DBA 계정들이 DBA 각각에 의해 만들어졌는지와 DBA 계정들이 단지 DBA 기능을 수행하기 위해 사용 되고 있는지를 검증해야 한다.
다음은 인가된 DBA 계정을 확인하는 스크립트이다.

10) With Grant Option

GRANT OPTION을 가진 Object 권한이 있는 사용자는 다른 사용자에게 그가 소유한 오 브젝트의 권한을 부여할 수 있다. 모든 권한을 반드시 롤을 통해서만 부여되어야 한다. 다음은 이를 확인하기 위한 스크립트이다.

11) Role Permissions

기능적인 롤(Role)은 할당된 기능을 수행하는 사용자 계정에 대하여 요청되어지는 최소한 의 오브젝트(Object) 권한을 정의하고 할당하여야 한다. 최소한의 권한에 제한적인 접근 을 하기 위해서는 실행되는 프로시져에 권한을 부여해야 한다. SELECT, EDLETE, 그리고 UPDATE 오브젝트의 권한은 제한적일 필요는 없다. 그러 나 ALTER, INDEX, 그리고 REFERENCE 오프젝트의 권한은 시스템 사용자에게만 권 한을 부여해야 하며 애플리케이션 유저에게는 권한을 부여해서는 안된다. 다음은 ALTER, INDEX, REFERENCE 권한을 할당받은 계정의 인가 여부를 확인하는 스크립트이다.

12) Restricted PL/SQL Packages

UTL_FILE, UTL_SMTP, UTL_TCP, UTL_HTTP, and DBMS_RANDOM PL/SQL 패키지는 다양한 보안상의 취약점들이 소개되고 있다. 그러므로 이러한 패키지에 대한 접 근은 제한적이어야 한다.
다음은 UTL_FILE, UTL_SMTP, UTL_TCP, UTL_HTTP, and DBMS_RANDOM PL/SQL 패키지가 PUBLIC에게 EXECUTE 권한이 부여되었는지 확인하기 위한 스크립 트이다.

13) Privileges Granted With Admin

오라클 시스템의 권한은 직접적으로 부여되는 것이 아니라 롤(Role)을 통해서 부여된다. 롤을 통한 권한의 부여는 DB에 대한 관리적 제어와 효율성을 향상시킨다. 다음은 인가된 DBA 계정 이외에 admin_options='YES' 인 계정의 인가 여부를 확인하는 스크립트이다.

14) PUBLIC System Privileges

시스템 권한은 사용자 그리고 롤에 부여될 수 있으며 사용자 그룹 PUBLIC에 부여될 수 있 다. PUBLIC으로 부여된 모든 권한은 DB안에 있는 모든 사용자들에게 접근을 허용한다. 일반적으로 이러한 권한은 롤에 부여되며 따라서 적당한 롤을 사용자들에게 부여해야 한 다. 시스템 권한은 결코 PUBLIC 계정에 부여해서는 안된다. 왜냐하면 일반 사용자들이 DB에 침투하는 것을 허용할 수 있기 때문이다.
다음은 PUBLIC 계정에 시스템 권한을 부여되었는지를 확인하는 스크립트이다.

15) Roles Granted With Admin

Database 롤에 부여된 권한은 인가된 DBA와 Application Administrators로 제한되어 야 한다. 다음은 인가된 DBA 계정들인지 또는 Application Administrator 롤인지를 확인한는 스크립트이다.

16) Replication Account Use

Replication을 지원하기 위해 사용된 계정은 인가된 DBA의 접근만 가능하도록 제한해 야 한다.

Replication을 위해 Replication Administrator, Replication Propagator, Replication Receiver 3가지 롤 형태가 있다. 일반적으로 모든 롤은 단일 사용자 계정 에 의해 수행된다. Replication 계정(Default는 REPADMIN, 변경가능)이 단지 ISSO에서 리스트된 인 가된 사용자로 제한되어 있는지 DBA와 인터뷰한다. 그렇지 않다면 Finding이다. 그리 고 하나 이상의 계정이 있는 경우에는 해당 계정들이 공정한지를 확인한다.

17) Database Demonstration Objects

데모 계정과 Object는 DB 시스템에서 제거해야 한다. DB 데모 계정과 애플리케이션은 취약점을 가지고 있어서 운용 DB 시스템상에서는 필요하지 않다. 다음 스크립트 결과에 의해 리스트된 계정들은 제거되어야 한다.

18) Account Permissions

계정에 권한을 부여하는 것은 실수를 유발할 수 있고 이러한 실수를 반복될 수 있다. 기능 별로 할당된 권한을 그룹으로 관리하는 롤을 사용해야 한다. 이를 통해 잘못된 권한을 할 당할 가능성이 줄어든다. 롤에 권한을 할당하고 롤을 계정에 부여해야 한다. 이를 위해 다음 스크립트의 실행 결과값이 있는지 확인한다. 결과값에 대해서는 DBA와 인터뷰를 한다.

19) Default Accounts and Passwords

오라클 DB 시스템은 몇 가지 잘 알려져 있는 기본 계정과 디폴트 패스워드가 있다. 이 러한 기본 계정 및 패스워드는 서버 시스템에 비인가된 접근을 허용할 수 있게 된다. 따 라서, 이러한 기본 계정을 사용하지 않을 경우에는 계정을 잠그고 기간을 만료 시켜야 한다.
기본 계정 중에 연결이 되는 계정이 있는지 확인해야 하며 발견된 기본 계정에 대해 DBA와 인터뷰해야 한다.

바. 패스워드 관리

1) Password Life Time

PASSWORD_LIFE_TIME 값은 패스워드가 파기되는 시점을 의미한다. PASSWORD_ LIFE_TIME 값의 설정으로 사용자들이 패스워드를 변경하고 있는지 확인할 수 있다. PASSWORD_LIFE_TIME은 사용기간으로 설정할 수 있다. 또한, UNLIMITED로 설정 하면 영구히 사용할 수 있으며 디폴트 프로필에 지정된 값을 사용할 수도 있다. PASSWORD _LIFE_TIME 값을 UNLIMITED 로 두는 것은 사용자가 현재 설정된 패스워드를 영원히 사용하는 것을 허용하게 된다. 이러한 설정은 프로필에 설정되며 계정과 연관된다. 다음 스크립트를 실행하여 패스워드의 사용기간을 확인한 결과에 대해 DBA와 인터뷰해 야 한다.

2) Password Reuse PASSWORD_REUSE_MAX값은 패스워드를 다시 사용하기 전에 패스워드를 바꿔야 하 는 횟수를 나타낸다.
PASSWORD_REUSE_MAX 값은 DEFAULT로 설정할 수 있고 UNLIMITED로 설정할 수도 있으며 특별한 숫자로 설정할 수 있다. 이러한 설정은 DEFAULT 프로필 안에 나타 난다. 이러한 DEFAULT 프로필은 각 계정에 대해 설정해야 한다. PASSWORD_REUSE_MAX는 PASSWORD_REUSE_TIME와 배타적이다. 만약 PASSWORD_ REUSE_MAX를 설정하였다면, PASSWORD_REUSE_TIME는 같은 프로필 안 에 UNLIMITED로 설정해야 한다.
PASSWORD_REUSE_MAX의 최대 허용치는 '10'이며, PASSWORD_REUSE_TIME 값의 최대 허용치는 365일이다.
PASSWORD_REUSE_MAX 값과 PASSWORD_REUSE_MAX 값이 설정되어 있는지를 확인한 후 각 값이 허용치를 넘지 않았는지를 확인한다. 다음은 이를 위한 스크립트들이다.

3) Password Verify Function

PASSWORD_VERITY_FUNCTION의 값은 프로필에 할당되어 있는 사용자가 DB에 로 그인할 때 패스워드를 확인하는데 사용되는 PL/SQL의 함수값이다. 이 기능은 PL/SQL 을 통과하기 위해 필요한 패스워드를 검증하기 위해 사용될 수 있다. 이러한 기능은 반드 시 프로필이 적용되는 DB가 지역적으로 실행될 때 가능하다. 오라클은 이를 위해 디폴틀 스크립트(utlpwdmg.sql)을 제공한다. 그러나 오너는 오너의 함수를 생성할 수 있다. 패스워드 검증 함수의 소유권은 반드시 SYS여야 한다. PASSWORD_VERIFY_FUNTION 파라미터 기본값은 NULL이다. 이는 패스워드 검증 없이 수행됨을 의미한다. 다음 스크립트를 통해 PASSWORD_VERITY_FUNCTION의 값이 UNLIMITED나 NULL인지 확인할 수 있다.

4) REMOTE_LOGIN_PASSWORDFILE

EXCLUSIVE로 설정된 REMOTE_LOGIN_PASSWORDFILE은 SYS계정으로 로그인 하는 DBA에 대해 감사를 실시한다. 만약, EXCLUSIVE로 설정되어 있지 않다면 'internal' 이나 'SYSDBA'의 연결에 대해 로그를 남기지 않는다.
다음 스크립트를 통해 REMOTE_LOGIN_PASSWORDFILE의 값이 EXCLUSIVE로 설 정되었는지를 확인한다.

5) Database Link Password Encryption

오라클의 설정 파라메터인 DBLINK_ENCRYPT_LOGIN은 암호화된 패스워드를 사용하 여 원격지의 오라클 DB에 접속하는 파라미터이다.
오라클 7.2 버전 전에는 네트워크를 통해 패스워드가 전달될 때 암호화되지 않았다. 오래 된 서버에 연결하는 수단으로 오라클은 연결이 실패된 서버에 대해 암호화되지 않은 패스 워드를 사용하여 재연결을 시도할 때 이 파라미터를 사용한다. 만약, DBLINK_ENCRYPT_LOGIN 파라미터가 TRUE이면 커넥션은 실패할 것이고 다 시 연결을 시도하지 않는다. 만약 이 파라미터가 FALSE이면 처음 연결은 실패할 것이지 만, 오라클은 계속해서 암호화되지 않은 패스워드를 사용하여 연결을 시도할 것이다. DBLIKE_ENCRYPT_LOGIN 파라미터가 FALSE로 설정된 서버는 링크된 서버 사이에 암호화된 패스워드를 주고 받는다. 오라클 9i이후의 버전에서 이 파라미터는 TRUE로 기 본 설정되어 있다. 이 파라미터를 오라클 9i의 init.ora 파일에 추가하면, 에러 메시지들 을 볼 수 있다.
다음은 DBLINK_ENCRYPT_LOGIN의 파라미터 값이 'TRUE'인지를 확인하는 스크립트이다.

사. 환경설정

1) Audit Table Ownership

Audit Table은 SYS, SYSTEM 또는 이와 유사하게 보호받고 제한되고 접근이 문서화되 어 있는 DB 계정의 소유이어야 한다. Audit Table Ownership은 Audit Table에 비인가 된 접근을 막는데 도움을 준다.
Audit Table 소유자 계정이 단지 ISSO에서 리스트된 인가된 사용자로 제한되고 있는지 DBA에게 알아본다. 아울러, Audit Table 소유자 계정이 Audit Data의 검토 및 유지보 수 이외의 접근을 차단하고 있는지도 확인한다.

앞의 스크립트를 수행한 결과값이 'DB' 가 아니면 Audit Table을 사용하지 않는 것이다. 만약, 결과값이 'DB'이면 다음 스크립트를 실행한다.

앞의 스크립트를 수행한 결과, 리스트 된 소유자 계정이 'SYS' 또는 'SYSTEM' 이 아니라 면 해당 계정에 대해 검증한다.

2) Oracle Instance Names

DB 인스턴스 이름에 버전 숫자를 사용하는 것은 차후의 업그레이드에 있어 인스턴스 이름 의 사용을 제한하게 된다. 운용 DB의 DB 인스턴스 이름의 변경은 불필요한 관리적 부하 를 야기할 수 있고 보안 네트워크 설정에 침해가 발생할 수 있다. 다음은 결과값의 첫 부분이 숫자이거나 혹은 오라클의 릴리즈 번호인지를 확인하는 스크 립트이다.

3) Oracle Control Files

Control Files는 DB의 물리적 상태를 정의하는 바이너리 형식의 파일로 다음과 같은 정 보가 저장되어 있다.
DB 명(SID : System ID)
DB 파일과 REDO 로그파일명
현 로그 순서 번호(Log Sequence number)
체크 포인트 정보
Control Files가 손상되면 DB의 기동이 불가능하다. 여러 개의 컨트롤 파일(물론 각각의 내용은 동일하다.)을 지정하여 손상에 대비하는 것이 일반적이다. 하나의 물리적 디스크 나 RAID 디스크상에는 하나의 오라클 Control 파일이 존재한다. 따라서, 물리적으로 분 리된 여러 개의 디스크에 오라클 Control 파일을 준비하는 것이 필요하다. 다음을 통해 물리적으로 분리된 두개 이상의 디스크에 오라클 Control 파일이 있는지 확 인할 수 있다.

4) Oracle Redo Log Files

두 개 이상의 Redo Log 파일이 있는 Oracle Redo Log 그룹을 둘 이상 생성하는 것은 바 람직하지 않다. 다음을 통해 오라클 Redo Log 그룹이 둘 이상 나오는지 확인할 수 있다.

5) SQL*Plus HOST Command

SQL*PLUS에서는 OS의 명령어를 사용할 수 있다. 따라서, HOST 명령어는 권한이 있 는 사용자로 제한해야 한다. 다음은 SQL*PLUS에서 OS 명령어의 실행이 인가된 사용자로 제한되어 있는지 확인하는 스크립트이다.

6) Audit Trail Location

오라클의 감사는 DB 또는 OS 파일의 감사 자료를 기록하도록 설정할 수 있다. DB에 대해 서 기록된 이벤트들은 뷰를 통해 OS 사용자에게 제공된다. Audit를 사용하는 경우에 audit_trail의 값은 TRUE, DB, OS로 설정되어야 하며 NONE 으로 설정하면 audit_trail을 사용하지 않게 된다. 다음을 통해 audit_trail의 값이 NONE인지를 확인한다. 만약, 파라미터값을 변경하면 DB를 재실행해야 한다.

7) Audit Table Permissions

Audit Table에 대한 권한은 Audit Table에 접근하는 계정들을 제한한다. 과도한 권한의 부여는 Audit Trail Data를 함부로 수정할 수 있게 된다. 계정들에게 단지 Audit Data 가 저장된 테이블(SYS.AUD$)에서 select, insert, delete 또는 update 기능을 수행할 수 있는 권한이 부여되었는지 점검해야 한다.
다음 스크립트를 통해 리스트된 계정들이 인가된 DBA 계정들인지 또는 제 3의 Audit 모 니터링 계정 문서에 등록되었는지를 확인할 수 있다.

8) Idle Time Resource Usage Limit

Idle Time Resource 사용 설정은 하나의 세션에서 허용될 수 있는 최대 Idle Time을 제 한해야 한다. Idle Time은 하나의 세션에서 비활성 시간(분으로 표시)의 간격이다. 실행 시간이 긴 쿼리나 다른 작업들은 이러한 제한이 필요하지 않다. Idle Time Resource Usage 제한 설정은 사용자가 그들의 자리에서 이탈할 때 애플리케이션을 열어두는 것을 막는다.
다음의 스크립트를 통해 리스트 된 Idle time이 60분 이상으로 나오면 애플리케이션 사용 자에게 어떤 프로필이 할당되었는지 확인할 수 있다.

9) Failed Login Attempts

FAILED_LOGIN_ATTEMPTS 값은 로긴 시도의 횟수를 제한하는 값으로 제한된 로긴 시도횟수 이후에는 계정이 잠기게 된다. 이 값을 설정함으로써 비인가된 사용자가 패스워 드를 추측하게 하는 것을 방지할 수 있다.
다음 스크립트를 통해 FAILED_LOGIN_ATTEMPTS의 값이 UNLIMITED나 NULL로 설정되어 있는지 확인할 수 있다.

10) Trusting Remote OS Authentication Setting

REMOTE_OS_AUTHENT 값이 TRUE로 설정되어 있으면 안전하지 않는 커넥션을 통한 원격지의 OS의 인증을 허용한다. 원격지 OS를 신뢰하는 것은 원격지 OS의 사용자인 것 처럼 속이는 사용자를 허용할 수 있으며 또한, 패스워드 없이 DB에 접근을 허용한다. 따 라서, 설정 값은 FALSE로 설정해야 한다. 만약, 설정 값을 변경하게 되면 DB를 재시동 해야 한다.
다음 스크립트를 통해 REMOTE_OS_AUTHENT 값이 FALSE인지 확인할 수 있다.

11) Trusting Remote OS for Roles Setting

REMOTE_OS_ROLES가 TRUE이면 OS의 그룹들이 오라클의 롤을 조절할 수 있다. 만 약, FALSE 값이면 롤은 DB 시스템에 의해 관리되고 인식된다. REMOTE_ OS_ROLE이 TRUE로 설정된다면 원격 사용자는 네트워크가 연결된 상태에서 다른 OS 사용자 역할을 할 수 있다. 따라서, REMOTE_OS_ROLES의 값은 FALSE로 설정되어야 한다. 다음 스크립트를 통해 REMOTE_OS_ROLES의 값이 FALSE인지 확인할 수 있다.

12) Oracle SQL92_SECURITY

SQL92_SECURITY 파라미터의 설정은 해당 참조 테이블 열값의 갱신 또는 삭제를 실행 하는 데 테이블 수준 SELECT 권한이 필요한지 여부를 지정한다. 만약, 이 옵션이 TRUE 로 설정되어 있으면 갱신 권한이 실행될 때 SELECT 권한을 사용할 수 있다. 다음 스크립트를 통해 SQL92_SECURITY가 TRUE로 설정되어 있는지 확인할 수 있다.

13) UTL_FILE_DIR Setting

UTL_FILE 패키지는 오라클 DB 프? 허용 한다. 이 패키지가 사용할 수 있는 모든 파일들은 데이터 베이스의 UTL_FILE 실행 권한 이 있는 어떠한 DB 사용자도 사용할 수 있기 때문에 주의해서 사용해야 한다. UTL_FILE_DIR 값이 '*'로 설정되어 있으면 오라클 DB 프로세스는 UTL_FILE 패키지 를 통해 모든 디렉토리에 접근할 수 있다. UTL_FILE_DIR 리스트는 보호해야 할 디렉토 리와 권한을 부여해야 할 디렉토리를 명확히 기술해야하며 경로명을 전부 포함해서는 안 된다.
UTL_FILE PACKAGE를 통해 모든 디렉토리에 대해 읽고 쓰기가 가능하도록 설정되어 있는지 확인한다. 만약, 결과값으로 '*'가 나오면 모든 디렉토리가 접근 가능한 것이므로 설정을 변경해야 한다.

14) Data Dictionary Accessibility

SELECT ANY TABLE 권한을 갖는 계정이 암호화된 패스워드와 같은 Data Dictionary Table에 있는 중요한 데이터에 접근을 제한하고 있는지를 확인한다. 이 기능은 오라클 8에서 07_DICTIONARY_ACCESSIBILITY 파라미터를 통해 제공된 다. 만약, 이 파라미터 값이 FALSE이면 Data Dictionary 내에 있는 민감한 정보에 접근 하는 것을 제한한다.
다음 스크립트를 통해 07_DICTIONARY_ACCESSIBILITY 값이 FALSE인지를 확인할수 있다.

15) Database Link Permissions

Database Link 패스워드는 SYS.LINK$ 테이블에 암호화되지 않은 상태로 저장이 되는 데, 이 테이블에 대한 접근은 제한되어야 한다.
이를 위해 다음 스크립트의 수행 결과값이 있는지를 확인한다.

16) Resource Limits Not Enabled

RESOURCE_LIMIT 파라미터는 DB 프로파일에 리소스 제한의 강제 수행 여부를 결정한 다. FALSE값으로 설정하면 리소스 제한의 강제 적용을 비활성화하고, TRUE값으로 설 정하면 리소스 제한의 강제 적용을 활성화한다. RESOURCE_LIMIT 파라미터의 기본값 은 FALSE이다. 이 값은 패스워드 리소스에는 적용되지 않는다.
다음 스크립트를 통해 RESOURCE_LIMIT 의 설정이 'TRUE'로 설정되어 있는지를 확인 할 수 있다.

17) Current Oracle Version

다음은 현재 DB 시스템의 버전을 확인하는 스크립트이다.

Posted by redkite
, |

0004. 취약점 분석 운영

4. DB 취약점 분석 운영

가. 취약점 수집

기존 네트워크나 애플리케이션 취약점 분석 솔루션은 네트워크와 OS 보안에 있어 효과적 일 수 있지만 DB 취약점에 대한 정보를 제공하고 있지 않는다. 따라서, DB 취약점 분석에 서는 DB 취약점을 수집하여 DB 계층에 존재하는 서비스 거부 공격, Misconfigurations, 알려진 취약성 경고, 패스워드 공격 취약성 등과 같은 보안 사항을 다루어야만 한다. DB 취약점은 DBMS 벤더사나 컴퓨터 침해 사고 대응단(CERT, Computer Emergency Response Team)에 의해 공개되거나 혹은 악의적 의사를 가진 해커들에 의해 공유되고 있다. 이렇게 발표되는 취약점은 사실상 공개적으로 노출된 것이기 때문에 발표된 취약점 만을 대응하는 DB가 대응시점이 늦었다면 즉시 공격 위험에 노출 될 수 있다.
대표적인 DB 취약점인 버퍼 오버플로(Buffer Overflow) 공격은 그 종류가 매우 다양하 며 애플리케이션과 DB 레벨 내에 발생된다. 이러한 버퍼 오버플로의 가능성은 취약점으 로 분류하여 관리해야 한다.
취약점이란 실행되지 않도록 의도된 애플리케이션이 비인가 유저에 의해 실행되도록 하는 모든 시도 및 그 공격들로 정의된다. 애플리케이션 내 취약점들은 대개 프로그래밍 에러를 발생시키며, 특히 개발자들은 종종 gets(), printf() 등과 같은 함수를 사용함에 있어 그 보안상의 의미를 잘 모르고 있는데 많은 개발코드들이 애플리케이션 보안 취약점들이 잘 알려지기 이전에 만들어졌기 때문이다. 가장 위험한 취약점은 비인증 유저의 Aribitray 명령의 수행을 허용하는 것이다. 아무리 패스워드 및 인증 관리가 강화된다고 하더라도 이 러한 취약점을 이용하여 우회적으로 공격할 수 있다.

나. 취약점 제거

DB 취약점은 단순한 네트워크나 애플리케이션 취약점에 의해 서비스가 중지되는 수준이 아니라 개인정보보호 차원과 기업 기밀보호 차원에서 매우 중요한 관리 요소가 된다. 하지 만 여기서 고려해야 할 사항은 DB는 특성상 IT 인프라 내의 상시 운영시스템으로서 DB 취약점 제거를 위해 DB의 가동을 중지하기란 쉽지 않다는 것이다. 취약점의 성격과 위험 등급에 따라 단순한 Fix Script로서 취약점을 제거할 수 있는 가벼운 것도 있지만, DB의 패치(Patch)를 통해 취약점을 제거해야 하는 경우도 생기게 된다. 때때로, 이러한 패치작 업은 여러가지 오류로 인해 DB 재가동이 어렵게 되는 경우도 발생하게 되므로, DB 취약 점 제거를 위해 패치를 적용하는 경우에는 해당 벤더사 엔지니어의 조언이 필요하게 된다.

다. 취약점 개선 분석 비교

새로운 DB 취약점은 발표시기에 대한 예정이 없기 때문에 취약점 분석은 자주 하는 것이 바람직하다. 예를 들어, 지난 달에 DB 취약점 분석과 제거 작업을 수행하였지만 그사이 새로운 취약점 발표와 함께 공격 위험에 노출 될 수 있다. 사실상 DB 취약점 분석은 빠른 시간 안에 수행할 수 있지만 취약점 제거에 소요되는 노력과 시간은 만만치가 않다. 하지 만, 가능하다면 잦은 주기마다 취약점을 분석하여 새로운 취약점 발견과 기존 취약점의 제 거의 확인에 노력을 기울어야 한다.

 

Posted by redkite
, |

0003. 취약점 분석 구축

3. DB 취약점 분석 구축

가. 모의 해킹 (Penetration Test)

DB 모의해킹(Database Penetration Test)란 DB 계정을 소유하지 않은 외부 사용자에 의한 DB 침해공격을 시뮬레이션(Simulation)하는 행위를 의미한다. 통해 취약점을 검출 하거나 수집된 취약점 지식 DB를 통해 외부공격자의 침투가능 경로를 검출할 수 있다.
모의해킹(Penetration Test)의 주요 점검 항목은 다음과 같다.
DB 서비스 프로세스의 여부 점검
DB의 패스워드를 Brute Forcing, Dictionary Attack, Password Cracking 기법을 통해 안전하지 못한 DB 패스워드 추출 여부 점검
버퍼 오버플로 공격에 대한 DB 서비스 오동작 여부 점검
Dos(Denial of Service) 공격에 대한 DB 다운이나 서비스 불가 요부 점검
DB의 비정상 설정으로 인한 비정상 침투 경로 존재 여부 점검

나. 내부 보안감사(Security Auditing)

DB 내부 보안감사(Database Security Auditing)는 알려진 취약점과 더불어 DB가 보안상 안전하게 설치되고 운영되는가를 점검하고, 더불어 DB를 구성하는 File, Table Space, OS, Role, Grant 등의 다각적 보안 검토를 의미한다. 내부 보안감사 (Security Auditing) 에서의 주요 점검 항목은 다음과 같다.
패스워드를 포함하는 Database User Account 정보
모든 Profile과 각 Profile의 Resource 정보
DB User의 다른 Role에 부여된 Role 정보
Database 내의 모든 Role에 대한 상세 정보
Database User의 다른 Role에 부여된 System Role 정보
Database User에게 부여된 System 권한 정보
Database 프로세스와 세션 정보

다. Oracle DB 취약점 점검 리스트

라. IBM DB2 Database 취약점 점검 리스트

마. Microsoft SQL Server Database 취약점 점검 리스트

Posted by redkite
, |

0002. 취약점 분석 설계

2. DB 취약점 분석 설계

DB의 취약점을 보안 관리자 또는 DBA가 일일이 찾아낼 수도 있지만 이는 엄청난 시간과 노력이 필요하다. 이러한 단점을 보안하고 업무의 효율성을 높이기 위해 일반적으로 DB 취약점 분석 솔루션을 사용한다.
DB 취약점 분석 솔루션은 빠른 시간안에 방대한 DB를 분석하여 DB의 취약점을 도출하여 해당 DB의 보안 대책을 마련하는 기초 자료를 제공한다. 또한, 보안 관리자 및 DBA에게 현재 운영 중이거나 향후 구축될 DB의 취약점을 미연에 방지하도록 사전 가이드성 정보를 제공한다.
다음은 DB 취약점 분석 솔루션의 도입시 고려할 사항이다.

사용자 편의성과 점검시간 단축(Easy operating and time saving)
?시스템 내에 에이전트(Agent)나 별도의 컴포넌트(Component) 설치를 요구하지 않음
?점검대상 DB의 IP 대역과 포트 정보만으로 점검 수행 가능
?단 한번의 정보수집으로 대상 네트워크 정보자산의 파악 가능
다각적 분석(Fine granularity diagnosis on database security)
?단편적인 보안도구(In-house ware)를 조합한 보안점검은 일부 항목이 누락될 위 험 상존
?국제 보안 기준(STIG, SANS, CIS)에 입각한 다각도의 점검과 분석 가능
모의해킹과 내부 보안감사 병행(Double-faced security check)
?보안관리자 및 감사자 측면을 고려한 다각도의 보안점검 수행 가능
?외부로부터의 침입을 가상한 모의해킹 수행
?DB가 보안상 안전하게 설치·운영되는 가를 점검하는 내부 보안 감사 수행
사용자 정의 진단 (Adaptable user-defined operating)
?간편하고 직관적인 유저 인터페이스(User Interface)
?점검자의 필요에 의한 점검항목 정의 후 점검 수행 가능
?비밀번호 체크(Password Checking)와 같은 개별 점검항목에 대한 신속한 점검 수 행 가능
다음 그림은 DB 취약점 분석을 위한 절차를 나타낸 것이다.

다음은 본 절에서 자주 사용되는 키용어에 대한 설명이다.

가. DB 환경 제안

DB 설치 항목 중 무엇이 필요한 요소인지가 확실하지 않다면 일반적인 구성으로 설치하게 되는데 대체로 DB의 대표적인 취약점은 사용하지 않는 모듈의 취약점을 통해 공격하는 사 례가 많기 때문에 DB는 처음 설치할 때 반드시 필요한 요소만 설치하여야 한다.
예를 들어, 오라클 DB의 데이터 딕셔너리(Data Dictionary)에 대한 공격을 살펴보면, 오 직 적절한 권한을 가진 사용자(DBA 권한으로 접속을 생성한 사용자)만이 데이터 딕셔너 리 상의 ANY 시스템 권한(ANY System Privilege)를 사용할 수 있게하여야 한다. 만약 ANY 시스템 전환을 앞에서와 같이 설정하지 않는다면, DROP ANY TABLE 시스템 권 한을 가진 사용자는 누구라도 데이터 딕셔너리 내용을 악의적으로 이용할 수 있을 것이다.
따라서, 데이터 딕셔너리를 조회해야만 하는 사용자에게는 SELECT ANY DRCTIONARY 시스템 권한을 주어 데이터 딕셔너리 뷰(Data Direction View)로의 접근만을 허용하도 록 해야 한다.
오라클에서 데이터 딕셔너리를 보호하기 위해서는 파라미터 파일(Parameter File)인 init.ora의 내용을 OS가 제공하는 에디터를 이용하여 다음과 같이 수정하여 주면 된다.

예를 들어, 오라클 9i에서는 디폴트로 O7_DIRCTIONARY_ACCESSIBILITY=FALSE 가지지만 오라클 8i에서는 디폴트로 O7_DIRCTIONARY_ACCESSIBILITY=TRUE 로 설정되어 있으므로 반드시 수정하여야 한다.

나. 계정 관리

오라클 DB를 설치하면 다수의 디폴트 사용자 아이디가 생긴다. 만약, 수동으로 DBCA를 사용하지 않고 오라클을 설치하는 경우라면 디폴트 사용자 아이디는 모두 열린다. 즉, 잠 기지 않는 상태가 되므로 보다 세심한 주의가 필요하다.
이러한 이유로 수동으로 설치한 DB는 SQL문을 통하여 디폴트 사용자 아이디를 잠그고 기간을 만료시켜야 한다. 물론 상기의 SYS, SYSTEM, SCOTT, OUTLN, 그리고 3개의 JSERV 사용자 아이디들은 제외해야 한다.
다음과 같은 SQL문을 통하여 DB 사용자 아이디 목록과 아이디별 상태를 알 수 있다.

특정 사용자 아이디를 잠그고 기간을 만료시키는 SQL문장은 다음과 같다.

다. 패스워드 관리

앞서 언급한 디폴트 사용자 아이디인 SYS, SYSTEM, SCOTT, DBSNMP, 그리고 3개 의 JSERV 사용자 아이디들은 패스워드를 변경해 주어야 한다. 오라클 DB를 공격하는 가 장 손쉬운 방법은 설치 당시의 디폴트 패스워드를 사용하는 사용자 아이디를 사용하는 것 이므로 패스워드의 변경은 설치 직후에 지체 없이 이루어져야 한다.

앞의 접속 상황은 디폴트 사용자 아이디인 SYSTEM의 디폴트 패스워드인 MANAGER로 접 속이 이루어짐을 알 수 있다. 이렇게 디폴트 패스워드로 접속이 가능하다면 해당 DB는 디폴트 사용자 아이디를 알고 있는 누구든지 DB에 접근하여 자료를 파괴할 수 있다는 것을 의미한다. 디폴트 사용자 아이디의 디폴트 패스워드는 다음 표와 같다.

JSERV의 사용자 아이디는 임의로 생성된 패스워드를 사용한다. 또한, DB는 영문자의 대 소문자를 구별하지 않음을 기억해야 한다. 다음은 USER2의 사용자 아이디의 패스워드를 'new_passwd'로 변경하는 SQL문장이다. 다른 디폴트 사용자 아이디도 동일한 방법으로 변경할 수 있다.

또한, 오라클 엔터프라이즈 에디션을 사용한다면 Kerberos, 토큰 카드(Token Card), 스마트 카드, X.509 등과 같은 강화된 인증 기능을 이용할 수도 있다.

라. 권한 관리

사용자에게는 반드시 필요한 최소권한(Least Privilege)만을 부여해야 한다. 예를 들어, PUBLIC 사용자 그룹에서 불필요한 권한을 회수하여야 한다. PUBLIC은 오라클 DB의 모든 사용자에게 디폴트로 적용된다. 따라서, 모든 사용자는 PUBLIC에 권한 부여(Privilege Grant)된 것은 어떤 일이든 할 수 있다. 이런 경우 사용자가 교묘하게 선택된 PL/ SQL 패키지를 실행시켜 보낼 자신에게 권한 부여된 권한 범위를 넘어서는 작업을 할 수도 있을 것이다.
부적절한 권한 관리로 PL/SQL 보다 강력한 다음과 같은 패키지들도 오용될 소지가 있으 므로 주의해야 한다.

앞의 표와 같은 패키지들은 특정한 응용프로그램에 아주 유용하게 이용될 수 있다. 바꾸어 말하면, 모든 경우에 이러한 패키지들을 필요로 하는 것이 아니라는 것이다. 따라서, 필요 하지 않는 패키지들의 사용권한을 PUBLIC에서 제거해야 한다. 즉, 'Run-time Facilities' 에 제약된 퍼미션을 주어야 한다.
오라클 자바 버추얼 머신(OJVM, Oracle Java Virtual Machine)이 DB 서버의 Runtime Facility의 예가 될 수 있다. 어떠한 경우라도 이러한 Run-time Facility에 모든 권한을 주어서는 안된다. 또한, DB 서버 외부에서 파일이나 패키지를 실행할 수 있는 Facility에 어떤 퍼미션을 줄 때는 반드시 정확한 경로를 명시하여야 한다. 다음은 이에 대한 예시들이다.

마. 인증 관리

클라이언트에 대한 철저한 인증이 필요하다. 예를 들러, 오라클 9i는 원격 인증 기능을 제 공한다. 만일 해당 기능이 활성화(True)되면 원격의 클라이언트들이 오라클 DB에 접속할 수 있다. 즉, DB는 적절하게 인증된 모든 클라이언트를 신뢰한다. 그러나 일반적으로 PC 의 경우에는 적절한 인증 여부를 보장할 수 없다. 따라서, 원격인증 기능을 사용하면 보안 이 대단히 취약해진다.
원격 인증기능을 비활성화(False)한다면 오라클 DB에 접속하려는 클라이언트들은 Server-base 인증을 해야 하므로 보안이 강화될 것이다.
원격 인증을 제한하여 클라이언트의 인증을 DB 서버가 행하도록 하려면 오라클 파라미터 파일(Parameter File) 인 init.ora의 내용을 다음과 같이 수정하면 된다.

또한, DB 서버가 있는 시스템의 사용자 수를 제한하여야 한다. 즉, 오라클 DB가 운영되 고 있는 시스템의 사용자 수를 OS차원에서 제한하여야 한다. 제한이란 꼭 필요한 사용자 아이디만 생성하라는 의미로서 관리자 권한을 가진 사용자를 특히 주의해야 한다.

바. 원격 접속관리

방화벽 구축
다른 중요한 서비스와 마찬가지로 DB 서버는 방화벽 뒤에 설치하여야 한다. 오라클 네 트워킹 인프라스트럭쳐인 오라클 Net Service(Net8 and SQL*Net으로 많이 알려져 있음)는 다양한 종류의 방화벽을 지원한다.

기본 서비스 포트 사용 자제
오라클 DB를 외부 네트워크에서 접근할 수 있도록 방화벽의 1521 포트를 열어두면 이 는 치명적인 허점이 될 수 있다. 더 나아가 패스워드 설정 없이 오라클 리스너를 운영한 다면 DB에 대한 중요한 정보들이 노출될 수 있다. 이러한 노출정보가 많으면 많을수록 DB가 공격 당할 가능성이 높아진다. 또한, 원격에서 오라클 리스너의 설정을 변경할 수 없도록 하여야 한다.
다음과 같은 형식으로 오라클의 리스너 설정 파일인 listener.ora 내의 파라미터를 설정 하면 원격에서 오라클 리스너 설정을 바꿀 수 없다.

접속을 허용할 네트워크 IP 주소 대역을 지정하는 것이 좋다. DB 서버가 특정한 IP 주소 대역으로부터의 클라이언트 접속을 제어하려면 'Oracle Net valid node checking' 기능 을 이용하면 된다. 이 기능을 사용하려면 protocol.ora 내의 파라미터를 다음과 같이 설 정해야 한다.

앞의 설정은 직관적으로 알 수 있듯이 첫번째 파라미터가 나머지 두 개 파라미터 기능의 활성화를 결정하며, invited_nodes에 포함된 IP 주소 대역의 접속 요구만이 받아들여진 다. 이러한 기능은 DoS 공격의 잠재적인 위협도 경감시켜준다.

네트워크 트래픽(Network Traffic) 암호화
오라클 DB 서버와 클라이언트의 통신은 암호화되지 않은 형태로 이루어진다. 이는 네 트워크상의 악의적인 공격자에 의해 데이터의 읽기, 변경, 삭제가 가능하다는 보안상 의 위협이 존재한다. 따라서, 가능하다면 Oracle Advanced Security를 사용하여 네 트워크 트래픽을 암호화해야 한다.
그러나 오라클 Advanced Security가 Oracle Database Enterprise Edition에서만 제공된다는 점이며 암호화하고 복호화하는 알고리즘으로 인해 속도가 떨어질 수 밖에 없다. (암호화 복호화 알고리즘은 DES, Three-DES, RC4 중에서 선택할 수 있음)

DB 서버가 있는 시스템의 OS 강화
불필요한 서비스를 제거하면 DB 서버 시스템이 보다 안전해진다. UNIX와 Windows 를 막론하고 ftp, tftp, telnet 등의 불필요한 많은 서비스들을 디폴트로 제공하는데 제거된 서비스가 사용하는 TCP/UDP 포트는 막아야 한다. 이때, TCP/UDP 포트는 모두 막아야 한다.

보안 패치의 적용
오라클 DB가 운영되고 있는 OS와 DB 자신에 대한 모든 중요한 패치를 정기적으로 실시 하여야 한다. 조직 차원에서 패치와 관련된 업무 프로세스를 만드는 것이 바람직하다. 오라클의 경우 다음의 사이트에서 보안과 관련된 정보를 얻을 수 있다.

http://otn.oracle.com
http://technet.oracle.com

Posted by redkite
, |

0001. 취약점 분석 개요

1.DB 취약점 분석 개요

DB 보안은 외부 혹은 내부자로부터 개인 또는 조직의 주요기밀 정보 유출에 대한 방어를 목적으로 한다. DB 보안의 위협들은 사용자의 실수, 오용, 내부자의 권한 남용, DB에 대 한 알려진 취약점 등으로부터 기인하게 된다. 오늘날 정보자산은 무형의 자산에 그치지 않 고 실질적인 재화이다. 이러한 정보자산 가치의 증대로 인하여 주요 정보가 집중되어 있는 DB에 대한 위협은 날로 증가하고 있다.

DB 침해사고는 외부의 해커, 인가된 내부 사용자, 인가되지 않은 내부 사용자 등 모든 범 위에서 발생할 수 있다. DB는 정보시스템의 가장 깊은 곳에서 운영되지만 웹 애플리케이 션(Web Application), 내부망(Internal Network), 파트너 연계 네트워크 등 수 많은 접 근점의 존재로 인해 데이터 유출 위험이나 서비스 중지의 위험이 상시적으로 존재한다.
DB 취약점의 유형은 다음과 같다.
Admin 권한이 아닌 일반 권한을 가진 DB 계정이 단 하나의 SQL 명령으로 Admin 권 한을 획득 한다면?
DB 계정이 없는 사용자의 DoS공격에 의해 고객 및 금융 업무를 운영하는 DB가 갑자기 중지된다면?
DBMS 내부에 DBA도 모르는 내부 함수(Internal Function)로 인해 DB가 손상된다면?
다른 소유주의 테이블(Table)이 남모르게 접근 가능하다면?
앞의 취약점들은 다음의 대표적인 DB 취약점을 통해 공격받을 수 있다.
디폴트(Default) 패스워드 및 보안상 안전하지 못한 약한 패스워드
권한의 남용(모든 권한은 꼭 필요한 최소한의 권한으로 운영되어야 한다.)
버퍼 오버플로(Buffer overflow)나 형식문자열(Format String)과 같은 알려진 취약 점들
네트워크를 통한 취약점들
DB 및 시스템 파일에 대한 불법 열람 및 변조
SQL 주입공격(Injection )
DB 서비스를 중단시킬 수 있는 서비스 거부(Denial of Service)와 같은 위협들 문제는 이러한 DB 취약점들이 DBMS 제조사나 해커들에 의해 항상 공개가 된다는 것이 다. 이렇게 공개된 DB 취약점들을 통해 DB는 쉽게 공격 대상으로 주목된다. DB 취약점 분석은 DB에 내재된 취약점들과 DB 운영에 있어서 고려되어야 할 항목들을 다각도에서 구체적으로 점검함으로써 보안 관리자 및 DBA에게 시스템에 내재된 안전 취 약점(Security Hole)을 제거하게 하여 DB의 보안 수준을 향상시키게 한다.
DB 취약점 분석 솔루션은 점검대상 네트워크 범위에 존재하는 정보자산을 파악하는 정보 수집(Information Gathering), DB 보안을 검증할 수 있는 모의해킹(Penetration Test), 내부 보안감사(Security Auditing) 등의 과정을 통해 다양한 DB 취약점들을 도출 하여 DB의 전체 보안 수준의 향상을 도모한다.
DB 취약점 분석은 정보 자산의 파악과 보안성의 검토, 검출된 취약점 제거를 위한 Fix Scripts 및 개선안 제시, 레포팅 등을 주요 항목으로 한다.

결국 DB 취약점(Database Vulnerabilities)은 DB 보안을 위해 반드시 점검해야 할 항목 이라고 할 수 있다.

Posted by redkite
, |

효율적인 백업 및 복구

http://dinggur.tistory.com/category/Study




Export / Import
1. 특정테이블만 백업받고 싶다.
2. 특정 테이블만 옮기고 싶을때.
3. 구DB(윈도8i) → 신규DB(리눅스11g) 로 DATA 옮기고 싶을때

Migration(마이그레이션) : 데이터 옮기기
방법 1 : exp/imp
방법 2 : data pump


원리는 select와 같다 = DB open상태에서 실행한다.


Export 원리
: 서버에 있는 데이터를 빼올때.
: 시작시점의 데이터만 들어간다.
: sys계정은 exp 안된다 → system 사용자
temporary tablespace 공간 사용(관리법 잘알기)



① Conventional Path export
- 여러사람이 같이 쓸때
- evaluation buffer 사용

② Direct Path export
- 혼자 쓸때
- 단점 : 원본 테이블에 여러 process 가 동시에 접근을 해서 사용할 경우 속도 저하가 심해진다.


DB는 여러 사람이 동시에 사용하는 것이기 때문에, 기본적으로 conventional path 모드로 작동하게 되어있다.
conventional path 모드의 기본적인 속도는 과정이 다소 복잡하기 때문에 direct path에 비해 속도가 저하된다.

EXP 단점 : 속도가 느리다.
주의 : 편집하면 파일깨짐. EXP 처음부터 다시해야함.


Export 옵션

옵 션 명

Default value

의 미

userid

없음

export 를 수행하는 사용자의 계정과 암호

buffer

os에 따라 다름

evaluation buffer 크기를 바이트 단위로 지정

file

expdat.dmp

export 결과르 저장할 파일명

grants

yes

해당 스키마에 설정된 권한을 export 받을 것인가 유무

indexes

yes

인덱스를 export 받을 것인가 유무

rows

yes

데이터를 받을 것인가 유무

constraints

yes

제약 조건을 받을 것인가 유무

compress

yes

export 받을 때 데이터를 하나의 셋으로 압축 할지 유무

full

no

전체 데이터베이스를 export 받을 것인가 유무

owner

current user

export 받을 사용자 이름을 지정

tables

없음

export 받을 테이블 이름 지정

tablespaces

없음

export 받을 테이블 스페이스 이름 지정

recordlength

os 에 따라 다름

파일레코드의 바이트 단위 길이. evaluation buffer에서 데이터 파일로 저장할 때 운반바이트 단위 지정

inctype

없음

증분 export 의 유형설정, complete, cumulative, incremental

record

yes

증분 export 내용을 기록할지 지정, .sys.incvid, sys.incexp

parfile

없음

export 파라미터 파일을 지정

 

=칠판실습=

$ exp scott/tiger tables=emp file=emp.dmp

$ vi emp.dmp
바이너리파일
IMP에게 수행할 명령 쭉~ 적혀있음..
(수행할 SQL명령어들이 순서대로 들어있다)
- 내부순서 : create table → insert → create index → add constraints

EXP/IMP 계정이 동일해야 한다 : IMP때 아이디/암호는 EXP할때 아이디/암호 와같아야 한다.
- 예외 : system 계정으로 작업시 상관없다.

ex) 다른사람이 받아놓은 exp를 imp받아야 하는 경우. (계정을 모를때)
→ VI로 dmp파일 열어보면 2째줄 U뒤에 아이디 적혀있음

 



Export
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 시작
exp 실습 1: conventional Path로 full export 받기

$ time exp system/oracle full=y log=full_log.log file=/home/oracle/full_test01.dmp


exp 실습 2: direct Path로 full export 받기

$ time exp system/oracle full=y log=full_log.log file=/home/oracle/full_test01.dmp direct=y


exp 실습 3: exp 를 저장하는 백업파일 분할해서 받기

$ time exp system/oracle full=y \
file=(/data/backup/export/test03_1.dmp,\
/data/backup/export/test03_2.dmp,\
/data/backup/export/test03_3.dmp,\
/data/backup/export/test03_4.dmp)\
filesize=20M direct=y


exp 실습 4: 특정 테이블스페이스만 받기

$ exp system/oracle file=/data/backup/export/ex_un.dmp \
tablespaces=(example, undotbs1)


exp 실습 5: 여러 사용자를 동시에 백업 받기

$ exp system/oracle file=/data/backup/export/scott_hr.dmp \
owner=(scott,hr)


exp 실습 6: evaluation Buffer 값을 조정하면서 export 수행

-----------
실습용 테이블 생성
SQL> create table scott.test01
2 (no number, name varchar2(20), address varchar2(50)) tablespace example;

테이블 스페이스 용량 충분히 늘려주고 대량의 데이터 입력시키기
SQL> begin
2 for i in 1..1000000 loop
3 insert into scott.test01
4 values (i, dbms_random.string('A',19),
5 dbms_random.string('Q',40) );
6 end loop;
7 commit;
8 end;
9 /

생성후 확인
SQL> select sum(bytes)/1024/1024 MB
2 from dba_segments
3 where owner='SCOTT'
4 and segment_name='TEST01';
--------------

① evaluation Buffer 값을 설정하지 않고 export 수행

$ time exp scott/tiger file=/data/backup/export/test02.dmp tables=test01

real 0m12.340s


② evaluation Buffer 값을 1M 로 설정후 export 수행

$ time exp scott/tiger file=/data/backup/export/test03.dmp buffer=1024000 tables=test01

real 0m6.156s


③ evaluation Buffer 값을 10M 로 설정후 export 수행

$ time exp scott/tiger file=/data/backup/export/test04.dmp buffer=10240000 tables=test01

real 0m2.919s


④ evaluation Buffer 값을 20M 로 설정후 export 수행

$ time exp scott/tiger file=/data/backup/export/test05.dmp buffer=20480000 tables=test01

real 0m3.267s


⑤ direct Path 로 export 수행

$ time exp scott/tiger file=/data/backup/export/test06.dmp direct=y tables=test01

real 0m7.150s

정리 : evaluation Buffer의 크기 / temporary tablespc의 크기 = exp/imp 속도에 영향을 준다.







exp 실습 7: 일반사용자(여기서는 scott)로 full export 수행

SYS> select * from dba_role_privs where grantee='SCOTT';
SYS> grant exp_full_database to scott;
설명 : 원래 일반 사용자는 DB전체백업을 받지 못한다. 그래서 DBA권한을 주거나 exp_full_database 라는 role을 주던지 해야 함.

$ time exp scott/tiger full=y file=/data/backup/export/test7.dmp buffer=10240000



exp 실습 8: parameter file 을 이용한 export 수행

$ vi par_full.dat
file=/data/backup/export/test09.dmp
full=y
direct=y
:wq!

$ exp system/oracle parfile=par_full.dat



exp 실습 9: 특정 조건만 export 받기 - query 옵션 사용(8i부터 가능)
OS에서 사용하는 특수문자 ' " < > 등을 쿼리로 사용할 경우 앞에 \(escape문자)를 붙여서 구분해 주어야 한다.

- emp 테이블에서 이름 첫 글자가 F인 사람만 export 받기
$ exp scott/tiger query=\"where ename like \'F%\'\" tables=emp file=/data/backup/export/emp.dmp

- emp 테이블에서 job이 CLERK 이고 급여가 1000인 사람만 export 받기
$ exp scott/tiger query=\"where job=\'CLERK\' and sal \> 1000 \" file=/data/backup/export/scott2.dmp tables=emp

- parameter file 에서 query 옵션 사용하기 - escape 문자(\) 안써도 됨
$ vi par_q.dat
tables=emp query="where job='CLERK' and sal>1000"
:wq!

$ exp scott/tiger parfile=par_q.dat



exp 실습 10: schema 별로 자동 export 백업 받는 스크립트

$ vi exp_script.sh
export LANG=C
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb
sqlplus /nolog << EOF3
conn / as sysdba
set head off
set time off
set timing off
set feedback off
set echo off
set line 200
col name for a100
spool /home/oracle/exp.tmp
select 'mkdir -p /data/backup/exp/'||to_char(sysdate,'YYYY-MM-DD-HH24-MI-SS') from dual;
select distinct 'exp system/oracle'||' owner='||lower(owner)||' file=/data/backup/exp/'||to_char(sysdate,'YYYY-MM-DD-HH24-MI-SS')||'/'||lower(owner)||'.dmp'||' filesize=100m direct=y' from dba_tables where owner not in('SYS','DBSNMP','WMSYS','IX','SYSTEM','OE','PM','EXFSYS','CTXSYS','OLAPSYS','MDSYS','SYSMAN','LOADER','XDB','ORDSYS',
'OUTLN','TSMSYS','DMSYS');
spool off

!cat /home/oracle/exp.tmp | egrep -v SQL | egrep -v SYS > /home/oracle/exp.sh
!sh /home/oracle/exp.sh
exit

EOF3




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 끝






Import
: export 를 수행해서 만든 파일을 다시 데이터베이스로 넣는 작업을 수행
: 대량의 DDL과 DML을 수행하는 것이므로, redo log와 undo segment를 사용 → 대량의 데이터 import시 큰 undo tablespace를 준비
만약 용량이 부족할 경우 마지막에 에러 나면서 전부 rollback 될수도 있다.
이런 위험 줄이려면 import할때 commit=y로 변경하면 된다. 기본값은 테이블전체가 입력완료된후 커밋되는데
이 옵션을 사용하면 array단위로 커밋수행.
: 만약 DBA로(system) export 받은 파일의 경우, DBA로(system) import 해야 한다.
일반 사용자(Ex. scott)로 import 시도하면 에러발생.


IMP 특징
- imp할때마다 자료는 추가됨.
- 중간에 에러나서 자료 입력이 다 안되었을때, 다시 imp하면 에러전까지 입력된 자료 남겨두고, 새로 또 입력됨.
에러나서 다시 imp해야 할 경우 에러 전까지 입력된 데이터 truncate나 drop으로 날리고 다시작업해야 데이터 중복없음.



Import 주요옵션

ignore : Import 도중 에러나도 무시하고 계속 진행함.
fromuser : export 할 당시 원래 주인 user
touser : import 할때 새로 지정해줄 주인 user

 

옵 션 명

Default value

설 명

userid

없음

import 를 수행하는 username / password

buffer

os 에 따라 다름

evaluation buffe 의 크기, export와 동일함

file

expdat.dmp

import 할 export 파일 명

show

no

데이터를 import 하지 않고 내용만 확인함

ignore

yes

import 도중 에러나도 무시하고 계속 진행함

grants

yes

권한도 import 할 것인지 설정

rows

yes

데이터를 import 할 것인지 설정

indexes

yes

index를 import 할 것인지 설정

full

no

전체 파일을 import 할 것인지 설정

fromuser

없음

export 할 당시 오브젝트의 소유자를 지정함

touser

없음

import 할 오브젝트의 새 owner 이름

tables

없음

import 할 테이블 목록

recordhength

os 별로 다름

한번에 import 할 record의 길이를 지정

inctype

없음

증분 import의 유형 지정, system 과 restore 가 적당함

commit

no

각 array의 입력 후 commit 할것인가 결정, 디폴트는 array가 아니라 테이블 전체가 입력 완료 된 후 커밋을 함. Array는 한번 입력되는 단위를 의미함

parfile

없음

import 의 파라미터를 적어둔 파라미터 파일을 지정함






Import
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 시작
사전작업
$ exp system/oracle file=/data/backup/export/full01.dmp full=y dirct=y



imp 실습 1: DBA로 전체 데이터 import 수행
: DB전체를 이동할 때 사용. A서버의 데이터를 B서버로 import로 이동시킬때 B서버에 같은 테이블이나 데이터가 존재한다면 추가를 하게 된다.
그래서 만약 B서버에 제약조건이나 index가 존재한다면(unique index 나 primary key 등이 존재할 경우) 데이터가 추가되지 않고 에러가 발생한다.

$ imp system/oracle file=/data/backup/export/full01.dmp ignore=y full=y



imp 실습 2: 특정 사용자의 데이터만 import 수행
: 전체 export받은 full01.dmp 파일에서 scott 사용자의 test01테이블만 import하기

$ imp system/oracle file=/data/backup/export/full01.dmp fromuser=scott tables=test01 ignore=y




imp 실습 3: scott 사용자의 test02 테이블을 hr 사용자 소유로 변경하기
--------------------------------
테스트 테이블 생성

SCOTT> create table test02 (no number,addr varchar2(10));

SCOTT> begin
2 for i in 1..1000 loop
3 insert into test02 values (i, dbms_random.string('A',10));
4 end loop;
5 commit;
6 end;
7 /

SCOTT> select count(*) from test02;
COUNT(*)
--------
1000

$ exp scott/tiger file=/data/backup/export/test02.dmp tables=test02
--------------------------------

$ imp system/oracle file=/data/backup/export/test02.dmp fromuser=scott touser=hr ignore=y



imp 실습 4: 실제 데이터는 import 하지 않고 DDL 문장만 추출하기

$ imp system/oracle file=/data/backup/export/test02.dmp full=y show=y log=test02.log
$ vi test02.log



imp 실습 5: import 할 때 테이블과 index를 분리해내기

테이블과 인덱스는 다른 테이블스페이스에 저장해야 성능이 좋아진다.
exp/imp할때 같은 테이블스페이스에 있던 테이블과 인덱스를 다른 테이블 스페이스로 분리하려고 할때.

① 인덱스 스크립트가 있다면.
import 할때 indexes=n 옵션주고 import 한후 나중에 인덱스 스크립트에서 테이블스페이스만 변경하고 실행

② 인덱스 스크립트가 없다면.
import 할때 indexfile=파일이름 옵션주고 새로 생성되는 스크립트 수정(테이블스페이스)해서 실행

SCOTT> create index idx_test02_addr on test02(addr); ← 테이블스페이스 따로 지정 안해줘서 테이블과 같은 장소에 생성됨

$ exp scott/tiger file=/data/backup/export/test02_index.dmp tables=test02

$ imp system/oracle file=/data/backup/export/test02_index.dmp indexfile=test02_index.sql full=y

$ vi test02_index.sql
열어서 tablespace 부분 수정해주고 스크립트 실행


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 끝




추가 사항

1. export 시
: buffer = evaluation buffer 크기 결정하는 파라미터
: recordlength = bufer의 내용을 OS파일로 내려쓸 때 사용하는 레코드의 크기를 결정하는 파라미터
→ 두 파라미터의 크기는 OS 블록의배수로 설정하기
: Array fetch → DB Buffer cache의 내용을 evaluation buffer 로 가져올때 한건씩 가져오는 것이 아니라 여러건의 데이터를 한꺼번에 가지고 옴

2. feedback=정수값
: 큰 데이터 exp/imp 할때 진행과정 보여주는 옵션

3. import 시 core dump/segmentation fault 에러 발생
: export 받은 DB와 import 하는 DB의 케릭터 셋이 다를 경우 발생
: 케릭터 셋을 일치시킨후 export 받는것이 정석
→ 이미 받아버린 덤프파일이라면 convert 프로그램을 이용하여 import 하는 곳의 케릭터 셋과 변경후 import 수행

현재 캐릭터 셋 확인 SQL
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';


4. Array Fetch : export시 DB Buffer cache의 내용을 한문장씩 evaluation buffer 로 가져오면 I/O 하는 회수가 많아져 느려진다.
evaluation buffer에 일정량의 데이터가 쌓이게 되면 한꺼번에 파일에 내려써 I/O 하는 회수를 줄여 속도를 높이는 방법.
Array insert : import시 1row씩 insert 하게되면 비효율적. 여러 건의 데이터를 한꺼번에 insert 하여 효율을 높인다.


5. import 시 "ABNORMAL END OF FILE" 에러 : export 받은 파일에 문제가있다. 다시 export 받아야 함.

6. sys 계정은 dictionary 객체들을 소유한다. 새로운 데이터베이스는 이미 고유의 dictionary를 가지고 있다.
sys 계정의 객체를 export/import 하는것은 아주 큰 위험 부담이 있고 부하도 많이 걸리는 작업이라
sys 계정은 export 를 수행할 수 없도록 되어 있다.

7. A소유의 테이블에 B가 인덱스 만들었다면, DBA권한으로 exp받을때 B의 인덱스도 함께 export 받을 수 있다.

8. Exp는 select와 동일한 원리 이므로 offline 이나 shutdown 상태에서는 사용할 수 없다.

9. exp시 tablespaces 옵션을 주었다 하더라도,
imp시 tablespace를 생성하고 table 을 만드는 것이 아니다.
imp 하길 원하는 서버에 tablespace 를 먼저 만들어 두고 imp를 해야 한다.

10. DB1 - scott 의 디폴트테이블스페이스 USERS
DB2 - scott 의 디폴트테이블스페이스 EXAMPLE. USERS 존재.
인상황에서 DB1 exp 받아서 DB2 imp 한다면 해당테이블은 어느 테이블 스페이스로 들어갈까?
DB1에서 지정되어있던 USERS 테이블스페이스로 들어간다.

11. DB1 - scott 의 디폴트테이블스페이스 TS_B
DB2 - scott 의 디폴트테이블스페이스 EXAMPLE. TS_B는 존재하지 않음.
인상황에서 DB1 exp 받아서 DB2 imp 한다면 해당테이블은 어느 테이블 스페이스로 들어갈까?
imp는 정상적으로 된다. 하지만 테이블스페이스는 DB2의 디폴트테이블스페이스인 EXAMPLE에 들어간다.

 

마이그레이션 기본방법
AS-IS서버(현재서버)와 TO-BE서버(이전할서버)의
① 사용자 계정과 각 사용자의 default tablespace를 동일하게 설정
② Privilege와 role을 동일하게 설정
③ schema 별로 exp 를 수행해서 imp를 수행
→ AS-IS 서버에 schema가 많을 경우 수동으로 하나하나 조사해서 받기 어렵기 때문에,
위의 실습 10번 스크립트를 활용하여 schema 별로 자동으로 export 받을 수 있는 스크립트 활용

 

CLOB의 경우

char → varchar2 → CLOB
2000 4000 2기가이상데이터

LOB : 하나의 컬럼에 크기가 큰 데이터
L arge
OB ject

 

CLOB : 글자로 구성
Character
L arge
OB ject



BLOB
Binary
L arge
OB ject



ex)
대본 tabale → users 테이블스페이스에 존재
--------------------
code 드라마명 대본
--------------------
....

대본 컬럼이 너무 커서 CLOB의 경우 컬럼하나만 별도의 테이블스페이스 지정해준다.
export 후 import 할경우 해당 테이블스페이스가 없으면 에러남 → 미리 생성해주기


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 시작
1. CLOB 컬럼을 포함한 테스트 테이블 생성
SQL> create tablespace ts_lob
2 datafile '~/ts_lob01.dbf' size 1M

SQL> create table scott.clobtest
2 (no number, name varchar2(10), contents clob)
3 lob(contents) store as (tablespace ts_log);

SQL> insert into scott.clobtest
2 values (1,'AAA','BBBBB');


2. 현재 LOB 목록 확인
col owner for a10
col table_name for a10
col column_name for a10
col segment_name for a30
col tablespace_name for a10
SQL> select owner, table_name, column_name, segment_name, tablespace_name
2 from dba_lobs
3 where table_name='CLOBTEST'


3. Export
$ exp scott/tiger table=cobtest file=clobtest.dmp

4. Import
해당 테이블스페이스 없으면 에러발생함
해당 테이블스페이스 생성후 import 해주기

SQL> create tablespace ts_lob
2 datafile '~/ts_lob01.dbf' size 1M

$ imp scott/tiger file=clobtest.dmp fromuser=scott ignore=y

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습 끝

Posted by redkite
, |

아카이브 복구

 

아래의 방법으로 하시면 됩니다.

- 현재 운영DB를 S, 복구대상 DB를 T라 하겠습니다.

1. S에서 Online Backup실행

$cd /data/work

$ sqlplus / as sysdba

SQL> @begin

SQL> alter database backup controlfile to '/data/oradata/emsdb/control.bak' reuse;

2. S의 DBF File Ftp

$ cd /data/oradata/emsdb

$ ftp 10.100.100.4

ftp > cd /data/oradata/emsdb

ftp > bin

ftp > prompt

ftp> hash

ftp > mput *

 

3. S에서 Online Backup종료 실행

$cd /data/work

$ sqlplus / as sysdba

SQL> @end

 

4. S의 DBF File Ftp

$ cd /data/oradata/emsdb

$ ftp 10.100.100.4

ftp > cd /data/oradata/emsdb

ftp > bin

ftp > prompt

ftp> hash

ftp > mput *

 

5. T에서 Backup받은 controlfile으로 변경

$ cd /data/oradata/emsdb

$ cp control.bak control01.ctl

$ cp control.bak control02.ctl

$ cp control.bak control03.ctl

 

6 T에서 복구 시작

$sqlplus / as sysdba

SQL> startup mount

SQL> recover database using backup controlfile until cancel;

auto

-> Archivelog을 이용 복구 진행후 더이상 복구할 Archive log가 없을때 종료

SQL.> alter database open resetlogs;

-> Open이 되지 않고 Error가 발생하는데 이유는 S는 10.2,0.3이고 T는 10.2.0.5라 Dictionary가 상이하여 발생

SQL> exit

 

7. T에서 Upgrade실행

$ sqlplus / as sysdba

SQL> startup upgrade

SQL> spool upgrade

SQL> @?/rdbms/admin/catupgrd

SQL> shutdown immediate

 

8. T에서 Invalid된 Object 재 Compile

$sqlplus / as sysdba

SQL> startup

SQL> @?/rdbms/admin/utlrp

Posted by redkite
, |

아카이브 모드 설정

오라클 아카이브 모드 설정하기(spfile, 10g 기준)

 


1. 운영 중인 오라클의 로그 모드를 확인 한다.

SQL> archive log list;
데이터베이스 로그 모드 아카이브 모드가 아님
자동 아카이브 사용 안함
아카이브 대상 USE_DB_RECOVERY_FILE_DEST
가장 오래된 온라인 로그 순서 54
현재 로그 순서 56

2. 관리자 계정으로 splplus 접속

SQL> alter system set log_archive_start=true scope=spfile;

SQL> alter system set log_archive_dest='원하는 경로' scope=spfile;

SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;

log_archive_format의 옵션

%S : redo 로그 시퀀스 번호를 표시하여 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.

%s : redo 로그 시퀀스 번호를 표시하지만 파일 이름 길이를 일정하게 맞추지는 않는다.

%T : redo 스레드 넘버를 표시하며, 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.

%t : redo 스레드 넘버를 표시하며, 파일 이름 길이를 일정하게 맞추지 않는다.


3. 데이터 베이스를 종료(normal, immediate, transactional)한 후에 재시작, 변경

sql>shutdown immediate;

sql>startup mount;

sql>alter database archivelog;

sql>alter database open;

4. 확인과정

SQL> archive log list;

SQL> alter system switch logfile; --설정한 경로에 파일이 생성되는지 확인해본다.

5. Noarchive mode로 전환하기

관리자 계정으로 접속

sql>shutdown immediate;

sql>startup mount;

sql>alter database noarchivelog;

sql>alter database open;

Posted by redkite
, |

아카이브 모드 변경

# NO 아카이브 모드로 변경
ALTER SYSTEM SET LOG_ARCHIVE_START = FALSE SCOPE=SPFILE;
alter database mount
alter database noarchivelog;
archive log list
alter database open;

# 아카이브 모드로 변경
select name, value from v$parameter
where name = 'log_archive_start'
or name = 'log_archive_dest'
or name = 'log_archive_format' ;

ALTER SYSTEM SET LOG_ARCHIVE_START = TRUE SCOPE=SPFILE;
archive log list
startup mount
alter database archivelog;
archive log list
alter database open;

Oracle에서 Online Backup을 받거나 완벽한 Recovery 작업을 수행하기
위해서는 DB를 Archive log mode로 운영하여야 한다.

Archive log mod 란?

우리가 오라클데이터베이스에 접속을해서 DML이나 DDL등의 명령어로 작업을 수행하면,
모든 작업의 기록이 리두로그파일에 저장이 된다.

작업의 양이 많아지면 리두로그파일에 기록하는 내용도 굉장히 많아지게 되고
그렇게 되면 데이터를 기록하기 위해서 리두로그파일을 늘려야 하는 일이 발생을 한다.

그런데 오라클 리두로그파일은 계속 증가하는것이 아니라 몇개의 리두로그파일을 만들어 놓고
번갈아 가면서 기록하는 구조로 되어 있다.(리두로그파일은 2개 이상있어야 한다.)

이렇게 번갈아 가면서 기록을 하게 되면 새로운작업의 내용이 예전의 작업내용을 덮어쓰므로
예전의 작업한 내용을 잃게 된다는 단점이 있다.

그래서 예전의 작업한 내용에 데이터 손실이 발생하면 복구하기 어렵다는 단점이 있다.

이런 단점을 해결하기 위한 방법이 리두로그파일의 내용을 다른 디렉토리에 자동으로 복사해서 저장하도록
운영하는 방법이다. 이렇게 운영하는 방법을 아카이브 로그 모드(Archive Log Mode)라고 한다.

오라클데이터베이스는 기본적으로 No Archive Log Mode이다. 그리하여 Archive Log Mode로 운영하기 위해서는
따로 설정을 해주어야 한다.




[ Oracle 8i 까지의 방법(Noarchive -> Archive) ]

텍스트로 만들어진 파라미터 화일을 사용하는 경우
Archive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1. initSID.ora file(ex. initORCL.ora)과 configSID.ora(ex. configORCL.ora)에 다음의 parameter가 이미 setting
되어 있는지 확인한 후에 없을 경우 initSID.ora 에 setting한다.

1) LOG_ARCHIVE_START = TRUE

* ARCH process 가 기동
* log switch 발생 시 automatic archive를 수행한다.
만약 이 parametrer가 false이면 manual archive를 실시하여야 한다.

2) LOG_ARCHIVE_DEST = /home/oracle7/dbs/archive_file/arc

* archive 장소의 디렉토리와 확장자를 포함하지 않는 파일명을 지정.
* 여기에서 archive_file까지는 directory이며 마지막에 있는 arc는
archive log file의 initial 명이다.
* 자신이 설치한 ORACLE_HOME/dbs/archive_file/arc 로 설정한다.

3) LOG_ARCHIVE_FORMAT = %s.log

* archive file의 확장자와 log sequence 번호의 형식을 지정.
* 이는 (2)에서 정의된 archive log의 initial file 명과 함께 나타난다.

[ 예 ] arc123.log, arc124.log
(123과 124는 log sequence number 이다.)
와 같은 형태의 화일이 생성된다.


2. 다음과 같이 작업하여 archive log mode로 변환한다.

$ svrmgrl

SVRMGR> connect internal
SVRMGR> startup mount - (1)
SVRMGR> alter database archivelog; - (2)
SVRMGR> archive log list - (3)
Database log mode ARCHIVELOG - (4)
Automatic archival ENABLED - (5)
Archive destination ?/dbs_ar/offline_log/offline - (6)
Oldest online log sequence 123 - (7)
Next log sequence to archive 125 - (8)
Current log sequence 125 - (9)
SVRMGR> alter database open; - (10)


(1) DB를 startup mount까지만 한다.
(2) 이 Command를 이용하여 archivelog mode로 DB를 변경한다.
(3) Archivelog mode로 변경되었는지를 확인한다.
(4) DB가 Archivelog mode임을 나타낸다.
만약 NOARCHIVELOG로 되어 있으면 변경되지 않은 것을 의미한다.
(5) initSID.ora file에서 LOG_ARCHIVE_START parameter를 TRUE로
정의하였음을 나타내며 false인 경우에는 DISABLED로 나타난다.
(6) initSID.ora file의 LOG_ARCHIVE_DEST parameter에서 정의한
archive할 장소이다.
(7) 3 개의 redo log 중 가장 오래된 redo log의 sequence가 123임을
의미한다.
(8) 다음에 archive 받을 file의 log sequence 번호를 나타낸다.
(9) 현재 사용 중인 redo log의 sequence가 125임을 의미한다.
만약 이전부터 archivelog mode로 운영 중이었다면 여기에서 archivelog
file은 log sequence 124까지 archiveing되어있다는 것을 의미한다.
(10) Archive mode로 변경 후 DB를 open한다.


[ Oracle 9i 부터의 방법(Noarchive -> Archive) ]

바이너리로 만들어진 파라미터 화일을 사용하는 경우
Archive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1. Parameter 확인

$sqlplus /nolog

SQL>connect sys/passwd@orcl as sysdba
Connected.
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Enabled
Archive destination /u01/oracle/dbs/
Oldest online log sequence 1
Current log sequence 3

SQL> select name, value from v$parameter
where name = 'log_archive_start'
or name = 'log_archive_dest'
or name = 'log_archive_format' ;

2. 다음과 같이 작업하여 archive log mode로 변환한다.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START = TRUE
SCOPE=SPFILE;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 89201304 bytes
Fixed Size 453272 bytes
Variable Size 67108864 bytes
Database Buffers 20971520 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Enabled
Archive destination /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence 1
Current log sequence 3
SQL> alter database archivelog;

Database altered.

SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3
SQL> alter database open;

Database altered.


[ Oracle 8i 까지의 방법(Archive -> Noarchive) ]

반대로, archivelog mode에서 no archivelog mode로 전환하는 방법은 다음과같다.
archivelog mode에서 no archivelog mode로 전환하기 전에 데이터베이스는 반드시
immediate 또는 normal 로 셧다운 되어야만 전환이 가능 하다.

먼저, 위에서 setting 했던 initSID.ora file 와 configSID.ora 에 있는
다음 parameter 앞에 # 을 넣고 저장한다.(주석처리!!)

#LOG_ARCHIVE_START = TRUE
#LOG_ARCHIVE_DEST = /home/oracle7/dbs/archive_file/arc
#LOG_ARCHIVE_FORMAT = %s.log

$ svrmgrl
SVRMGR> connect internal;
SVRMGR> shutdown immediate
SVRMGR> startup mount
ORACLE instance started.
Database mounted.
SVRMGR> alter database noarchivelog;
Statement processed.
SVRMGR> alter database open;
Statement processed.


[ Oracle 9i 부터의 방법(Archive -> Noarchive) ]

Noarchive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1. Parameter 확인

$sqlplus /nolog

SQL>connect sys/passwd@orcl as sysdba
Connected.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3

SQL> select name, value from v$parameter
where name = 'log_archive_start'
or name = 'log_archive_dest'
or name = 'log_archive_format' ;

2. 다음과 같이 작업하여 Noarchive log mode로 변환한다.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START = FALSE
SCOPE=SPFILE;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 89201304 bytes
Fixed Size 453272 bytes
Variable Size 67108864 bytes
Database Buffers 20971520 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> alter database noarchivelog;

Database altered.
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Enabled
Archive destination /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence 1
Current log sequence 3
SQL> alter database open;
Database altered.

'01.오라클 > 003.DB 백업 및 복구' 카테고리의 다른 글

[오라클]아카이브 복구  (0) 2012.12.19
[오라클]아카이브 모드 변경  (0) 2012.12.19
[오라클]VMware 백업 복구 작업  (0) 2012.12.19
[오라클]FlashBack  (0) 2012.12.19
[오라클]Data Pump  (0) 2012.12.19
Posted by redkite
, |

VMware 백업 복구 작업

아래 스크립트는 질문 올라온 것을 확인하고 노트북 vmware의 oracle 9.2.0.7 에서 만들어보았습니다.


온라인 백업은 말씀한 것과 같이 파라메터 파일 , 콘트롤 파일, 모든 데이터파일 , 아카이브로그를
백업후 다른 서버로 이동시키면 다른 서버로 복구할 수 있습니다.

하지만 online backup시에 datafile, controlfile만을 백업하므로 current redo log가 없으므로
until cancel 복구를 해야 합니다.(rman 백업도 마찬가지)

1) init파일,DB file, controlfile을 다른서버로 이동시킵니다.
보통 controlfile백업은 alter database backup controlfile to '~~'; 이렇게 하기 때문에
하나만 복사하므로 이것을 추가 복사해서 controlfile의 경로에 복사해줍니다.
2) init파일에 controlfile의 경로, background_dump_dest, user_dump_dest, core_dump_dest, log_archive_dest 를
경로에 맞게 지정해줍니다.
3) DB를 mount상태로 올립니다. 만약 mount하는 동안 에러가 난다면 controlfile에서
문제가 생겼으므로 controlfile의 백업을 확인합니다.
4) datafile, redolog file의 file_name을 변경합니다.
select name from v$datafile;
select member from v$logfile;
alter database rename file '현재경로' to '이동시킨 경로';
alter database rename file '현재경로' to '이동시킨 경로';
...
단 여기에서 tempfile은 백업대상도 아니고 rename이 안되므로 새로 생성해 주어야 합니다.
select name from v$tempfile;
select * from sys.props$;에서 default temporary tablespace를 찾거나
또는 select distiinct temporary_tablespace from dba_users 에서 찾습니다.
tempfile을 추가하는 방법은 더이상 말씀 안드립니다. NBR과정의 기본이니까요..
5) DB의 archive file을 log_archive_dest 에 설정된 곳으로 이동시키고 recovery를 수행합니다.
recover database until cancel using backup controlfile;
...
마지막 archvie까지 적용후 cancel하기
alter database open resetlogs;
resetlogs open하기


# 온라인 백업 스크립트(데이터파일, 컨트롤파일만 백업)
작업 이전에 /backup , /backup/control 이라는 디렉토리 생성

- 백업 메인
vi /backup/onbackup.sh
export LANG=C
export ORACLE_HOME=/u/ora9i/product/9.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=PROD

sh -x /backup/1_onbackup.sh
sh -x /backup/2_cp_backup.sh
sh -x /backup/3_control_backup.sh
sh -x /backup/4_offbackup.sh

- 백업 모드 변경
vi /backup/1_onbackup.sh
export LANG=C
export ORACLE_HOME=/u/ora9i/product/9.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=PROD

# backup mode on
sqlplus /nolog << EOF1
conn /as sysdba
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/backup_online.tmp
select 'alter tablespace '||tablespace_name||' begin backup;' from dba_tablespaces where status='ONLINE' and contents 'TEMPORARY';
spool off
!cat /tmp/backup_online.tmp|grep -v spool|grep -v SQL > /tmp/backup_online.sql
@/tmp/backup_online.sql
exit
EOF1

- 데이터파일 백업할 쿼리
vi /backup/2_cp_backup.sql

select 'mkdir /backup/'||to_char(sysdate,'YYYYMMDD_HH24MI') from dual;
select 'cp '||name||' /backup/'||to_char(sysdate,'YYYYMMDD_HH24MI') from v$datafile;

- 데이터파일 copy하는 스크립트
vi /backup/2_cp_backup.sh

# cp backup, mkdir /backup/SYSDATE directory
export LANG=C
export ORACLE_HOME=/u/ora9i/product/9.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=PROD

sqlplus /nolog << EOF2
conn /as sysdba
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/backup_script.tmp
@2_cp_backup.sql
spool off

!cat /tmp/backup_script.tmp |grep -v spool |grep -v SQL > /tmp/backup_script.sh
!chmod 755 /tmp/backup_script.sh
exit
EOF2
sh -x /tmp/backup_script.sh

- 컨트롤파일 백업

vi /backup/3_control_backup.sh

export LANG=C
export ORACLE_HOME=/u/ora9i/product/9.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=PROD

# controlfile backup
sqlplus /nolog << EOF3
conn /as sysdba
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/control_backup.tmp
select 'alter database backup controlfile to ''/backup/control/'||to_char(sysdate,'YYYYMMDD_HH24MI')||'.ctl'';' from dual;
spool off
!cat /tmp/control_backup.tmp |grep -v spool|grep -v SQL > /tmp/control_backup.sql
@/tmp/control_backup.sql
exit
EOF3

- 백업모드 offline하기

vi /backup/4_offbackup.sh

export LANG=C
export ORACLE_HOME=/u/ora9i/product/9.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=PROD

# backup mode off
sqlplus /nolog << EOF4
conn /as sysdba
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/backup_offline.spool
select 'alter tablespace '||tablespace_name||' end backup;' from dba_tablespaces where status='ONLINE' and contents 'TEMPORARY';
spool off
!cat /tmp/backup_offline.spool |grep -v SQL > /tmp/backup_offline.sql
@/tmp/backup_offline.sql
exit
EOF4


그리고 만약 파일리스트만 내리고 veritas netbackup으로 백업이 가능하다면 아래와 같이 하면
됩니다. veritas netbackup에서는 file리스트만 파일로 떨구면 그 파일을 백업해줍니다.

archvie backup은 아래와 같이 하면 되는데 아래는 archive file의 backup list만 만듭니다.
수정해서 backup list에서 YYYYMMDD_HH24MI의 분단위 디렉토리를 만들고 archive file을
다른 서버로 cp복사하도록 하면 됩니다. 꼭 아래 스크립트는 테스트 후에 사용하시길
바랍니다...

# 데이터파일 백업과 archvie백업 쉘은 아래와 같습니다.

1. begin backup할 스크립트를 수행합니다.
dbbegin.sh

TBS_INFO=/tmp/tbs_info~.$$

sqlplus /nolog << EOF > $TBS_INFO 2>&1
connect / as sysdba;
select 'tablespace '||tablespace_name from dba_tablespaces;
disconnect;
exit
EOF

cat $TBS_INFO | awk ''$1 == "tablespace" { print $2 }'' | while read LINE
do
export LINE
echo "Issuing alter tablespace $LINE begin backup;"
/usr/openv/netbackup/oracle/table_begin.sh
done

\rm $TBS_INFO

2. 위에서의 table_begin.sh 는 아래와 같습니다.

table_begin.sh

sqlplus /nolog << EOF > /dev/null 2>&1
connect / as sysdba;
alter tablespace $LINE begin backup;
disconnect;
exit
EOF

3. dbbegin.sh 을 하게 되면 테이블스페이스가 backup mode가 됩니다.

4. 데이터파일 리스트를 추출합니다.
datafile_list

#!/bin/ksh

DATAFILE_INFO=/tmp/datafile_info~.$$
datafile_list=/tmp/PROD_data_list

sqlplus /nolog << EOF > $DATAFILE_INFO 2>&1
connect / as sysdba;
select ''datafile_name ''||file_name from dba_data_files;
select ''logfile_name ''||member from v\$logfile;
select ''controlfile_name ''||name from v\$controlfile;
disconnect
EOF

cat $DATAFILE_INFO | awk ''$1 == "datafile_name" {print $2}''

/tmp/PROD_dbfile_list

cat $DATAFILE_INFO | awk ''$1 == "logfile_name" {print $2}''

/tmp/PROD_logfile_list

cat $DATAFILE_INFO | awk ''$1 == "controlfile_name" {print $2}''

/tmp/PROD_controlfile_list


cat /tmp/PROD_dbfile_list > $datafile_list
cat /tmp/PROD_logfile_list >> $datafile_list
cat /tmp/PROD_controlfile_list >> $datafile_list

\rm $DATAFILE_INFO

5. 데이터파일 리스트를 netbackup에서 tape백업을 하도록 합니다.
veritas netbackup에서 리스트만 주면 백업해줌..

6. end backup 을 만드는 스크립트를 수행
dbend.sh
#!/bin/ksh

TBS_INFO=/tmp/tbs_info~.$$

sqlplus /nolog << EOF > $TBS_INFO 2>&1
connect / as sysdba;
select ''tablespace ''||tablespace_name from dba_tablespaces;
disconnect;
exit
EOF

cat $TBS_INFO |awk ''$1 == "tablespace" { print $2 }''|while read LINE
do
export LINE
echo "Issuing alter tablespace $LINE end backup;"
/usr/openv/netbackup/oracle/table_end.sh
done
\rm $TBS_INFO

7. 위에서 table_end.sh 는 아래와 같습니다.

table_end.sh
sqlplus /nolog << EOF > /dev/null 2>&1
connect / as sysdba;
alter tablespace $LINE end backup;
disconnect;
exit
EOF

6. archive log가 없을 수 있으므로 수동으로 log switch 해줍니다.

arch_list_1
#!/bin/ksh

sqlplus /nolog << EOF > $LOG
connect / as sysdba;
alter system switch logfile;
disconnect;
exit;
EOF

7. archvie file의 리스트를 뽑아냅니다.

arch_list

#!/bin/ksh

TBS_INFO=/tmp/tbs_info~.$$
ARCHIVE_DIR=/tmp/PROD_archive_dir.txt

sqlplus /nolog << EOF > $LOG 2>&1
connect / as sysdba;
alter system switch logfile;
disconnect;
exit;
EOF

sqlplus /nolog << EOF > $TBS_INFO 2>&1
connect / as sysdba;
archive log list;
disconnect;
exit;
EOF

cat $TBS_INFO | awk ''$1 == "Archive" {print $3}'' > $ARCHIVE_DIR

ARCH_DIR=
cat $ARCHIVE_DIR

ARCH_LIST_PROD=
ls -ltr $ARCH_DIR/*.arc |wc -l

echo "ARCH_LIST_PROD : $ARCH_LIST_PROD" >> $LOG

ARCH_LIST_PROD_1=
expr$ARCH_LIST_PROD - 1

echo "ARCH_LIST_PROD_1 : $ARCH_LIST_PROD_1" >> $LOG

/usr/bin/ls -ltr $ARCH_DIR/*.arc |awk ''{print $9}'' |head -
$ARCH_LIST_PROD_1 > /tmp/PROD_arch_list

echo "Archive Log List Print.....O.k....
/usr/bin/date +%c
" >> $LOG
#\rm $TBS_INFO $ARCHIVE_DIR

8. 위에서 /tmp/PROD_arch_list에 있는 archive리스트를 veritas netbackup에서 넣어주면 tape백업이 됩니다.그리고 특이한 것은 archvie file은 archive file을 백업했으면
지우도록 설정하면 되겠지요.

https://kr.forums.oracle.com/forums/thread.jspa?threadID=419569

 

'01.오라클 > 003.DB 백업 및 복구' 카테고리의 다른 글

[오라클]아카이브 복구  (0) 2012.12.19
[오라클]아카이브 모드 변경  (0) 2012.12.19
[오라클]아카이브 모드 변경  (0) 2012.12.19
[오라클]FlashBack  (0) 2012.12.19
[오라클]Data Pump  (0) 2012.12.19
Posted by redkite
, |

Flashback

1.1. Flashback이란?

사용자 실수에 의한 손상된 데이터를 Database의 크기와 상관없이 복구를 할수 있는기능이다. 이 Flashback 기능은 일반적인 복구에서 우려되는 데이터베이스의크기를 걱정하지 않아도 된다.

보통의 사용자 실수는 커다란시스템 장애가수반되며, 이를 복구하기 위해서는많은 자원과 시간이 필요하다. 하지만 9i에서 지원되는 flashback query와 10g에서 지원하는 다양한 flashback을통하여 손쉽게 사용자실수를 손쉽게 복구한다.

Oracle 9i 부터는 AUM 환경하에서 Flashback 기능을 이용하여 잘못된 DML operation 으로 인한 복구를 쉽게 할 수 있다. 물론 이전까지 했던 방법인 Point in Time Recovery 또한 유효하다.

△ 9i : Flashback query
△ 10g : Flashback Database
Flashback Drop
Flashback Version Query
Flashback Transaction Query
Flashback Table
Oracle Flashback Feature는 10g Standard Edition에서는 지원하지 않는다.

Note : 여기서 한 가지 짚고 넘어갈 점은 Flashback table, Flashback Database, Flashback Drop, Flashback Version Query, Flashback Transaction Query는 아래의 표와 같이 각기 다른 영역을 사용한다는 점이다.

Flashback Technologies

Flashback Operation

Implementation

Flashback Database

Flashback logs + Redo logs

Flashback Drop

Recycle bin

Flashback Version Query

Undo

Flashback Transaction Query

Undo

Flashback Table

Undo

1.2. Flashback(9i)

1.2.1. Flashback Overview

- Oracle 9i New features
- Flashback은 사용자가 Database의 과거 시점의 Consistent view를 볼 수 있게 해준다.
- 사용자들은 System time or SCN 를 기초로 Read-only view를 생성할 수 있다.
- 그 시점의 Transaction committed 부분만 볼 수 있다.
- Self-service repair를 가능하게 해준다.
- DDL은 지원하지 않는다.
- Flashback은 AUM (Automate Undo Management) 사용시만 가능하다.
- Undo 정보는 System level의 Undo retention 기간 동안만 유지한다.
- Flashback은 Session level에서 Enabled 할 수 있다.
- Flashback 기능을 disable 하기 전에 open된 PL/SQL cursor를 이용하면 disable 시킨 후에는
DML를 통해서 self-service repair를 할 수 있다.

▲ Undo Retention 지정
SQL> connect /as sysdba
SQL> alter system set undo_retention = <seconds> ;

이 parameter은 dynamic하게 변경이 가능하며 initSID.ora에 지정할 수 있다.
undo_retention은 각 Site별로 업무 성격 및 Undo Size에 따라서 적절하게 산정해서 명시해 준다. 또한 undo_management=auto 인지 확인한다.

▲ 권한 부여
SQL> grant execute on dbms_flashback to scott;

1.2.2. 예제 1 (AS OF SCN)

▲ SCOTT session에서 SYSTEMSTAMP를 이용하여 현재 시간을 조회하시오.

▲ SCOTT 소유의 Table에서 부서번호가 20인 부서원, 부서정보를 모두 삭제, Commit 하시오.

▲ 삭제된 Data가 잘 못 삭제된 것을 알게 되었다. 삭제된 Data를 다시 되살리고자 한다.

1.2.3. 예제 2 (AS OF TIMESTAMP)

▲ HR_TEST01 session에서 SYSTEMSTAMP를 이용하여 현재 시간을 조회하시오.

▲ 삭제된 Data가 잘 못 삭제된 것을 알게 되었다. 삭제된 Data를 다시 되살리고자 한다.

1.2.4. 예제 3 (Package, SCN / timestamp)

▲ HR_TEST01 session에서 SYSTEMSTAMP를 이용하여 현재 시간을 조회하시오.

▲ 삭제된 Data가 잘 못 삭제된 것을 알게 되었다. 삭제된 Data를 다시 되살리고자 한다.

※ 또는, 위 내용을 Procedure를 생성해서 복구 할 수도 있다.(flash.sql)

Flashback을 이용해 과거 데이터 복구
SQL> @flash /* exam_flash procedure 생성 */
SQL> exec exam_flash

1.3. Flashback(10g)

1.3.1. Flashback Database

Flashback Database 개요

Oracle Database 10g 이전까지는 transactional point-in-time recovery를 위해서는 backup용 file과 redo log file을 이용하여 원하는 시간까지의 복구를 하였었다. 그러나 이 방법은 backup용 file이 오래된 것이며, archive log가 많이 쌓여 있을 때는 많은 시간이 소요된다. Oracle Database 10g부터는 flashback database를 이용하여 좀 더 빠른 recovery가 가능하게 되었다.

Flashback Database는 오라클 데이터베이스를 과거 시점으로 되돌리고, 논리적인 데이터 손상 또는 사용자 실수로 인해 발생한 문제를 해결할 수 있게 한다. Flashback Database는 데이터베이스를 위한 '되감기 버튼'과도 같다. 데이터베이스 백업본을 이용하여 복구 작업을 수행하지 않고도 데이터베이스를 과거의 시점으로 되돌릴 수 있다. 포인트-인-타임 복구 작업에는 테이프에 저장된 데이터베이스 백업을 복구하는 시간이 불필요하므로, 한층 신속한 복구가 가능하다.

Flashback Database 기능은 RMAN, SQL*Plus에서 FLASHBACK DATABASE 커맨드를 이용하여 실행되며, 그 효과 면에서 일반적인 포인트-인-타임 복구 방식과 매우 유사하다. 이 기능을 이용하면 과거 특정 시점으로 데이터베이스의 상태를 되돌릴 수 있다. Flashback Database 기능을 활성화하려면, 먼저 Flash Recovery Area를 설정해야 한다. Flash Recovery Area는 Oracle Database 10g에 추가된 새로운 기능으로, 오라클 데이터베이스 복구 관련 파일 및 작업을 위한 통합적인 저장 공간으로 활용된다. 복구 영역에는 Flash Database 로그 이외에도 아카이브 리두 로그, RMAN 백업 등이 저장된다.

오라클은 Flash Recovery Area 내에 Flashback Log를 자동 생성/관리 한다. Flash Recovery Area에는 쿼타(quota)가 설정되며, 따라서 Flashback Log에는 공간 제한이 적용된다. Flashback Log의 사이즈는 로그 저장 기간 동안의 데이터베이스 변경 과정에서 발생한 읽기/쓰기 작업량에 따라 크게 달라진다. 오래된 블록 버전의 복사본은 Flashback Log에 기록된다. 하루 동안 10%의 데이터베이스 블록이 업데이트되었다면, 24 시간 동안의 Flashback Log 사이즈는 전체 데이터베이스 용량의 10 분의 1 수준이 될 것이다. 데이터베이스를 과거 시점으로 복구하는 과정에서 더 많은 디스크 공간이 필요한 경우, DBA는 디스크 쿼타를 다이내믹하게 확장할 수 있다.

Flashback database의 사용 용도는 logical data corruption이나 user error시 유용하다.
(Physical data corruption은 H/W 문제이기 때문에 Flashback database로 recovery는 불가능하다.) Flashback Database의 장점은 기존의 traditional point-in-time recovery에 비해 매우 빠른 recovery가 가능하다는 것이다. 이러한 빠른 성능을 낼 수 있는 이유는 flashback database는 database의 크기에 비례해서 recovery시간이 늘어나는 것이 아니라, 변경된 data의 양에 비례해서 recovery시간이 걸린다는 점이다.

위의 그림, 앞의 설명과 같이 Flashback Database는 매우 빠른 시간의 recovery를 가능하게 한다.

Flashback Database를 수행하기 위한 3가지 구성요소

1. Archive Mode
Flashback Database 기능을 적용하기 위해서는 Archive Mode로 설정하여야 한다.

2. Flashback Log File
Flashback Log File은 오라클 Database를 구성하는 Block(변경되기 이전의 이미지 Block)을 저장하는 로그 파일로서 10g에서 새롭게 소개되고 있는 데이터베이스 복구영역(database recovery area)에 생성되어진다.
기존의 redo log와의 차이점 - redo log의 경우에는 archive할 수 있는 기능이 함께 제공되었지만, Flashback Log는 archive 기능이 따로 제공될 필요가 없다.(db_recovery_file_dest, db_recovery_file_dest_size)
- Flashback Log의 경우에는 물리적인 database 복구에는 사용될수 없다는 점이다.

3. RVWR Background Process
Flashback Database 기능이 활성화 되어지면, rvwr이라는 background process가 시작된다.

역할 : Flashback Database Data를 Flashback Log에 기록

• Flashback Database 테스트

Database 에 Flashback 기능이 ON 되어 있는지 확인한다.

Test Case 생성

Flashback Database 를 위해 Instance 를 종료시킨다.

Flashback Database 를 위해 Instance 를 Mount 시킨다.

원하는 시점으로 되돌아 가기 위해 조금전에 기록했던 SCN 으로 Flash Back 한다.

Database 를 read only로 open 하여 Data를 확인 후에, Resetlogs 로 Open 하여 truncate 전의 데이터를 복구한다.

관련 view
V$FLASHBACK_DATABASE_LOG;
V$FLASHBACK_DATABASE_STAT;

1.3.2. Flashback Drop

사용자와 DBA 모두에게 있어 실수로 오브젝트를 드롭(drop) 처리하는 경우는 흔하게 발생한다. 사용자들이 실수를 깨달았을 때에는 이미 때가 늦다. 과거에는 이렇게 드롭 처리된 테이블, 인덱스, 제약조건, 트리거 등을 쉽게 복구할 수 있는 방법이 없었다. Flashback Drop은 Oracle Database 10g 환경의 오브젝트 드롭 작업을 위한 안전망을 제공한다. 사용자가 테이블을 드롭하면, 오라클은 드롭된 오브젝트를 Recyble Bin에 보관한다.

△ 10g에서 DROP TABLE을 하게 되면 기본적으로 실제 그것을 DROP 하는 것보다 RECYCLE BIN에 이동 시키거나 이름을 바꾸게 된다.
△ Drop 된 Table을 복구한다.
△ Drop table이 완전 drop 되지 않고, window의 휴지통과 같은 recyclebin에 보관된다.
△ 이 drop된 table은 완전 삭제를 위해서는 purge 작업이 필요하며, space가 부족한 경우에는 자동 reuse된다.
△ Drop되어 recyclebin에 있는 bin$xxxxxx table에 대한 직접조회도 가능함.
△ 관련 view
- dba_recyclebin, user_recyclebin
△ 관련 parameter
_recyclebin = FALSE : recyclebin 기능을 사용하지 않는 경우 False로 지정
△ 제약사항 : table이 system tablespace에 있는 object는 복구 불가.
locally managed tablespace에 위치해 있는 table만 복구 가능.
Table이 복구되면 그 table의 index, trigger 등의 연관된 object도 함께 복구된다.
(bitmap join index제외)
Partioned index-organized table은 recycle bin에 의해 보호 받지 못한다. recycle bin은 참조 무결성을 보장하지 않는다.

• 예제 1

1) Table을 drop 하기 (장애 만들기)

2) Drop된 Table 복구하기 1

3) Drop된 table 복구하기 2 (동일 이름의 table이 이미 있는 경우, 다른 이름으로 복구하기)

Drop된 table 완전 삭제하기

SQL> drop table scott.emp purge; -- drop 시 바로 purge하는 경우
SQL> purge recyclebin;
or
SQL> purge dba_recyclebin;
or
SQL> purge table scott.emp

아래는 몇가지 PURGE 옵션의 예 입니다.

PURGE TABLE tablename;

Specific table

PURGE INDEX indexname;

Specific index

PURGE TABLESPACE ts_name;

All tables in a specific tablespace

PURGE TABLESPACE ts_name USER username;

All tables in a specific tablespace for a specific user

PURGE RECYCLEBIN;

The current users entire recycle bin

PURGE DBA_RECYCLEBIN;

The whole recycle bin

• 예제 2

휴지통(recyclebin)에 같은 이름의 table이 여러개 있을 때 PURGE and FLASHBACK TO BEFORE DROP 방법

같은 이름을 가지는 table이 휴지통(recyclebin)에 하나 이상있을 경우 다루는 방법입니다. table을 PURGE 하는 경우 가장 오래된 table이 휴지통에서 PURGE 되고 table을 restore(FLASHBACK BEFORE DROP)하는 경우 가장 최근의 table이 저장됩니다.

Example
========
5개의 table을 생성하고 drop 하자..

만일 table t1 을 purge 한다면 dropscn=2039107 가 purge 될것이다.

만일 table t1 을 restore 한다면 dropscn=2039252 이 restore 할 것이다.

=>이 문제를 해결하기 위해서..
================================
이 문제를 극복하기위해서 우리는 original 이름 대신에 drop된 object name을 사용하면 된다. object name 은 unique 하므로 원하는 것을 purge 와 restore 할 수 있다.

비슷한 방법으로 purge 할수 있다.

1.3.3. Flashback Versions Query

△ 과거의 어떤시점의 정보를 시간과 SCN(SystemChange Number)를 이용하여 Query하는 기능.
△ 9i 부터지원된 Flashback Query가 있으며, 10g에서는 그 기능이 확장되어 Versions between을 이용해서 일정시점이 아닌 시간간격의 데이터를 조회할 수 있는 기능.
△ Flashback versions query에 의해 추출된 row들은 transaction에 의해 변화된 row들의 history를 보여줌. 이 기능은 data가 어떻게 바뀌었는지 auditing 기능을 가능하게 하며 commit된 데이터만 추출 함.
△ Flashback versions query를 통해서 알수 있는 transaction id를 통하여 더 추가적인 정보를 Flashback Transaction Query를 통해 얻을수 있다.
△ DDL이 수행되어 table의 구조가 바뀌면 사용불가.
△ Flashback versions query는 undo를 이용하여 과거 데이터를 읽어오는 것은 undo_retention 값과 undo size에 의해 자동으로 관리됨. 만약 undo_retention이 아주 크다고 하더라도, undo size가 작아서 undo를 보관하지 않고 재사용하게 되면 flashback versions query가 수행되지 않을 수 있음.
△ Versions between은 시간과 SCN으로 지정 할 수 있음
△ 이기능을 지원하기 위해 scn_to_timestamp 와 timestamp_to_scn function이 지원된다.

• 과거의 시점에 대한 SCN 확인.

• 과거의 SCN을 이용하여 Time 확인.

△ Versions Query의 Pseudo column (Select절에 사용할 수 있음)
• Versions_startscn,
• Versions_starttime
• Versions_endscn
• Versions_endtime
• Versions_xid
• Versions_operation
△ 주의 : undo retention 보다 이전의 version을 query하면 ora-30052 : invalid lower limit snapshot expression 발생함.

• 예제

Data 변경(Update) 하기


2007 2월 25일 15시 50분 ~ 16시 00분 까지 empno가 7934인 data가 변한 내역조회

1.3.4. Flashback Query

Oracle9i에서 처음 소개된 Flashback Query는 과거 시점의 데이터를 조회하는 기능을 제공한다. 기본적으로 데이터베이스는 가장 최근에 커밋된 데이터를 기준으로 작업을 수행한다. 하지만 과거의 특정 시점을 기준으로 데이터베이스를 조회하고자 한다면, Flashback Query 기능을 이용할 수 있다. Flashback Query는 특정 시점 또는 SCN(System Change Number)을 기준으로, 해당 시점에 커밋된 데이터를 조회할 수 있게 한다. Flashback Query 메커니즘은 Automatic Undo Management를 이용하는 경우 가장 효과적으로 동작한다.

오라클 데이터베이스는 언두(undo)를 중요한 데이터베이스 오브젝트로 관리한다. 언두 데이터는 영구적으로 저장/관리되며 데이터베이스 시스템에 크래쉬, 셧다운이 발생하는 경우에도 유지된다. 또 다른 데이터베이스 오브젝트와 함께 데이터베이스 버퍼 캐시를 공유하므로 성능 보장이 가능하다. 오라클 데이터베이스는 트랜잭션이 커밋된 이후에도 언두 데이터를 관리하고, 필요한 경우 논리적 손상으로부터 복구할 수 있게 한다.

오라클 데이터베이스의 관리자는 보존할 언두 데이터의 양을 명시적으로 지정할 수 있다. 시스템은 새로운 트랜잭션의 언두 데이터를 생성하기 위해 만료된 언두 데이터를 자동으로 삭제한다. 언두 데이터의 보존 기간은 롱-러닝(long-running) 쿼리의 실행 시간 또는 논리적 손상에 대한 복구 요구사항에 따라 다르게 설정된다. 또는 언두 보존 기간을 설정하지 않고 데이터베이스가 알아서 최적의 보존 정책을 관리하도록 할 수도 있다. 그러면 데이터베이스는 롱-러닝 쿼리에 대한 실행 시간과 논리적 손상의 복구를 최대한 보장할 수 있는 방안을 자동으로 적용한다. 디폴트 상태에서 언두 데이터의 보존은 보장되지 않는다. 시스템은 현재 진행 중인 트랜잭션의 언두 데이터 기록을 위해 필요한 경우, 언제든 오래된 언두 데이터를 만료 처리할 수 있다.

10g R1부터는 UNDO_RETENTION이 5 일 이상으로 지정되어 있는 경우, 5 일 또는 그 이상 경과한 과거의 데이터를 쿼리할 수 있는 기능이 추가되었다. 오라클은 Undo Tablespace 데이터파일에 충분한 공간이 남아 있는 한, 언두 데이터를 유지한다. 데이터베이스에서 Flashback Query와 기타 언두 데이터 관련 플래시

1. 데이터베이스가 Undo Tablespace를 사용하고 있는지 확인한다. Undo Tablespace를 사용하려면 UNDO_MANAGEMENT 초기화 매개변수를 AUTO로 설정해 놓아야 한다.
2. 가장 긴 실행 시간을 갖는 쿼리를 성공적으로 복구할 수 있는 시간, 또는 사용자 에러로부터 복구하기에 충분한 시간으로 UNDO_RETENTION 초기화 매개변수를 설정한다.
3. 만료되지 않은 언두 데이터가 덮어씌워지지 않도록, 언두 테이블스페이스에 RETENTION GUARANTEE 조건을 추가한다.

Flashback Query 기능을 이용하면 과거의 데이터 시점의 데이터를 확인할 수 있을 뿐 아니라 데이터를 처리하는 방법을 선택하는 것도 가능하다. 분석 작업을 수행한 후에 모든 변경 작업을 취소하거나, 변경 데이터를 캡처하여 다른 작업에 활용할 수도 있다. Flashback Query 메커니즘은 다양한 상황에서 활용될 수 있는 유연성을 제공한다. 몇 가지 활용 예가 아래와 같다:

• 과거 시점의 데이터를 조회.
• 현재 데이터와 과거 데이터를 비교. (개별 로우를 비교하거나 Intersection, Union 등의 조건을 이용하여 복잡한 비교 작업을 수행할 수도 있다.)
• 삭제, 변경된 데이터의 복구.

△ Oracle9i에서 부터 지난 시점의 데이터를 질의 하기 위한 DBMS_PACKAGE를 제공 했으며 10g에서는 훨씬 기능을 유연하게 발전 시켰다.
△ Flashback Query는 AS OF 절을 사용하여 해당 시점에서의 데이터 값에 대한 질의가 가능하며, 이 기능은 DBMS_FLASHBACK 패키지의 기능과 유사하다.
△ Flashback versions query는 과거의 일정 시간구간에서 조회하는 것에 비해 Flashback query는, 과거의 일정한 시간에서 query를 하는 것.
△ Database는 현재의 시간이지만, 수행하는 SQL은 혼자 과거의 정보를 보게 됨.

• 예제

-- Data 삭제(장애 만들기)

-- 1시간 전 Data를 구하기

-- 1분 전 Data를 구하기
※ delete 후 바로 조회하면 아직 delete 되지 않은 것으로 보인다.

-- 1시간전 Data와 현재 Data의 차이를 알고 싶을때.
-- 즉, 1시간전과 같지 않은 데이터를 모두 찾는다.

※ 1시간 전의 Table을 Backup 해 놓을수 있다.

-- 급하게 복구를 해야 할때. 약 1시간전에 많은 건수를 삭제한 경우.

1.3.5. Flashback transaction query

테이블의 데이터 변경 작업이 잘못 수행되었음을 나중에야 발견하는 경우가 있다. 변경 내역을 조사하기 위해, DBA는 플래시백 쿼리를 실행하여 특정 시점의 로우 데이터를 조회할 수 있다. 또는 좀 더 효율적인 방법으로, Flashback Versions Query 기능을 이용하여 일정 기간 동안의 로우 변경 내역과 트랜잭션 ID를 한꺼번에 확인할 수도 있다. 이때 DBA는 SELECT 구문에 VERSIONS BETWEEN 절을 적용하고, SCN 또는 타임스탬프를 기준으로 일정 기간의 로우 변경 히스토리를 조회한다.

문제가 되는 트랜잭션을 발견했다면, 다시 Flashback Transaction Query 기능을 이용하여 해당 트랜잭션에 의해 수행된 다른 변경 사항을 확인한다. 그리고 변경 사항을 복구하기 위한 언두(undo) SQL을 요청한다. 이때 트랜잭션 히스토리와 언두 SQL을 확인하기 위해 사용되는 것이 바로 FLASHBACK_TRANSACTION_QUERY 뷰이다.

잘못 실행된 트랜잭션을 완전히 취소하기 위해, 언두 SQL 구문을 수동으로 실행하고 사용자/애플리케이션 에러를 쉽게 복구할 수 있다. Flashback Transaction Query는 데이터베이스의 온라인 진단 범위를 확장하고, 분석 및 트랜잭션 감사 환경을 개선할 수 있게 한다.

△ VERSIONS_XID 값이 트랜잭션의 ID라고 했는데, 이 값을 FLASHBACK_TRANSACTION_QUERY의 인자 값으로 줘서 쿼리를 실행 하면 해당 트랜잭션에 대한 정보를 볼 수 있다.
예를 들면 어떤 DML을 이용했으며 어떠한 SQL이 실행 되었는지 하는 것이 확인 가능하다.
△ Flashback transaction query는 Transaction level에서 Data의 변경사항을 추적하기 위한 기능
△ Transaction의 분석과 진단을 하는 기능 임.
△ 변경사항 뿐만 아니라, Undo SQL을 생성할 수 있으며, 이 SQL을 이용하여 Transaction level의 작업을 rollback할 수 있음
△ undo data를 index access 방식으로 조회하므로 logminor
주의 : xid column에 조건을 줄 때 반드시 hextoraw function을 사용해야 만 fixed view의 index를 사용함.
△ Flashback versions query와 마찬가지로 undo data를 이용함.
△ Flashback Transaction query를 사용하기 위해서는 Database level에 logging이 enable되어야 한다.
alter database add supplemental log data;
확인방법 : select supplemental_log_data_min from v$database ( YES 가정상)
△ 필요 권한 : grant select any transaction to XXX;
△ 기본적으로 flashback_transaction_query 라는 view table을 이용하여 query한다.
△ flashback_transaction_query columns.

• Database level에 logging이 enable되어있는지 확인 한다.

• emp와 dept를 각각 수정한 후, 이에 대한 transaction query를 하는 예제.

-- flashback versions query를 이용하여 xid를 찾는다.

-- 해당 Transaction을 rollback하기 위해서는 아래와 같이 undo_sql을 수행한다.

1.3.6. Flashback Table

Oracle9i Database에는 Flashback 질의 옵션 개념이 도입되어 데이타를 과거의 시점에서부터 검색하지만, 테이블 삭제 같은 DDL 작업을 순간적으로 되돌릴 수는 없습니다. 이 경우 유일한 수단은 다른 데이타베이스에서 테이블스페이스 적시 복구를 사용한 다음, 엑스포트/임포트 또는 기타 메서드를 사용해 현재 데이타베이스에 테이블을 다시 생성하는 것입니다. 이 프로시저를 수행하려면 복제를 위해 다른 데이타베이스를 사용하는 것은 물론, DBA의 많은 노력과 귀중한 시간이 요구됩니다.

하지만 Oracle Database 10g의 Flashback 테이블 기능으로 들어가면 몇 개의 문만 실행하여 삭제된 테이블을 간단히 검색할 수 있습니다.

△ Flashback Table은 잘못된 데이터 처리를 한 경우, 작업전의 시점으로 빠르게 돌려주기 위한기능. (SCN or 시간)
△ Flashback Table 명령을 통해 개별적인 테이블에 대해 시간에 준한 복구를 위해서는 아래에 있는 조건을 만족 해야 합니다. 테이블의 데이터에 대해 과거 시점으로 돌아가서 값들을 확인 하는 것이 가능 합니다.
△ Flashback any table 또는 해당 Table에 대한 Flashback object privilege를 가지고 있어야 합니다.
△ 테이블에 대한 SELECT, INSERT, DELETE, ALTER 권한이 있어야 합니다.
△ ROW MOVEMENT의 경우 테이블에 대해 ALTER TABLE tablename ENABLE ROW MOVEMENT;가 설정 되어 있어야 합니다.
△ Backup의 restore없이 Table을 지정한 시점까지 되돌려 줌.
△ Table의 데이터만을 과거시점의 데이터로 돌려주며, Table과 관련한 모든 object (index, constrains, trigger)등은 현재시점으로 유지됨
△ Table이 Flashback 하는 동안에는 exclusive lock을 잡게됨.
△ Flashback 한후, 다시 현재 시점의 Data로 돌아올 수 있음. 그러나 현재의 SCN을 알고 있어야 함.
SELECT current_scn FROM v$database; -- 현재 SCN알기
△ 다음의 Object들에는 Flashback table 안됨.
Cluster, Mview, AQ tables, static data dictionary, system tables, remote tables
△ Undo Data를 이용함.
△ undo retention 이전의 데이터는 복구 안됨.
△ flashback versions query로부터 원하는 SCN을 찾아서 flashback table을 할 수 있음.
(VERSIONS_STARTSCN, VERSIONS_ENDSCN)
△ 필요 권한 : flashback object, flashback any table, 해당 table에 대한 select, insert, update, delete, alter table 권한.
△ flashback table을 하기 위해서는 row movement 를 enable해 주어야 함.
alter table XXXX enable row movement;
△Table에 DDL의 변경 작업이 있었다면, flashback 불가 (moving, truncate, add, modify, drop,merging, split, coalescing)

• Flashback Table 예제: SCN을 이용한 과거시점으로 Flashback 하기

1.3.7. Flashback Use Case

• 장애의경우에 따라 Use Case를사용하여 신속히 복구한다.

장애 Case

Case 상세

복구 방법

Table이 Drop된경우

 

Recyclebin을 조회하여 drop한 table의 복구가능성을 확인 한다.
Flashback Drop을 이용하여 복구 한다.

Table에 데이터를 잘못
변경하고 commit한 경우

많은 데이터 변경시

변경시점으로 Table을 flashback하는 방법.

적은 데이터 변경시

Table에 대해 Version query를 이용하여 해당data의 변경 tx를 찾는 방법.

Program이 잘못 수행되어 여러개의 table에 변경되었을 경우.

Commit이
한번일 경우

하나의 Table에서, 변경된 Data에 대한 Versions query를 하여 Transaction을 찾은 후, Transaction에 대한 undo를 뽑아 복구.

Commit이 여러 번인 경우

Flashback query를 통해 여러 Table을 Select하여 backup본 구성.

데이터에 대한 변경이력 추적시

 

Flashback Version Query를 이용하여 변경 이력 추적

Pro-Active Tuning Service 소개

1. 실제 사용자(End-User) 관점의 응답시간 튜닝

Pro-active tuning service는 사용자 관점의 모니터링 및 분석을 통하여 실제 End-User가 느끼는 응답시간(Response Time)을 튜닝합니다. APM(Application Performance Management) 툴을 이용하여 End-User의 Request 결과를 반환받기까지의 모든 구간(Client PC, Internet 구간, FireWall, DNS, Web Server, WAS, DBMS) 을 분석하여 가장 Delay Time 이 많이 소요된 구간을 찾아 냅니다.

2. 최상의 성능 상태로 비즈니스 고가용성을 유지

Pro-Active Tuning Service

  • 매 업무 단위 프로젝트 마다 참여하여 업무 적용(Open) 前 문제 요소를 분석하여 튜닝.
  • 단위 업무 적용(Open) 후 매 3개월(데이터량 갱신 주기) 마다 튜닝 포인트를 설정, 성능 둔화 요소를 해결.
  • 전사적으로 새롭게 추가되는 업무 단위 프로젝트의 모든 SQL 쿼리를 검토 및 튜닝.
    다양한 대용량 데이터베이스 관리/튜닝 기법을 도입하여 최적의 DB 상태를 1년 내내 상시 유지.
  • 전략적 튜닝 Factor를 분석, 투자 대비 효율이 높은 Targeting 기법 적용. (비중도 높은 SQL을 튜닝함)

    3. Knowledge Transfer

    Pro-Active Tuning Service는 고객의 Business Process를 이해하고 시스템을 분석한 후 튜닝하는 것으로 완료되지 않습니다. 실제로 고객사 환경에서 튜닝한 내용을 그대로 실무자들에게 전수하여 내부 임직원의 역량을 제고시킵니다. 또한, Oracle RDBMS 신 버젼의 New Features를 교육함으로써, 이용자(관리자 및 개발자)가 스스로 개발 업무의 효율 및 생산성을 향상시킬 수 있도록 지원합니다. 이외에도 DBMS 관리자를 위한 관리 노하우(고급 Trouble-Shooting, 대용량 DB 처리, 병렬 처리 등)를 전수함으로써, 최상의 시스템을 최고의 기술로 유지할 수 있도록 지원합니다.

    UAS (User Adapted Seminar) 진행 사례 및 내용 (Contents)

Posted by redkite
, |

 

Data Pump

create directory cms_pump as '/oracle/redkite';
expdp \"/ as sysdba \" schemas=ADMINIBDEMO,ADMINIBDEMO30 directory=cms_pump dumpfile=mig
create directory cms_pump as '/oracle/redkite';
impdp \"/ as sysdba \" schemas=ADMINIBDEMO,ADMINIBDEMO30 REMAP_TABLESPACE=ADMIN_TS:ADMIN_TS directory=cms_pump dumpfile=mig


expdp userid=\"/ as sysdba\" full=y dumpfile=db1.dmp logfile=db1_exp.log
expdp \"/ as sysdba \" schemas=quicsusr,adminibusr,ibfusr directory=kbst2nd_pump dumpfile=mig

create directory kbst2nd_pump as '/oracle/app/oracle/product/1020/db/work';
impdp \"/ as sysdba \" schemas=quicsusr,adminibusr,ibfusr REMAP_TABLESPACE=usrtbl:usertbl directory=kbst2nd_pump dumpfile=mig

impdp userid=\"/ as sysdba\" full=y dumpfile=db1.dmp logfile=db1_imp.log

 

*. Data Pump

-------------------------
Oracle 10g의 기능인 Data Pump는 Oracle Database data와 metadata의 이동을 위한
DBMS_DATAPUMP 패키지를 통하여 상당히 빠른 Data Pump infrastructure를 제공하고 있다.

기존 Oracle 9i까지 사용되던 exp, imp 유틸리티보다 더욱더 향상된 성능을 목적으로
만들어진 유틸리티다.

Data Pump는 exp/imp보다 훨씬 많은 기능이 있으며, 대량의 데이터를 작업할 때

무척이나 빠르게 작업할 수 있다. 다음은 간단한 사용방법 및 샘플이다.

 

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

*. expdp

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

1. 디렉토리 조회
   SQL> SELECT * FROM dba_directories;  

 

2. 디렉토리 추가
   SQL> DROP DIRECTORY dpump_dir2;                       -- 기존 디렉토리 dpump_dir2 drop
   SQL> CREATE DIRECTORY dpump_dir2 as '/backup/dpump';  -- /backup/dpump 에 대한 디렉토리 dpump_dir2 생성

 

3. 디렉토리에 대한 권한 설정
   SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir2 to 사용자;

 

4. expdp
   # expdp system/1239 DIRECTORY=dpump_dir2 schemas=MESS_ADM   DUMPFILE=MESS_ADM_20081223.dmp \

           logfile=MESS_ADM_20081223.log

 

   # expdp SYSTEM/1239 DIRECTORY=DPUMP_DIR2 DUMPFILE=expdp_alldata_0106.dmp \

           LOGFILE=expdp_alldata_0106.log PARFILE=expdp.par CONTENT=DATA_ONLY

 

   # expdp system/1239 DIRECTORY=dpump_dir2 tables=MESS_ADM.TB_ABC110      \

           DUMPFILE=tb_ABC110_20100601.dmp logfile=tb_ABC110_20100601.log CONTENT=DATA_ONLY

 

* expdp(또는 impdp) 작업 진행 중 Control+C를 누르면 export> 프롬프트(또는 import> 프롬프트) 상태가 됨.
  Control+C 했다고 해서 작업이 중단되지는 않고, interactive mode로 변경되어 expdp(또는 impdp) 작업을

  모니터링하고 제어 가능

  [interactive mode에서 사용할 수 있는 명령어]
  - STATUS          : 현재 작업진행정도 확인 가능
  - CONTINUE_CLIENT : 다시 원래 모드로 돌아감
  - KILL_JOB
  - STOP_JOB
  - 나머지 명령어는 HELP 참고


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

*. impdp

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

1. 디렉토리 조회
   SQL> SELECT * FROM dba_directories;  

 

2. 디렉토리 추가
   SQL> DROP DIRECTORY dpump_dir2;                       -- 기존 디렉토리 dpump_dir2 drop
   SQL> CREATE DIRECTORY dpump_dir2 as '/backup/dpump';  -- /backup/dpump 에 대한 디렉토리 dpump_dir2 생성

 

3. 디렉토리에 대한 권한 설정
   SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir2 to 사용자;

 

4. impdp


   # impdp system/1239 dumpfile=PT_ABC110_02.dmp directory=dpump_dir2 \
      job_name=job_impdp2 logfile=impdp_PT_ABC110_02.log TABLES=MESS_ADM.TB_ABC110 \
      parallel=4 TABLE_EXISTS_ACTION=APPEND

 

   [TABLE_EXISTS_ACTION 옵션]
    같은 이름의 테이블이 존재할 때 SKIP / APPEND / TRUNCATE / REPLACE

 

 

[샘플]

 

*. expdp(파티션 테이블)

------------------------
   # expdp system/1239 DIRECTORY=dpump_dir2 tables=MESS_ADM.TB_ABC110:PT_ABC110_01 \

           DUMPFILE=PT_ABC110_01.dmp logfile=PT_ABC110_01.log CONTENT=DATA_ONLY
   # expdp system/1239 DIRECTORY=dpump_dir2 tables=MESS_ADM.TB_ABC110:PT_ABC110_02 \

           DUMPFILE=PT_ABC110_02.dmp logfile=PT_ABC110_02.log CONTENT=DATA_ONLY
   # expdp system/1239 DIRECTORY=dpump_dir2 tables=MESS_ADM.TB_ABC110:PT_ABC110_03 \

           DUMPFILE=PT_ABC110_03.dmp logfile=PT_ABC110_03.log CONTENT=DATA_ONLY

                 :

 

*. impdp(파티션 테이블)

------------------------
   # impdp system/1239 dumpfile=PT_ABC110_02.dmp directory=dpump_dir2 \
      job_name=job_impdp2 logfile=impdp_PT_ABC110_02.log TABLES=MESS_ADM.TB_ABC110 \
      parallel=4 TABLE_EXISTS_ACTION=APPEND

 

    Import: Release 10.2.0.2.0 - 64bit Production on Wednesday, 02 June, 2010 0:31:37

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

    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
    With the Partitioning and Data Mining options
    Master table "SYSTEM"."JOB_IMPDP2" successfully loaded/unloaded
    Starting "SYSTEM"."JOB_IMPDP2":  system/******** dumpfile=PT_ABC110_02.dmp directory=dpump_dir2 job_name=job_impdp2

    logfile=impdp_PT_ABC110_02.log TABLES=MESS_ADM.TB_ABC110 parallel=4 TABLE_EXISTS_ACTION=APPEND
    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
    . . imported "MESS_ADM"."TB_ABC110":"PT_ABC110_02"       746.4 MB 18653423 rows
    Job "SYSTEM"."JOB_IMPDP2" successfully completed at 00:32:53


 

1.1. Oracle Data pump란?

Oracle Data Pump는 Oracle Database 10g 버전에서 제공되는Utility로 향상된 데이터 이동을 가능하게 한다.
이전 버전의 오라클을 설치한 홈 디렉토리에는 ‘imp’,’exp’라는 실행 파일이 있다. 이는 오라클에서 제공하는 backup 및 recovery 에 사용되는 도구 이다.
Exp는 데이터베이스에 저장되어 있는 데이터들을 OS의 바이너리 파일로 전환하는 도구이고, imp는 바이너리 파일을 데이터베이스 안의 데이터로 전환하는 도구이다. 새로 등장한Data Pump는 exp 와 imp를 대체하기 위하여 오라클 10g 버전부터 제공되는 유틸리티로 Exp / Imp 와 유사한 동작을 하지만 data pump 가 훨신 효율적으로 동작한다.
Exp/Imp와 비교하여 그 효율성을 예를 들자면 exp시 single thread 에서 2배가 빠르고 imp시 15~45배 빠르므로 데이터베이스간의 bulk data 와 meta data의 전송시간을 줄이는데 효율적으로 사용될 수 있다.

1.2. Data pump Key features

1.2.1. Fast Performance

앞에서 말한 것과 같이Data Pump Export and Import 유틸리티는 기존의 Export and Import 유틸리티보다 훨씬 빠르다. Data Pump Export 에서 direct path method를 사용시 single stream data unload에서 기존의 export 보다 2배가 빠르다. 이는 direct path API가 더 효과적으로 수정 되었기 때문이다. Parallelism 의 level에 따라서는 더욱 향상된 performance를 보일 수 있다.

Data pump import 에서는 single stream 의 data load 시 기존의 import 보다 15~45배가 빠르다. 이는 기존의 import 에서 단순히 export dump파일에서 레코드를 읽고 일반적인 insert into 명령을 사용해서 대상 테이블에 삽입 하는 대신에 Data pump import 는Direct path method loading 을 사용하기 때문이다.


1.2.2. Improved Management Restart


모든 Data Pump operation은 Data Pump job을 실행하는 스키마에 만들어진 master table을 가지고 있다. Master table은 현재 수행중인 모든 export또는 import시 객체의 상태정보와 dump file set에서의 위치정보를 가지고 있다. 이는 갑작스런 job의 중단에도 job 의 성공적인 종료에 상관 없이 어떤 object의 작업이 진행 중이었는지 알 수 있게 해 준다. 그래서 master table 과 dump file set 이 있는 한 모든 정지된 data pump job은 데이터 손실 없이 다시 시작할 수 있다.

1.2.3. Fine-Grained Object Selection

Data Pump job 은 거의 모든 type의 object를 exclude 또는 include 시킬 수 있다.
아래의 parameter 가 사용된다.
* EXCLUDE - 특정 객체 유형을 제외한다. (예: EXCLUDE=TABLE:EMP)
* INCLUDE - 특정 객체 유형을 포함한다. (예: INCLUDE=TABLE_DATA)
* CONTENT - 로드를 취소할 데이터를 지정한다.
적합한 키: (ALL), DATA_ONLY 및 METADATA_ONLY.
* QUERY - 테이블의 부분 집합을 엑스포트하기 위해 사용되는 술어 절이다.

1.2.4. Monitoring and Estimating Capability

Data Pump는 Standard progress , error message를 log file에 기록할 뿐만 아니라 현재 operation의 상태를 대화식모드 ‘command line’으로 보여 준다. Job의 completion percentage를 측정하여 보여주며 초 단위의 지정한 time period에 따라 자동으로 update하여 표시한다.

1개 이상의 client가 running job에 attach 수 있기 때문에 업무환경에서 job을 실행하고, detach 한 후 집에 가서 job을 reattach 하여 끊김 없이 모든 job을 모니터링 할 수 있다.
모든export job이 시작할 때 대략적인 전체unload양을 측정해 준다. 이는 사용자가 dump file set을 위한 충분한양의 disk space를 할당할 수 있게 한다.

1.2.5. Network Mode

Data Pump Export and Import는 job의 source가 리모트 인스턴스 일 경우를 위한 network mode를 지원한다.

Network을 통해 import를 할 때 source가 dump file set이 아닌 다른 database에 있기 때문에 dump file이 없다.

Network를 통해 export를 할 때 souce가 다른시스템에 있는 read-only database 일 수 있다. Dumpfile은 local(non-networked)export 처럼 local 시스템에 쓰이게 된다.

1.3. Data pump overview

1.3.1. Data Pump Overview

- expdp/impdp로 제공 되어 진다.
- exp/imp의 superset 이다.
- Data 와 metadata를 매우 빠른 속도로 load/unload 하는 Server-based facility이다.
==> dump file sets은 Server에 생성
- DBMS_DATAPUMP PL/SQL Package를 이용하여 사용 가능 하다.
- Web-based interface <--access from EM Database Control이 가능하다.
- Data Pump job을 실행하는 schema에 master table(MT)이 만들어 진다.

MT는 해당 job의 모든 것(aspects)을 관리하며 data pump(expdp)의 마지막 단계에서 pump file sets에 기록된다.


file based import 작업(impdp)시 dump file에 있는 MT 내용을 current user의 schema에 제일먼저 loading한다.


계획 또는 예상치 못한 job의 중단 시 재가동수 있게 하는 Data Pump의 핵심이 MT 이다.



Client process는 Data Pump API를 call한다.


-여러 개의 clients가 모니터링하고 control하기 위해서 job을 attach/detach 한다.

1.3.2. Data Pump Benefit

- Data Access Methods : Direct Path, External Tables
- Detach from, reattach to log-running jobs
- Restart Data Pump Jobs
- Find-grained object selection <-- 원하는 rows만(EXCLUDE, INCLUDE, CONTENT)
- Explicit database version specification
- Parallel execution
- Estimate export job space <--ESTIMATE_ONLY
- Network Mode에서는 Remote의 server process가 DB link를 이용하여 Local에 dump file을 직접 만들어 준다..
- Import 과정에서 target data file name, schema, tablespace 을 변경할 수 있다.

1.3.3. Data Pump File Locations

- Data pump file 종류

- DUMP file : data와 metadata를 포함한다.
- LOG file : operation과 관련된 message를 기록한다.
- SQL file : impdp에서 SQLFILE operation의 결과를 기록한다.
- Data Pump는 server-based 이므로 Oracle directory path를 통해서 Data Pump file에 access한다.
Absolute path는 보안상 지원되지 않는다.

- Order of precedence of file locations

1) per-file directory
- dump file, log file, sql file 마다 지정될 수 있다. 콜론(:)으로 directory 와 file name 을 구분한다.
예) dumpfile=AA:A.dmp

2) DIRECTORY parameter

- directory object를 사용한다.
Create Directory DIR_PJH as '/home/oracle10g/test/';
Grant read, write On Directory DIR_PJH to SCOTT;
Directory=AA
Dumpfile=A.dmp


3) DATA_PUMP_DIR 환경변수

- DIRECTORY Parameter를 대신하여 directory object name을 설정한다.
export DATA_PUMP_DIR=AA
Dumpfile=A.dmp
- 위의 모든 경우에 시도하려는 operation에 대해 directory object에 대해 적절한 access privs가 있어야 한다.
Export할 경우 모든 file에 대해 write access가 필요하다.
Import할 경우 dump file에 대해 read access, log file과 sql file에 대해 write access가 필요하다.

1.3.4. Data Pump File Naming and size

(1) DUMPFILE
- file list는 , 로 분리한다.
- %U template --> two-character, fix-width, 01부터 증가하는 integer 를 가진다.
- DUMPFILE 이 지정되어 있지 않으면 expdat.dmp 가 default로 사용된다. Default는 autoextensible이다.

(2) FILESIZE
- FILESIZE 가 지정되어 있으면 각 file은 FILESIZE안으로 만들어지고 늘어날 수 없다. dump 공간이 더 필요하고 template %U가 지정되었다면, 새로운 파일이 생성된다. 그렇치 않으면 사용자는 new file을 add하라는 메세지를 받는다.

(3) PARALLEL
- %U가 지정되면 PARALLEL parameter의 개수만큼 초기에 file이 생성된다.
- 기존에 존재하는 file과 이름이 중복될 경우 overwrite하지 않고 에러를 발생시키고 job이 abort된다.
- 복수개의 dump file template가 제공되면 round-robin fashion으로 dump file을 생성하는 데 사용한다.

1.3.5. Data Pump Filtering

(1) Find-grained object selection
- 기존의 exp/imp는 index, trigger, grant, constraint를 포함하거나 제외하는 것이 있으나
data pump는 virtually any type of object를 포함하거나 제외할 수 있다.
- EXCLUDE 와 IMCLUDE는 mutually exclusive 하다.
- INCLUDE = object_type[:"name_expr"]
- EXCLUDE = object_type[:"name_expt"]
- 모든 view, 모든 package, EMP로 시작하는 Index만 제외한다.
EXCLUDE=view
EXCLUDE=package
EXCLUDE=INDEX:"LIKE 'EMP%' "

(2) Data Selection
- CONTENT = ALL(def) | METADATA_ONLY | DATA_ONLY
- QUERY = [Schema.][table_name:]"query_clause"
- CONTENT에 data_only가 사용되면 EXCLUDE 와 INCLUDE를 사용할 수 없다.QUERY=hr.employees:"WHERE department_id in (10,20) and salary < 1600 ORDER BY department_id"
<--특정 table을 지정해서 해당 table로 한정. imp시에도 적용.

1.3.6. Data Pump Job Monitoring

- 데이터베이스 뷰에서 실행되는 Data Pump 작업에 관해서도 자세한 정보를 확인할 수 있다.
- DBA_DATAPUMP_JOBS – 작업에서 실행되는 작업자 프로세스(DEGREE 열)의 수를 확인 할 수 있다.
- DBA_DATAPUMP_SESSIONS –이전 뷰 및 V$SESSION과 조인하여 foreground 프로세스 세션의 SID확인 할 수 있다.

select sid, serial#
from v$session s, dba_datapump_sessions d
where s.saddr = d.saddr;


- V$SESSION_LONGOPS - 작업 완료에 걸리는 시간을 예측하는 또 다른 유용한 정보를 얻을 수 있다.

select sid, serial#, sofar, totalwork
from v$session_longops
where opname = 'CASES_EXPORT' and sofar != totalwork;

totalwork 열에는 총 작업량이 표시되는데, 이 중 현재까지 sofar 작업량을 완료했으므로 이를 통해 얼마나 더 시간이 걸릴지 예측할 수 있다.

1.3.7. Data Pump Export and Import

1) Parallel Full Export and Import

> expdp system/manager full=y parallel=4
dumpfile=DATADIR1:full1%U.dat,
DATADIR2:full2%U.dat,
DATADIR3:full3%U.dat,
DATADIR4:full4%U.dat
filesize=2G

<--4개의 work process를 가진 full export,
Pump file은 DATADIR1, DATADIR2, DATADIR3, DATADIR4 네 곳에 라운드로빈 방식으로 생성된다.
2G를 넘지 않으면서 최소4개 생성.
Job 과 master table 이름은 default로 SYSTEM_EXPORT_FULL_01 를 가진다.

>impdp system/manager directory= NET_STORGAE_1 parallel=4
dumpfile= full1%U.dat,
full2%U.dat,
full3%U.dat,
full4%U.dat

<--expdp로 받은 dump file을 network를 통해 NET_STORAGE_1 이라는 directory object위치로 보내졌다. Default import는 dump set 전체를 import하는 것이므로 Full=y 는 필요 없다.
Job 과 master table 이름은 default로 SYSTEM_IMPORT_FULL_01 를 가진다.

2) Limited Schema Export (fine-grained)

incluse=function include=procedure include=pacakge include=type include=view:"like 'PRODUCT%'"
> expdp system/manager schemas=hr,oe
directory=USR_DATA
dumpfile=schema_hr_oe.dat
parfile=exp_par.txt <----------------------------

<--HR, OE schema에서 모든 func, prod, pkg, user-defined type, PRODUCT로 시작하는 view를 export한다.
Schema definition과 system priv graints는 export되지 않는다.

> impdp system/manager directory=USR_DATA
dumpfile=schema_hr_oe.dat
sqlfile=schema_hr_oe.dat

<--실제 import는 하지 않고 dmp file에서 DDL 문장만 뽑아낸다.

3) Network Mode Import (DB Link)

network_link=finance.hq.com <--db link
remap_schema=payroll:finance

> impdp system/manager schemas=hr,sh,payroll
parfile=imp_par.txt <--------------------------------

<--Source DB에 dblink로 붙어서 hr, sh, payroll schema를 가져온 다음 imp 한다.
이때 payroll schema로 finance schema로 만들어 진다.
SYSTEM은 IMPORT_FULL_DATABASE role을 가지고 있고 Source DB에 대해서는 EXPORT_FULL_DATABASE role을 가지므로 Target DB에 해당 schema definition이 없으면 만들어진다.
flashback_time은 예전의 CONSISTENT와 동일하다.

4) Data-Only Unload

> expdp hr/hr parfile=exp_par.txt dumpfile=expdat.dmp content=data_only
include=table:"in ('DEPARTMENTS','DEPARTMENTS_HIST','EMPLOYEES','EMP_HIST')"
query="where DEPARTMENT_ID != 30 order by DEPARTMENT_ID"

1.3.8. Data Pump restarting

1) Attaching to Existing Job
> expdp system/manager attach=EXP_TS1


<--Job name(MT name) :dba_datapump_jobs
해당 스키마에 active export job 이 하나만 있을 경우 안 적어도 된다..

job: EXP_TS1
owner: SYSTEM
mode:
status:
Export> STOP_JOB
<--중지.
Attach session은 terminate 되고 실행되던 job은 controlled fashion으로 run down 된다.

해당 Job은 dump file과 SYSREM.EXP_TS1 table이 disturbed 되지 않는 한 startable 하다.

2) Restarting Stopped Job

> expdp system/manager attach=exp_ts1
<--같은 schema안에 여러 개의 outstanding job이 있으면 job name지정한다.

Export> parallel=4
Export> start_job
Export> status =600 <--10분

<-- detailed per-work process가 10분 단위로 regular status message를 보여준다.
KILL_JOB로 job을 kill한다.

<--status, status=600(초)
stop_job,
start_job,
continue_client: attach한 session이 계속 받아서 expdp 실행한다.(logging mode로 전환)
exit_client: Attach를 빠져 나옴. expdp는 background로 실행한다.

1.4. Data pump 실습

1.4.1. 전체 데이터베이스 export 실습

SQL> conn /as sysdba
연결되었습니다.

SQL> create directory dump as 'C:₩oracle/backup'; ->directory를 생성한다.

디렉토리가 생성되었습니다.
SQL> grant read ,write on directory dump to public; -> directory에 권한을 부여한다.

권한이 부여되었습니다.

SQL> host

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.
C:₩oracle>expdp system/oracle dumpfile=full.dmp directory=dump full=y job_name=Lucie

Export: Release 10.2.0.1.0 - Production on 화요일, 29 5월, 2007 17:17:41

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

접속 대상: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options
"SYSTEM"."LUCIE" 시작 중: system/******** dumpfile=full.dmp directory=dump full=y job_name=Lucie
BLOCKS 메소드를 사용하여 예측 진행 중...
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA 처리 중
BLOCKS 메소드를 사용한 총 예측: 66.56 MB ->대략적인dmp파일 size를 예측할 수 있다.
객체 유형 DATABASE_EXPORT/TABLESPACE 처리 중
객체 유형 DATABASE_EXPORT/SYS_USER/USER 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/USER 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/POST_INSTANCE/PROCDEPOBJ 처리 중

. . "SCOTT"."DEPT" 48.00 MB 2097152행이 엑스포트됨
. . "SYSMAN"."MGMT_JOB_CRED_PARAMS" 11.70 KB 18행이 엑스포트됨
. . "SYSMAN"."MGMT_JOB_PROP_PARAMS" 8.820 KB 12행이 엑스포트됨
. . "SYSMAN"."MGMT_JOB_STEP_PARAMS" 127.3 KB 1128행이 엑스포트됨

Control + c ->중간에 끊어도 job이 끊기지 않고 명령모드로 들어간다.

Export>status
작업: LUCIE
작업: EXPORT
모드: FULL
상태: EXECUTING
처리된 바이트: 50,337,376
완료율: 84 -> 진행률을 알 수 있다.
현재 병렬도: 1
작업 오류 수: 0
덤프 파일: C:₩ORACLE₩BACKUP₩FULL.DMP
기록된 바이트: 55,226,368

작업자 1 상태:
상태: EXECUTING
객체 스키마: SYSMAN
객체 이름: MGMT_JOB_EXECUTION
객체 유형: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

완료된 객체: 45
총 객체: 408
작업자 병렬도: 1

Export> stop_job -> job 을 정지시킨다.
이 작업을 정지하겠습니까([예]/아니오):

C:₩oracle>

C:₩oracle>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 화 5월 29 17:32:59 2007

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

다음에 접속됨:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options

SQL>select owner_name,job_name,operation,job_mode,state from dba_datapump_jobs;
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE
---------- ---------- ------------ ----------- ------------
SYSTEM LUCIE EXPORT FULL NOT RUNNING
->job 상태를 확인할 수 있다.

SQL> exit

C:₩oracle>expdp system/oracle attach=lucie ->job을 다시 attach한다.

Export: Release 10.2.0.1.0 - Production on 화요일, 29 5월, 2007 17:35:54

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

접속 대상: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options

작업: LUCIE
소유자: SYSTEM
작업: EXPORT
생성자 권한: FALSE
GUID: 18405C1B820C4ABB9B30C4948E0D356F
시작 시간: 화요일, 29 5월, 2007 17:35:56
모드: FULL
인스턴스: ora10
최대 병렬도: 1
EXPORT 작업 매개변수:
매개변수 이름 매개변수 값:
CLIENT_COMMAND system/******** dumpfile=full.dmp directory=dump full=y job_name=Lucie
상태: IDLING
처리된 바이트: 51,646,000
완료율: 99
현재 병렬도: 1
작업 오류 수: 0
덤프 파일: C:₩oracle/backup₩full.dmp
기록된 바이트: 55,914,496

작업자 1 상태:
상태: UNDEFINED

SQL>select owner_name,job_name,operation,job_mode,state from dba_datapump_jobs;
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE
---------- ---------- ------------ ----------- ------------
SYSTEM LUCIE EXPORT FULL IDLING
->job 상태를 확인할 수 있다.

Export> start_job ->Job을 다시restar한다.

Export> status

작업: LUCIE
작업: EXPORT
모드: FULL
상태: COMPLETING
처리된 바이트: 51,646,001
완료율: 100
현재 병렬도: 1
작업 오류 수: 0
덤프 파일: C:₩oracle/backup₩full.dmp
기록된 바이트: 64,684,032

작업자 1 상태:
상태: WORK WAITING

C:₩oracle>

Logfile 확인

지정한 directory 위치에 “export” log file을 확인 한다. 파일의 끝부분을 보면 성공적으로 완료됨을 확인할 수 있다.

"SYSTEM"."LUCIE" 작업이 17:18:56에서 사용자 요청에 의해 정지됨
LUCIE 작업이 화요일, 29 5월, 2007 17:35 에서 다시 열림 ->작업을 정지했다 다시 시작한 것을 확인 할 수 있음


"SYSTEM"."LUCIE" 재시작 중: system/******** dumpfile=full.dmp directory=dump full=y job_name=Lucie
마스터 테이블 "SYSTEM"."LUCIE"이(가) 성공적으로 로드됨/로드 취소됨
******************************************************************************
SYSTEM.LUCIE에 대해 설정된 덤프 파일:
C:₩oracle/backup₩full.dmp
"SYSTEM"."LUCIE" 작업이 17:37:12에서 성공적으로 완료됨

1.4.2. 특정 스키마 DDL 스크립트 생성 실습

SQL> conn /as sysdba
연결되었습니다.


SQL> create directory dump as 'C:₩oracle/backup'; ->directory를 생성한다.
디렉토리가 생성되었습니다.

SQL> grant read ,write on directory dump to public; -> directory에 권한을 부여한다.
C:₩oracle>impdp system/oracle directory=dump dumpfile=full.dmp schemas=scott sqlfile=ddl_scott.sql
<이 명령은 dump로 지정된 디렉터리에 ddl_scott.sql로 명명된 파일을 생성하며 엑스포트 덤프 파일 내의 객체 스크립트를 생성한다.>


Import: Release 10.2.0.1.0 - Production on 화요일, 29 5월, 2007 19:12:13

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

접속 대상: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options
마스터 테이블 "SYSTEM"."SYS_SQL_FILE_SCHEMA_01"이(가) 성공적으로 로드됨/로드 취소됨


"SYSTEM"."SYS_SQL_FILE_SCHEMA_01" 시작 중: system/******** directory=dump dumpfile=full.dmp schemas=
scott sqlfile=ddl_scott.sql
객체 유형 DATABASE_EXPORT/SCHEMA/USER 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANT 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/ROLE_GRANT 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/DEFAULT_ROLE 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMA 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/TABLE 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICS 처리 중
"SYSTEM"."SYS_SQL_FILE_SCHEMA_01" 작업이 19:12:22에서 성공적으로 완료됨

Logfile 확인

- dump로 지정된 C:₩oracle/backup에 ddl_scoot.sql파일이 생성된다.

-- CONNECT SYSTEM
-- new object type path is: DATABASE_EXPORT/SCHEMA/USER
CREATE USER "SCOTT" IDENTIFIED BY VALUES 'F894844C34402B67'
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP";
-- new object type path is: DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANT
GRANT UNLIMITED TABLESPACE TO "SCOTT";
GRANT CREATE SESSION TO "SCOTT";
-- new object type path is: DATABASE_EXPORT/SCHEMA/ROLE_GRANT
GRANT "RESOURCE" TO "SCOTT";
-- new object type path is: DATABASE_EXPORT/SCHEMA/DEFAULT_ROLE
ALTER USER "SCOTT" DEFAULT ROLE ALL;
-- new object type path is: DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMA
-- CONNECT SCOTT
BEGIN
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'ORA10', inst_scn=>'283762');
COMMIT;
END;
/
-- new object type path is: DATABASE_EXPORT/SCHEMA/TABLE/TABLE

-- CONNECT SYSTEM
CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0) NOT NULL ENABLE,
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;

1.4.3. 존재하는 table import

1) content=data_only 포함한 경우

C:₩oracle>Impdp system/oracle dumpfile=full.dmp directory= dump content=data_only job_name=data_import logfile=table_log tables=scott.dept

Import: Release 10.2.0.1.0 - Production on 화요일, 29 5월, 2007 19:42:15

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

접속 대상: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options
마스터 테이블 "SYSTEM"."DATA_IMPORT"이(가) 성공적으로 로드됨/로드 취소됨
"SYSTEM"."DATA_IMPORT" 시작 중: system/******** dumpfile=full.dmp directory= dump content=data_only
job_name=data_import logfile=table_log tables=scott.dept
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA 처리 중
. . "SCOTT"."DEPT" 48.00 MB 2097152행이 임포트됨
"SYSTEM"."DATA_IMPORT" 작업이 19:42:52에서 성공적으로 완료됨

2) content=data_only 포함하지 않은 경우

C:₩oracle>Impdp system/oracle dumpfile=full.dmp directory= dump job_name=data_import logfile=table_log tables=scott.dept

Import: Release 10.2.0.1.0 - Production on 화요일, 29 5월, 2007 19:41:02

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

접속 대상: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the OLAP and Data Mining options
마스터 테이블 "SYSTEM"."DATA_IMPORT"이(가) 성공적으로 로드됨/로드 취소됨
"SYSTEM"."DATA_IMPORT" 시작 중: system/******** dumpfile=full.dmp directory= dump job_name=data_impo
rt logfile=table_log tables=scott.dept
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/TABLE 처리 중
ORA-39151: "SCOTT"."DEPT" 테이블이 존재합니다. 건너 뛰기 table_exists_action으로 인해 모든 종속 메타 데이터 및 데이터를 건너 뜁니다.
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA 처리 중
객체 유형 DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICS 처리 중
"SYSTEM"."DATA_IMPORT" 작업이 1 오류와 함께 19:41:09에서 완료됨
* 임포트 프로세스의 기본 작업 방식은 테이블 및 연관된 모든 객체를 생성하고 테이블이 있는 상태에서 오류를 만들어 낸다.

* 임포트 프로세스의 기본 작업 방식은 테이블 및 연관된 모든 객체를 생성하고 테이블이 있는 상태에서 오류를 만들어 낸다.

다음 명령은 대화형 모드에서 적합합니다.
참고: 약어도 허용됨

다음 명령은 대화형 모드에서 적합합니다.
참고: 약어도 허용됨

Posted by redkite
, |

사용하던 스토리지 교체로 ocr 과 voting disk 를 새로운 스토리지로 이관하는 내용입니다.

작업 하기 전에 준비되어야 하는 것은 기존 스토리지와 새로운 스토리지 모두 서버에서 바라 볼수 있어야 합니다.

이 작업은 하드웨어 엔지니어분께 얘기하면 알아서 해주실 겁니다.

기존 스토리지의 볼륨 그룹은 rac1 이고 새로운 스토리지의 볼륨 그룹은 rac2 입니다.

ocr은 replace 하고, voting 은 add 하고 delete 합니다.

작업 하시기 전 불의의 사고(?) 에 대비해 ocr 과 voting disk 모두 백업 하시고요,

저는 이런식으로 했는데 상황에 따라 다른 여러가지 방법이 존재할 수 있을 겁니다.

note 428681.1 를 참고 했으며, 꼭 읽어 본 후 작업 하세요.

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

모든 작업은 root 계정으로 한다.

OCR 은 crs 가 start 상태에서 작업하며, voting disk 는 crs 가 down 상태에서 한다.

1. OCR 현재 상태 확인

[db1:/oramedia/patch/6455161] su - root
Password:
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
cdSourcing //.profile-EIS.....
root@db1 # cd $ORA_CRS_HOME
root@db1 # cd bin
root@db1 # ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 524044
Used space (kbytes) : 4100
Available space (kbytes) : 519944
ID : 1967014107
Device/File Name : /dev/md/rac1/rdsk/d201
Device/File integrity check succeeded
Device/File Name : /dev/md/rac1/rdsk/d202
Device/File integrity check succeeded

Cluster registry integrity check succeeded

2. OCR 다른 스토리지로 이관
root@db1 # ocrconfig -replace ocr /dev/md/rac2/rdsk/d201
root@db1 # ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 524044
Used space (kbytes) : 4100
Available space (kbytes) : 519944
ID : 1967014107
Device/File Name : /dev/md/rac2/rdsk/d201
Device/File integrity check succeeded
Device/File Name : /dev/md/rac1/rdsk/d202
Device/File integrity check succeeded

Cluster registry integrity check succeeded

root@db1 # ocrconfig -replace ocrmirror /dev/md/rac2/rdsk/d202
root@db1 # ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 524044
Used space (kbytes) : 4100
Available space (kbytes) : 519944
ID : 1967014107
Device/File Name : /dev/md/rac2/rdsk/d201
Device/File integrity check succeeded
Device/File Name : /dev/md/rac2/rdsk/d202
Device/File integrity check succeeded

Cluster registry integrity check succeeded

3. voting disk 현재 상태 확인

root@db1 # crsctl query css votedisk
0. 0 /dev/md/rac1/rdsk/d203
1. 0 /dev/md/rac1/rdsk/d204
2. 0 /dev/md/rac1/rdsk/d205

located 3 votedisk(s).
root@db1 # crsctl add css votedisk /dev/md/rac2/rdsk/d203
Cluster is not in a ready state for online disk addition <= 온라인 상태라 등록이 안된다.

4. crs 중지 (모든 노드)

root@db1 # crsctl stop crs
Stopping resources. This could take several minutes.
Successfully stopped CRS resources.
Stopping CSSD.
Shutting down CSS daemon.
Shutdown request successfully issued.

5. voting disk 추가 및 기존 디스크 제거

root@db1 # crsctl add css votedisk /dev/md/rac2/rdsk/d203 -force
Now formatting voting disk: /dev/md/rac2/rdsk/d203
successful addition of votedisk /dev/md/rac2/rdsk/d203.
root@db1 # crsctl delete css votedisk /dev/md/rac1/rdsk/d203 -force
successful deletion of votedisk /dev/md/rac1/rdsk/d203.
root@db1 # crsctl add css votedisk /dev/md/rac2/rdsk/d204 -force
Now formatting voting disk: /dev/md/rac2/rdsk/d204
successful addition of votedisk /dev/md/rac2/rdsk/d204.
root@db1 # crsctl delete css votedisk /dev/md/rac1/rdsk/d204 -force
successful deletion of votedisk /dev/md/rac1/rdsk/d204.
root@db1 # crsctl add css votedisk /dev/md/rac2/rdsk/d205 -force
Now formatting voting disk: /dev/md/rac2/rdsk/d205
successful addition of votedisk /dev/md/rac2/rdsk/d205.
root@db1 # crsctl delete css votedisk /dev/md/rac1/rdsk/d205 -force
successful deletion of votedisk /dev/md/rac1/rdsk/d205.

6. crs 스타트 (모든 노드)
root@db1 # crsctl start crs
Attempting to start CRS stack
The CRS stack will be started shortly

7. voting disk 확인

root@db2 # crsctl query css votedisk
0. 0 /dev/md/rac2/rdsk/d204
1. 0 /dev/md/rac2/rdsk/d205
2. 0 /dev/md/rac2/rdsk/d203

located 3 votedisk(s).

8. ocr.loc 파일에서 ocr 경로 확인

root@db2 # cat /var/opt/oracle/ocr.loc
#Device/file /dev/md/rac1/rdsk/d202 getting replaced by device /dev/md/rac2/rdsk/d202
ocrconfig_loc=/dev/md/rac2/rdsk/d201
ocrmirrorconfig_loc=/dev/md/rac2/rdsk/d202

Posted by redkite
, |

오라클 9i 이상

- Locally Management Tablespace 권장

 

1. 기존 TEMP TABLESPACE를 DROP 후 CREATE

   SQL> connect / as sysdba

 

   SQL> CREATE TEMPORARY TABLESPACE IMSI TEMPFILE  '/oradata/imsi.dbf' size 10m;

   SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE IMSI;

   SQL> ALTER DATABASE TEMPFILE '/oradata/temp01.dbf' OFFLINE;
   SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;


   SQL> CREATE TEMPORARY TABLESPACE TEMP

                         TEMPFILE '/oradata/temp01.dbf' SIZE 1000M
                         EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
   SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;

   SQL> ALTER DATABASE TEMPFILE '/oradata/imsi.dbf' OFFLINE;
   SQL> DROP TABLESPACE IMSI INCLUDING CONTENTS AND DATAFILES;

 

2. TEMPFILE RESIZE

   SQL> connect / as sysdba
   SQL> alter database tempfile '/oradata/temp01.dbf' resize 4000M; 

 

3. TEMPFILE RENAME

   SQL> shutdown immediate;
   SQL> !mv /data1/temp.dbf /data2/temp01.dbf (만약을 위해 cp를 사용할 것을 권장합니다.)
   SQL> startup mount
   SQL> alter database rename file '/data1/temp.dbf' to '/data2/temp01.dbf';
   SQL> alter database open;

8i에서는 tempfile이란 개념은 있었으나 default temporary tablespace라는
개념은 없었습니다. 그래서 유저에게 직접 default tablespace를 지정해주어야
했었습니다.
하지만.. 9i부터는 alter database default temporary tablespace new_temp;
명령을 하기만 하면 모든 유저의 default temporary tablespace가 default로
지정되어 있지 않으면 new_temp로 됩니다.
물론 이 경우에도 수동으로 temp를 지정할 수 있으니 실제로 유저가
temp공간을 어디에 사용하는지는..
select username, temporary_tablespace from dba_users; 를 통해서
확인해야 합니다.
scott유저는 default temporary tablespace로 지정되어서 그 쪽 temp를
사용하게 되니, 에러가 나지 않겠죠.

default temporary tablespace가 무엇으로 지정되어 있는지는,
select * from database_properties; 또는 select * from sys.props$; 로 조회하면
temporary tablespace라는 이름으로 어떤 값이 들어가 있는지 보입니다.

그리고 temp는 DB를 내렸다가 올리면 smon프로세스가 clear시켜줍니다.
temp는 아시다 싶이 당연히 sort를 해서 발생하는 것이구요. 그렇다면..
temp가 계속해서 full이 난다면.. temp를 사용하는 세션을 확인하고
temp를 사용하는 세션의 쿼리를 뽑아낸다면 쉽게 해결이 되겠죠.
아래는 제가 경험해서 처리한 것입니다.


저는 temporary tablespace가 full 났는데 도대체 쿼리를 못잡는 것이었습니다.
그래서 어떻게 했을까요? Secure CRT에 세션로그를 걸어두고 모니터링을 했죠.

vi stat.sh

interval=30 # Sleep interval in seconds
reps=1000000 # n times
j=1 # Loop variable

while [ $j -le ${reps} ]
do
echo " ----cycle ${j} / ${reps} --------"

sqlplus -s system/패스워드<<EOF
@sw.sql ${j}
exit
EOF
cat sess_${j}.dat >> sw.dat
rm sess_${j}.dat
sleep ${interval}
j=`expr ${j} + 1`
done
exit 0

vi sw.sql
set line 150
set concat "+"
col username format a10
col osuser format a10
col tablespace format a15
spool sess_&1.dat

SELECT b.tablespace,
b.segfile#,
b.segblk#,
b.blocks,
a.sid,
a.serial#,
c.spid,
a.username,
a.osuser,
a.status,
a.sql_hash_value
FROM v$session a,
v$sort_usage b,
v$process c
WHERE a.saddr = b.session_addr and a.paddr=c.addr
ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks;
spool off

stats.sh 를 수행하고 PC킨 상태로 그냥두고 다음날 왔더니 아래처럼 temp를
계속 쓰는 넘이 나온거죠..
딱걸렸습니다.ㅎㅎ

TEMP 93 2550817 13824 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1792 / 1000000


TEMP 93 2550817 43008 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1793 / 1000000


TEMP 93 2550817 72192 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1794 / 1000000


TEMP 93 2550817 101376 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1795 / 1000000


TEMP 93 2550817 131072 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1796 / 1000000


TEMP 93 2416673 18944 123 5171 3197 PVB oracle ACTIVE 1126923165
TEMP 93 2550817 159744 92 58284 3193 PVB oracle ACTIVE 1126923165
----cycle 1797 / 1000000


TEMP 93 2416673 48128 123 5171 3197 PVB oracle ACTIVE 1126923165
TEMP

sql_hash_value값이 1126923165 이니 아래 쿼리에다가 넣으면 full 쿼리가 나오죠..
결국엔 개발자가 모든 소스코드에서 변경을 했어야 했는데.. 그렇게 하지 않아서
일부 웹서버에서의 쿼리가 이상하게 where조건없이 수행되었고 그래서 temp가
full 났던 것이랍니다.

vi sidhashsql.sql
set pages 1000
col sql_text format a120
select sql_text from v$sqltext_with_newlines
where hash_value=&hash_value order by piece;

SQL> @sidhashsql
Enter value for hash_value: 1126923165
old 2: where hash_value=&hash_value order by piece
new 2: where hash_value=1126923165 order by piece

SQL_TEXT

boan~~~~!!

###################################################

아래 너무 자세하게 나와있죠?
No. 18484

TEMPORARY TABLESPACE에서 TEMPFILE 과 DATAFILE의 차이점 (8.1.X ~ 9I)
============================================================

PURPOSE

이 문서에서는 Oracle 7.3부터 사용되어 오던 create tablespace ... temporary
형태와, 8i부터 사용되는 create temporary tablespace... 의 차이점을 정리해
본다.
tablespace의 temporay type과 permanent type에 대한 비교는 <Bulletin#: 11938>
를 참조하도록 하고 여기에서는 permanent에 대해서는 논외로 한다.

Explanation

temporary segment가 생성 가능한 tablespace의 type과 temporary tablesapce에서
datafile과 tempfile의 차이점을 설명한다.

1. temporary segment를 생성가능한 tablespace type 정리

temporary tablespace의 tempfile과 datafile을 비교하기 전에, tablespace의
type들을 확인해 보고, 이 중 temporary segment가 생성될 수 있는 tablespace
type을 version별로 정리해본다.

tablespace는 7.2까지는 permanent type으로 dictionary managed방식으로
space를 할당/해제하던 방식만이 존재했다. db user의 temporary tablespace로
임의의 tablespace를 지정가능하였고, 해당 db user의 sort operation은
지정된 tablespace에서 발생하며, 다른 tablespace와 특별히 구분되는 것은
없었다.

이후, 7.3에 temporary type이 추가되고, 8i에서 locally managed type과 일반
datafile이 아닌 tempfile이 소개되면서 8i를 기준으로 기본적으로 다음과 같이
4가지 형태의 tablespace 형태가 가능하다.
이중 (1) ~ (3)번까지는 일반 datafile형태이고, (4)번의 경우는 이 문서에서
자세히 살펴볼 tempfile이다.
(locally managed와 dictionary managed의 차이점 및 사용 방법은
<Bulletin #: 18261>과 <Bulletin #: 11860> 참조)

(1) permanent-dictionary managed
(2) permanent-locally managed
(3) temporary-dictionary managed
(4) tempfile-locally managed

[주의] 위의 종류에 temporary datafile에 locally managed 형태의 tablespace는
없는것에 주의한다.
그리고 만약 system tablespace가 locally managed로 이미 생성된 경우에는
이후 모든 tablespace는 locally managed로 생성이 가능하고, dictionary
managed 형태는 생성하면 ORA-12913 (Cannot create dictionary managed
tablespace) 오류가 발생하게 된다.

이러한 여러가지 type의 tablespace중 temporary segment를 생성할 수 있는
tablespace에 제약이 존재한다.

- 8i: 어떠한 형태의 tablespace라도 db user의 temporary tablespace로 지정
가능하다. 단, permanent-locally managed 형태의 tablespace에 sort가
발생하게 되면 ORA-3212 (Temporary Segment cannot be created in
locally-managed tablespace) 오류가 발생하게 된다.

SQL> alter user scott temporary tablespace PERM_LOCAL;
User altered.

connect scott/tiger
SQL> select * from dept order by 1;
ORA-03212: Temporary Segment cannot be created in locally-managed
tablespace

- 9i: db user의 default temporary tablespace 지정 자체가 다음 두 가지
type만이 가능한다.

-temporary-dictionary managed
-tempile-locally managed

만약 permanent type의 tablespace를 db user의 tempoary tablespace로
지정하면, ORA-12911 (permanent tablespace cannot be temporary tablespace)
오류가 발생한다.

2. tempfile과 datafile의 비교

아래에서 tablespace지정시 tempfile과 datafile형태를 비교하게 되는데,
단, datafile형태의 경우 permanent type에 대해서는 언급하지 않는다.

(1) tempile의 특징

Oracle7.3에서 tablespace에 생성시 temporary option을 이용하여 생성되는
tablespace를 구성하는 화일은 datafile이다. 단지 이것이 기존의 permanent
type과 구별되는것은 이 tablespace에 생성되는 segment들이 매번 sort
operation마다 별도로 생성되는 대신, 하나의 segment로 만들어지면서
다른 session에서의 sort operation이 같은 segment를 공유하는 것이다.
(자세한 것은 <Bulletin#: 11938> 참조)

Oracle8.1부터 추가된 tempfile형태의 중요한 특징은 tempfile에 발생하는
변경사항은 redo log file에 기록되지 않는다는 것이다. tempfile에
checkpoint정보도 기록하지 않고 이에 따라 datafile recovery시에도
tempfile에 대해서는 recovery가 필요없게 된다.
이와 같은 이유로 standby database에서 read-only mode로 open하고
조회시 sort가 발생하여 tempfile이 변경되는것은 문제가 되지 않아
사용이 가능하다.

그리고 이미 앞에서 설명한 것과 같이 tempfile은 항상 locally managed
type으로만 생성이 되며, datafile형태의 temporary tablespace는 다음과
같이 locally managed type으로 생성 자체가 불가능하다.

SQL> create tablespace temp_datafile_local
2 DATAFILE '/ora/oradata/V920/temp_data.dbf' size 100M
3 TEMPORARY
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

ORA-25144: invalid option for CREATE TABLESPACE with TEMPORARY contents


(2) temporary tablespace 생성 방법 비교

- tempfile형태의 경우
tempfile로 temporary tablespace를 생성하는 경우는 다음과 같이
생성하여야 하며, 반드시 locally managed 형태로만 생성 가능하다.

SQL> create TEMPORARY tablespace temp_tempfile_local
2 TEMPFILE '/ora/V920/temp_temp.dbf' size 100M
3 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

아래 명령어에서 3번 line을 제거하고 생성하여도 default로 locally
managed로 생성이 되며, dictionary managed 형태로 생성하고자
3번 line대신 storage option을 추가하면
ORA-2180 (invalid option for CREATE TABLESPACE) 오류가 발생한다.

- datafile형태의 경우
다음과 같은 형태로 생성하게 되면, dictionary managed type의
temporary datafile형태로 tablespace가 만들어진다. 단, 9i의 경우
이미 앞에서 언급한대로 system tablespace가 locally managed인 경우에는
이와 같은 dictionary managed tablespace 생성은 ORA-12913이 발생하면서
불가능하게 된다.

SQL> create tablespace temp_datafile_dict
2 datafile '/ora/oradata/V920/temp_data.dbf' size 100M
3 TEMPORARY;

(3) dictionary view 의 차이

먼저 dba_tablespaces를 통해
SQL> select tablespace_name, contents, extent_management,
allocation_type from dba_tablespaces;

TABLESPACE_NAME CONTENTS EXTENT_MAN ALLOCATIO

TEMP_TEMPFILE_LOCAL TEMPORARY LOCAL UNIFORM
TEMP_DATAFILE_DICT TEMPORARY DICTIONARY

- tempfile의 경우

SQL> select STATUS, ENABLED, NAME from v$tempfile;

STATUS ENABLED NAME

ONLINE READ WRITE /ora/V920/temp_temp.dbf

SQL> select FILE_NAME, TABLESPACE_NAME from dba_temp_files;

FILE_NAME TABLESPACE_NAME

/ora/V920/temp_temp.dbf TEMP_TEMPFILE_LOCAL


- datafile 형태의 경우

다음과 같이 v$datafile과 dba_data_files를 통해 조회한다.

SQL> select STATUS, ENABLED, NAME from v$datafile;

STATUS ENABLED NAME

ONLINE READ WRITE /ora/oradata/V920/temp_data.dbf

SQL> select FILE_NAME, TABLESPACE_NAME from dba_data_files;

FILE_NAME TABLESPACE_NAME

/ora/oradata/V920/temp_data.dbf TEMP_DATAFILE_DICT

(4) tempfile의 삭제에 대해서

datafile의 경우 tablespace를 삭제하지 않고 datafile만 삭제하는 방법은
존재하지 않는다. 물론 alter database datafile 'filename' offline drop;
과 같은 command가 있지만 이것도 datafile을 데이타베이스에서 지워주는
것이 아니며 이렇게 offline drop된 datafile을 포함하는 tablespace는
recovery가 불가능한 경우라면 tablespace자체를 삭제해야 한다.

그런데 tempfile의 경우는 temporary tablespace는 그대로 유지한 채,
tempfile만 삭제하는 것이 가능하다.

SQL> alter database tempfile '/oradata/V817/temp_temp01.dbf'
2 drop;

8i의 경우라면 이와 같은 명령어 후 실제 directory로 이동하여 직접
tmep_temp01.dbf를 삭제하여야 한다.

9i에서는 drop뒤에 including datafiles 라는 option을 추가하여 tempfile의
drop시 바로 os상에서도 삭제되도록 할 수 있다.

SQL> alter database tempfile '/oradata/V817/temp_temp01.dbf'
2 drop including contents;

만약 이러한 방법으로, tempfile을 해당 temporary tablespace에서 모두
삭제한 경우, 실제 해당 tablespace에 disk sort가 필요하게 되면,
그때는 ORA-25153 (Temporary Tablespace is Empty) 오류가 발생하게 된다.

이때는 다음과 같이 임의의 tempfile을 다시 추가할 수 있다.

SQL> alter tablespace TEMP_TEMPFILE_LOCAL
2 add tempfile '/oradata/V817/temp_temp02.dbf';

Reference Documents

광주은행 안심클릭 DB 작업

### default temp 파일로 생성되어 있을 경우 아래처럼 drop 후 추가하면 됨
SQL> alter database tempfile '/logs/oradata/temp01.dbf' drop;

Database altered.

SQL> alter tablespace TEMP add tempfile '/logs/oradata/acsdb/temp01.dbf' SIZE 100M;

Tablespace altered.

### datafile type으로 temp 생성 되어 있을 경우
SQL> CREATE TEMPORARY TABLESPACE TEMP02 TEMPFILE '/logs/oradata/temp02.dbf' SIZE 100M
Tablespace created.
SQL> alter user VISA3D temporary tablespace TEMP02;
SQL> alter tablespace TEMP offline;
Tablespace altered.

SQL> drop tablespace temp;
Database droped.


### DATA 파일 이동
SQL> ALTER TABLESPACE USER_DATA RENAME DATAFILE '<OLD FILE>' TO '<NEW FILE>';

Posted by redkite
, |

### 로그파일 추가시

1. 먼저 Dummy 그룹 추가
alter database add logfile group 3 '/data/oradata/redoo4.log' size 50m;


2. 변경할 그룹 inactive 상태로 만들기
alter system switch logfile;


3. Inactive 상태가 됐는지 확인
select * from v$log;
select * from v$logfile;


4. 그룹 삭제
alter database drop logfile group 1;


5. 로그 그룹 추가
alter database add logfile group 1 ('/data/oradata/redo01a.log','/data/oradata/redo01b.log','/data/oradata/redo01c.log','/data/oradata/redo01d.log','/data/oradata/redo01e.log') size 524288000;
alter database add logfile group 2 ('/oracle/oradata/ESMDB/redo02a.log','/oracle/oradata/ESMDB/redo02b.log','/oracle/oradata/ESMDB/redo02c.log','/oracle/oradata/ESMDB/redo02d.log','/oracle/oradata/ESMDB/redo02e.log') size 524288000;

Posted by redkite
, |

No. 11747

RAW DEVICE와 FILE SYSTEM 간에 오라클 데이터화일 이동하기
======================================================

유닉스 명령이 dd를 이용하여 오라클 데이터화일을 Unix File System과 Raw
Device 간에 이동할 수 있으나, 플랫폼 별 Raw Device의 특성으로 인하여 주의할
점이 있다. 만일 잘못된 이동으로 인하여 데이터베이스가 기동하지 못하면,
ORA-7366 (sfifi: invalid file, file does not have valid header block.)
에러가 발생할 수 있다.

예를 들어 Digital unix의 경우는 raw device에 64k OS 헤더가 필요하므로 dd
명령어 옵션 중 iseek와 oseek를 활용하여야 한다.

다음은 예제를 통하여 데이터화일을 Raw Device에서 Unix File System으로
이동하는 절차이다.

(운영 현황)

- 현재의 위치: /dev/rdsk/c0t15d0s7
- 이동할 위치: /oracle/file/system.dbf
- 화일의 크기: 488636416 bytes <--- V$DATAFILE.BYTES column 값!
- DB_BLOCK_SIZE: 2048 bytes


(준비 단계)

1. Oracle 블럭 수 계산:

BYTES / DB_BLOCK_SIZE = 488636416 / 2048 = 238592 (블럭)

2. O/S file header 블럭 추가:

238592 + 1 = 238593 (블럭)
: "ls -l /oracle/file/system.dbf" 명령으로 확인 가능하며, O/S file
header는 1블럭으로 항상 일정함.

3. Raw Device OS header 블럭 계산: raw device (os block) header size

64K / DB_BLOCK_SIZE = 65536 / 2048 = 32 (블럭)
: 사용할 dd 명령어 중 블럭의 크기를 DB_BLOCK_SIZE(2048바이트)로 할
예정이므로 2048로 나누어야 함.

(명령어 형식)

$ dd if=<raw device> of=<UFS file> bs=<oracle blocksize>
iseek=<blocks to skip> count=<total count>

(명령어 수행 절차)

(1) SVRMGR> STARTUP MOUNT
(2) SVRMGR> !dd if=/dev/rdsk/c0t15d0s7 of=/oracle/file/system.dbf bs=2048 iseek=32 count=238593
(3) SVRMGR> ALTER DATABASE RENAME FILE '/dev/rdsk/c0t15d0s7' TO
'/oracle/file/system.dbf';
(4) SVRMGR> ALTER DATABASE OPEN;

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

반대로 Unix File System에서 Raw Device로 이동하는 명령어 형식은 아래와 같다.

(명령어 형식)

$ dd if=<UFS file> of=<raw device> bs=<oracle blocksize> \
oseek=<blocks to skip> count=<total count>

유사한 방식으로 데이타 화일 뿐 아니라 리두 로그 화일도 이동할 수 있다.

[주의] Raw Device의 블럭 헤더의 크기는 OS마다 다를 수 있으므로 플랫폼
벤더사에 미리 확인한 후 작업하여야 한다.

[출처] RAW DEVICE FILE SYSTEM 간에 오라클 데이터화일 이동하기 (ProDBA) |작성자 산타

'01.오라클 > 002.DB 마이그레이션' 카테고리의 다른 글

[오라클]Characterset 변경  (0) 2013.02.20
[오라클]Full export / import  (0) 2013.02.20
[오라클]Undo Tablespace 변경  (0) 2012.12.19
[오라클]Voting Disk 이관  (0) 2012.12.19
[오라클]Templorary File 변경  (0) 2012.12.19
Posted by redkite
, |

▶ SYSMAN 이란?
SYSMAN
By default during the installation of Oracle Enterprise Manager, one Super Administrator account is created with the user name of SYSMAN. The SYSMAN account should be used to perform infrequent system-wide, global configuration tasks such as setting up the environment. Other administrator accounts can be created for daily administration work. The SYSMAN account is:
Owner of the Management Repository schema
Default Enterprise Manager Super Administrator
User name used to log in to Enterprise Manager the first time
10g 설치시 EM이 설치되는데 EM의 최고권리자 계정으로 생성되는 계정입니다.
. Reopsitory 스키마의 관리를 하는 계정입니다.
. EM의 최고권리자입니다.
. EM 으로 가장 처음 로그인 가능한 유저입니다.


▶ DBSNMP 이란?
. grid control 에서 각 DB의 연결정보 등을 담당하는 계정입니다.
. DBSNMP를lock 시킬경우 Grid Control 및 EM 사용 못합니다.


▶ MGMT_VIEW 이란?
. SYSMAN/EM 관련계정입니다.
3가지 모두 EM과 관리된 계정들로EM을 사용하신다면 lock 하시면 안되고
EM을 사용안하신다면 보안성때문에 lock을 하는 싸이트도 있습니다.

Posted by redkite
, |

1. 프로세스 모니터링

1) 서버 프로세스
SELECT sid, serial#, username, status "Status of Session", server "ServerType", osuser, machine, program, process FROM v$session;
2) 사용자 프로세스
SELECT sid, serial#, osuser, process, machine, program, to_char(logon_time, 'yyyy/mm/dd hh:mi:ss') as Logon_Time FROM v$session WHERE (upper(server) <> 'PSEUDO' AND UPPER(program) NOT LIKE 'oracle.exe%') and serial# <> 1;

2. SGA 모니터링

1) Data Buffer Cache 구조
SELECT id, name, block_size, buffers FROM v$buffer_pool;

2) 히트율
SELECT phy.value "Physical Read",cur.value+con.value "Buffer Cache Read", (1-((phy.value) / (cur.value+con.value)))*100 "히트율" FROM v$sysstat cur, v$sysstat con, v$sysstat phy WHERE cur.name = 'db block gets' and con.name = 'consistent gets' and phy.name = 'physical reads';
3) Wait Status 확인
SELECT (SELECT total_waits FROM v$system_event WHERE event = 'free buffer waits') "Free Buffer Waits", (SELECT total_waits FROM v$system_event WHERE event = 'buffer busy waits') "Buffer Busy Waits" FROM dual;
4) 메모리 사용상태(세션별)
SELECT A.process, A.username, B.block_gets, B.consistent_gets, B.physical_reads FROM v$sess_io B, v$session A WHERE B.sid = A.sid;

3. 로그 버퍼 히트율 모니터링

SELECT S1.value "Redo Alloc Retries", S2.value "Redo Entries", S1.value / S2.value * 100 "히트율" FROM v$sysstat S1, v$sysstat S2 WHERE S1.name = 'redo buffer allocation retries' AND S2.name = 'redo entries';

4. Shared Pool 모니터링

1) 히트율
SELECT Gets, Gethits, Gethitratio*100 "히트율"FROM v$Librarycache WHERE namespace = 'SQL AREA';

2) Reload 상태
SELECT SUM(pins) "Executions(PINS)", SUM(reloads) "Cache Misses(RELOADS) " , SUM(reloads) / SUM(pins)*100 "Reload" FROM v$Librarycache;
3) Reserved Pool(응답상태)
SELECT requests, request_misses, request_failures, free_space, avg_free_size, max_free_size, used_space,avg_used_size FROM v$shared_pool_reserved;
4) Parsing SQL문 상태
SELECT cpu_time, elapsed_time,executions, loads, invalidations, version_count, parse_calls, sorts, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN (2,3,6,7) AND rownum <= 200 ORDER BY sql_text DESC;
5) 파싱 SQL문(메모리순)
SELECT buffer_gets, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN(2,3,6,7) ORDER BY buffer_gets DESC;
6) 파싱 SQL문(I/O순)
SELECT disk_reads, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN(2,3,6,7) ORDER BY disk_reads DESC;
7) Shard Pool 히트율
SELECT SUM(gets) " Gets", SUM(getmisses) "Cache Get Misses", SUM(getmisses)/SUM(gets)*100 "히트율" FROM v$rowcache;

5. Large Pool 메모리 상태

SELECT pool, name, bytes FROM v$sgastat WHERE pool = 'large pool';

6. 프로세스 상태

1) DBWR 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%DB%';
2) DBWR 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'free buffer waits';

3) CKPT 정보

SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%CKPT%';
4) CKPT 대기상태
SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event LIKE 'log file switch (checkpoint%';
5) LGWR 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%LGWR%';
6) LGWR 대기상태
SELECT sid, event, seconds_in_wait, state FROM v$session_wait WHERE event = 'log buffer space%';
7) PMON 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%PMON%';
8) PMON 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'pmon timer';
9) SMON 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%SMON%';
10) SMON 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'smon timer';

7. 데이터 파일 상태

1) Data-File 구조
SELECT B.file_id "File #", B.file_name, B.tablespace_name, B.bytes "Bytes", ((B.bytes - sum(nvl(A.bytes,0)))) "Used Space", (SUM(NVL(A.bytes,0))) "Free Space", (SUM(NVL(A.bytes,0)) / (B.bytes)) * 100 "FreeSpace Ratio" FROM sys.dba_free_space A, sys.dba_data_files B WHERE A.file_id(+) = B.file_id GROUP BY B.tablespace_name, B.file_id, B.file_name, B.bytes ORDER BY B.file_id;
2) Disk I/O 상태
select name, phyrds, phywrts FROM v$datafile DF, v$filestat FS WHERE DF.file# = FS.file#;
3) Object 종류
SELECT A.owner, A.object_id, A.object_name, B.partition_name, B.tablespace_name, B.bytes, B.blocks, B.extents, B.initial_extent, B.next_extent, B.min_extents, B.max_extents, B.pct_increase, B.freelists, B.relative_fno, B.buffer_pool, A.created, A.status FROM dba_objects A, dba_segments B WHERE A.owner = 'SCOTT' AND A.object_type = 'TABLE' ORDER BY A.object_name;
4) 롤백세그먼트 경합상태
SELECT SUM(waits) "Waits", SUM(gets) "Gets", 100 * SUM(waits)/SUM(gets) "히트율" FROM v$rollstat;
5) 롤백세그먼트 대기상태
SELECT (SELECT count FROM v$waitstat WHERE class = 'undo header') "Undo Header", (SELECT count FROM v$waitstat WHERE class = 'undo block') "Undo Block", (SELECT count FROM v$waitstat WHERE class = 'system undo header') "System Undo Header", (SELECT count FROM v$waitstat WHERE class = 'system undo block') "System Undo block" FROM dual;

6) Temp 세그먼트 경함상태
SELECT username, user, contents, segtype, extents, blocks FROM v$sort_usage;
7) Lock 상태(Holder & Waiter)
SELECT LPAD(' ',DECODE(request,0,0,1))||sid sess, id1, id2, lmode, request, type FROM v$lock WHERE id1 IN (SELECT id1 FROM v$lock WHERE lmode = 0) ORDER BY id1, request;
8) Lock 상태(Waiters)
SELECT LPAD(' ',DECODE(C.request,0,0,1))||C.sid sess, B.username, B.program, C.type, A.sql_text SQL FROM v$sqlarea A,v$session B, v$lock C, v$access D WHERE C.id1 IN (SELECT id1 FROM v$lock WHERE lmode = 0 OR lmode = 6) AND A.address(+) = B.sql_address AND A.hash_value(+) = B.sql_hash_value AND B.sid = D.sid AND B.sid = C.sid AND D.sid = C.sid AND D.owner != 'SYS' ORDER BY C.id1, C.request;
9) DB 사용자
SELECT username, default_tablespace, temporary_tablespace, account_status, expiry_date, lock_date, profile FROM dba_users;

8. Control 파일 구조

SELECT * FROM v$controlfile;

9. 리두로그 파일확인

1) 파일 구조
SELECT A.group# col1, bytes / 1024 col2, members col3, member col4 , A.status col5, sequence# FROM v$log A, v$logfile B WHERE A.group# = B.group#;
2) 대기 상태
SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event LIKE 'log file switch completion%';

10. 아카이브로그 확인

1) 로그 설정 상태
SELECT value FROM v$parameter WHERE name = 'log_archive_start';

2) 아카이브 파일
SELECT name, sequence#, first_change#, first_time, next_change#, next_time, archived, status FROM v$archived_log;

11. 파라메터 확인

SELECT name, type, value, isdefault FROM v$parameter;

Posted by redkite
, |

ALTER PROFILE "DEFAULT" LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
CONNECT_TIME UNLIMITED
IDLE_TIME UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
COMPOSITE_LIMIT UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;

비밀번호 관리

암호관리란?

더 뛰어난 데이터베이스 보안을 위해서 관리자가 프로파일로 오라클 암호를 관리 제어 할 수 있는 기능을 말합니다.

암호관리의 기능

- 계정 잠금(Accont locking) : 계정잠금 이란 사용자가 지정된 시도 횟수 내에 시스템에 로그인하지 못한 경우 자동적으로 계정을 잠그는 기능을 말합니다.

- 암호의 노화(aging)와 기간 만료(expire) : 암호가 수명을 갖도록 하여 그 기간이 지나면 암호를 변경 하도록 설정하는 기능 입니다.

- 암호의 현재까지의 기록(Password history) : 암호를 검사하여 지정된 시간 동안이나 지정된 횟수 이상 사용되지 않도록 설정 할 수 있습니다.

- 암호의 복잡성 검증(Password complexity verification) : 추측된 암호를 사용하지 못하도록 암호를 충분히 복잡하게 설정 할 수 있는 기능 입니다.

암호관리를 사용하는 방법

- 프로파일을 사용자에게 지정하여 암호관리를 설정 합니다.

- CREATE USER나 ALTER USER 명령을 사용하여 계정을 잠그거나 잠금을 해제하고 기간을 만료 할 수 있습니다.

- 인스턴스의 RESOURCE_LIMIT가 FALSE로 설정되어 있더라도 암호제한은 항상 시행 됩니다.

- 자원 제한 설정과 비슷하게 CREATE나 ALTER USER 명령을 사용하여 암호 설정을 제한하도록 프로파일을 생성하여 사용자에게 지정할 수 있습니다.

- SESSIONS_PER_USER 같은 다른 제한들은 초기화 파라미터나 ALTER SYSTEM 명령으로 자원 제한이 enable되어 있을 때에만 시행되는 반면, 프로파일의 암호 설정은 항상 시행 됩니다.

- 암호 관리가 enable되면 사용자 계정은 CREATE USER나 ALTER USER 명령을 사용하여 잠그거나 잠금을 해제할 수 있습니다.

암호 설정 방법

아래와 같이 프로파일을 생성 하고 그 프로파일을 암호설정을 적용할 유저에게 부여하면 됩니다.

 

SQL> CREATE PROFILE scott_password

LIMIT FAILED_LOGIN_ATTEMPTS 3 ---> 로그인 실패 횟수

PASSWORD_LIFE_TIME 30 ---> 기간만료일

PASSWORD_REUSE_TIME 30 ---> 암호가 재사용 될 때까지의 날 수

PASSWORD_VERIFY_FUNCTION verify_function ---> 복합성 검사를 수행할 PL/SQL

PASSWORD_GRACE_TIME 5 ; ---> 유예기간

 

암호 설정 관련 파라미터

Parameter

설 명

FAILED_LOGIN_ATTEMPTS
[계정잠금]

계정을 잠그기 전까지 로그인 시도하다 실패한 횟수.

오라클 서버는 FAILED_LOGIN_ATTEMPTS 값에 도달하면 자동적으로 계정을 잠근다.

계정은 지정된 시간(PASSWORD_LOCK_TIME)이 지난 후 자동적으로 잠금이 해제되거나 데이터베이스 관리자가 ALTER USER 명령으로 잠금을 해제해야 한다.

데이터베이스 계정은 ALTER USER 명령을 사용하여 명시적으로 잠글수도 있는데 이렇게 하면 계정은 자동적으로 잠금 해제되지 않는다

PASSWORD_LOCK_TIME
[계정잠금]

암호가 기간 만료되어 계정이 잠겨진 채로 남아 있었던 날 수

PASSWORD_LIFE_TIME
[노화와 기간만료]

날 수로 표시한 암호의 수명으로 이 기간이 지나면 기간 만료됨

PASSWORD_GRACE_TIME
[노화와 기간만료]

암호가 기간 만료된 후 첫번째 성공적인 로그인부터 암호 변경을 할 때까지의 유예기간

PASSWORD_REUSE_TIME
[현재까지의 기록]

암호가 재사용 될 때까지의 날 수

PASSWORD_REUSE_MAX
[현재까지의 기록]

암호가 재사용 될 수 있는 최대 회수

PASSWORD_VERIFY_FUNCTION
[복합성 검증]

암호를 할당 하기 전 복합성 검사를 수행할 PL/SQL 함수

암호 노화(Aging) 기간 만료

- PASSWORD_LIFE_TIME 파라미터는 패스워드의 수명을 설정 합니다. 이 기간이 지나면 암호를 변경해야 합니다.

- 데이터베이스 관리자는 유예 기간(PASSWORD_GRACE_TIME)을 지정할 수 있습니다. 이 기간은 암호가 기간 만료된 후 데이터베이스에 처음 접속한 때부터 시작 됩니다.

- 유예 기간이 끝날 때까지는 사용자가 매번 접속하려 할 때마다 경고 메시지가 발생 하며, 사용자는 유예 기간 내에 암호를 변경해야 합니다. 암호가 변경되지 않으면 계정은 잠깁니다.

- 암호를 기간 만료된 것으로 명시적으로 설정하면 사용자의 계정 상태는 EXPIRED로 변경됩니다. 이렇게 되면, 사용자가 로그인 할 때 계정은 유예 기간으로 넘어 갑니다.

암호의 현재까지의 기록

- 암호의 현재까지의 기록은 사용자가 지정된 기간 동안 암호를 재사용하지 못하게 합니다. 아래의 한 가지 방법으로 구현할 수 있습니다.

- PASSWORD_REUSE_TIME : 주어진 날 수 동안 암호를 재사용할 수 없도록 지정.

- PASSWORD_REUSE_MAX : 예전에 사용한 암호와 동일한 것을 사용하지 못하도록 시행.

Password Verification Function VERIFY_FUNCTION

- 사용자에게 암호를 할당하기 전에 암호의 유효성을 검증 할 수 있습니다.

- 암호의 최소길이는 네문자 입니다.

- 암호는 사용자 이름과 같아서는 안된다.

- 암호는 최소한 하나의 알파벳,하나의 수자,그리고 하나의 특수 문자를 가져야한다.

- 암호는 예전에 사용했던 암호와 최소한 세문자는 달라야한다.

- utlpwdmg.sql 스크립트에 의해 VERIFY_FUNCTION이라는 디폴트 PL/SQL 함수 형태로 제공되며 반드시 SYS 스키마에서 실행되어야 합니다.

- 디폴트 profile의 PASSWORD_VERIFY_FUNCTION 기능을 사용하지 않으려면 아래의 명령어를 실행하면 됩니다.

 

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;

 

계정 잠금과 암호 제어(Controlling Account Lock and Password)

ALTER USER 명령을 사용하여 암호를 변경하고 계정을 잠글 수 있습니다. 이와 같은 작업이 필요한 경우는 다음과 같습니다.

  • - 사용자가 암호를 잃어버려서 암호를 재설정하고자 할 때
  • - 시스템에 의해 잠겨진 사용자 계정을 풀 때
  • - 계정을 명시적으로 잠글 때
  • - 수동으로 암호를 만료되게 할 때, 사용자 암호를 재설정할 때 유용합니다.

암호 만료후 재설정 문법

 

ALTER USER user

[ IDENTIFIED {BY password | EXTERNALLY } ]

[ PASSWORD EXPIRE ]

[ ACCOUNT { LOCK | UNLOCK } ] ;

 

암호 만료후 재설정 예제

 

SQL> ALTER USER scott

IDENTIFIED BY puhaha

PASSWORD EXPIRE ;

 

사용자가 로그인한 상태라면 암호 변경, 만료, 잠금은 현재의 세션에는 영향을 주지 않습니다. 사용자 계정이 잠겨져 있는데 접속하려 하면 아래와 같은 메세지가 출력 됩니다

 

ERROR:

ORA-28000: the account is locked

Warning: You are no longer connected to ORACL

 

Posted by redkite
, |

### 컨트롤 파일 ####

   
   
   
   
  1. 컨트롤 파일 미러링
    1) spfile의 경우
    shutdown immediate; -- DB서버를 정지
    alter system set controlfiles = '/data/controlfile1.ctl', '/data/controlfile2.ctl' scope=spfile; -- 파일 추가
    cp /data/controlfile1.ctl /data/controlfile2.ctl ## OS에서 파일 복사
    startup
    2) pfile의 경우
    shutdown immediate; -- DB서버 정지
    vi /data/admin/pfileSID.ora 파일에 컨트롤 파일 추가
    cp /data/controlfile1.ctl /data/controlfile2.ctl ## OS에서 파일 복사
    startup

  1. 컨트롤 파일 복구
    SQL> select spid, name from v$process, v$bgprocess where paddr(+) = addr; -- 프로세스 확인
    SQL> show parameter user_dump_dest

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    user_dump_dest string /data/oracle/app/oracle/admin/emsdb/udump -- 해당 디렉토리에는 컨트롤 파일을 재생성할 수 있는 스크립트가 저장되어 있음.
    SQL > shutdown immediate;
    cd /data/oracle/app/oracle/admin/emsdb/udump/
    grep controlfile *.trc ## 해당 파일 찾은 후
    cp -p SID_ora_PID.trc controlfile.sql ## 파일 변경 후
    sqlplus "/as sysdba"
    SQL > @controlfile.sql -- 실행 하면 컨트롤 파일 및 아카이브 파일이 생성 된다. 일부 에러 발생 가능성 있음.

### 리두로그 파일 ###

  1. 리두 로그 파일 미러링
    SQL > select * from v$logfile; -- 로그 파일 확인
    SQL > select * from v$log; -- 현재 사용 중인 로그 파일 확인 및 MEMBERS 의 수가 1만 있을 경우 미러링이 안되어 있는 것임
    SQL > alter database add logfile group 2 '/data/redo/redolog2_1.log' size 500M; -- 그룹 생성
    SQL > alter database add logfile member '/data/redo/redolog2_2.log' to group 2; -- 2그룹에 대한 추가 파일 생성

### 아카이브 모드 확인 ###

SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/archivelog
Oldest online log sequence 748
Next log sequence to archive 750
Current log sequence 750

SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/archivelog
Oldest online log sequence 748
Next log sequence to archive 750
Current log sequence 750

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

GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 748 YES INACTIVE
2 749 YES INACTIVE
3 750 NO CURRENT
4 595 YES INACTIVE
5 596 YES INACTIVE
6 597 NO CURRENT

6 rows selected.


SQL> select archiver from v$instance;

ARCHIVE
-------
STARTED


### 오프라인 백업(노아카이브 모드) ###

  1. 주의 할 점
    오프라인 백업 시에는 정상적인 방법으로 종료(normal, immediate, transactional) 해야 한다. abort 종료의 경우 메모리 상의 할당된 내용도 즉시 종료 하고 데이터 베이스를 종료하기 때문에 나중에 스타트업 시에 복구 작업을 수행하게 된다. 이때 수행하는 프로세스는 SMON이다.
  2. 백업 받을 파일은 컨트롤 파일, 데이터 파일, 리두로그 파일, 파라메터 파일 전부를 같은 시점에 백업 받아야 한다.
    한번에 같이 받지 않으면 복구 시점이 틀어지게 된다. 이유는 컨트롤 파일의 SCN 번호 부여가 바뀌기 때문이다.
  3. 백업 전 확인 사항
    SQL > select TABLESPACE_NAME, FILE_NAME from dba_data_files; -- 데이터 파일의 구조 분석
    SQL > select GROUP#, MEMBER from v$logfile; -- 리두로그 파일의 구조 분석
    SQL > select * from v$confile; -- 컨트롤 파일의 구조 분석
    SQL > host edit /data/oracle/products/pfile/initSID.ora -- 파라메터 파일 구조 분석

    ## 오라클 DB 정상적인지 확인SQL > host edit moredept.sql
    alter system switch logfile;
    insert into scott.dept values(1,'Personnen','Pusan');
    insert into scott.dept values(2,'Personnen','Pusan');
    insert into scott.dept values(3,'Personnen','Pusan');
    alter system switch logfile;
    insert into scott.dept values(4,'Personnen','Pusan');
    insert into scott.dept values(5,'Personnen','Pusan');
    insert into scott.dept values(6,'Personnen','Pusan');
    alter system switch logfile;
    insert into scott.dept values(7,'Personnen','Pusan');
    insert into scott.dept values(8,'Personnen','Pusan');
    insert into scott.dept values(9,'Personnen','Pusan');
    commit;
    select count(*) from scott.dept
    SQL > @moredept

  4. 특정 파일이 삭제되어 데이터 베이스 OPEN이 안될 경우
    startup -- 에러 발생될 경우 해당 파일을 아래의 명령어로 변경 후 open 시도 ## 컨트롤 파일의 파일경로 수정을 해주는 단계임.
    alter database rename file '/data/users01.dbf' to '/data/oradata/users01.dbf';
    alter database open;

### 아카이브 모드 백업-복구 ###

  1. 아카이브 모드 변경 작업
    1) initSID.ora 파일에 아래의 내용을 넣는다.
    LOG_ARCHIVE_START = TRUE
    LOG_ARCHIVE_DEST = [archivefile의 경로와 파일명]
    LOG_ARCHIVE_DEST_n = [archivefile의 경로와 파일명] ## DB_RECOVERY_FILE_DEST 파라메터를 정의하면 안된다.(해당 경로는 10g에서 플래시백에서 사용함)
    LOG_ARCHIVE_FORMAT = [format type].[확장자] ## sample [%r_%s.arc]
    ## [%s]아카이브의 일련번호 : 1, 2, 3 ... [%S] 아카이브 파일의 일련번호를 0으로 채워줌 00001, 00002, 00003 ...
    ## [%t]데이터 베이스의 인스턴스를 구분해서 표시해줌 [%T] 001, 002, 003...
    ## [%r]재시작된 후 아카이브 파일의 혼동을 줄이기 위해 RESETLOG ID 값을 구분하기 위한 것임.alter database open resetlogs명령어에 의해..(10g부터 적용됨)
    DB_RECOVERY_FILE_DEST ="
    2) 아카이브 모드 변경
    startup mount
    alter database archivelog;
    alter database open;
  2. 아카이브 모드 복구 절차(전체 복구 방법)
    1) FULL 백업 된 파일들의 백업 시점이 일치하는지 확인.
    2) 아카이브 모드로 운영중인지 확인.
    3) 최종 FULL 백업된 이후의 아카이브 로그 파일이 있는지 확인.
    4) 최종 리두로그 파일이 존재하는지 확인.(select * v$log;) -- 마운트 단계까지 들어간다.
    5) 장애가 발생한 데이터 파일 확인.(select * v$recover_file; select file_id, file_name from dba_data_files;) 에러가 발생한 DBF파일을 복사해 놓는다.
    6) 데이터 베이스 STARTUP
    7) recover database;
    8) auto
    9) alter database open
  3. 아카이브 모드 복구 절차(테이블 스페이스 완전 복구 방법)
    1) 오픈단계에서 장애발생 테이블스페이스 기준으로 복구한다.
    2) 오프라인 백업 데이터의 생성일자를 확인한다.
    3) 아카이브 모드로 운영중인지의 여부 확인한다.
    4) DB shutdown 후에 해당 테이블 스페이스의 데이터 파일을 복사한다.
    5) DB startup 한다. 기동 시에 해당 데이터 파일의 시점 불일치 에러 메시지가 발생한다.(ORA-01113, ORA-01110)
    6) alter database datafle 'OOOO.DBF' offline ;
    7) ALTER DATABASE OPEN; -- 을 실행하여 정상적으로 OPEN 시도.
    8) ALTER TABLESPACE OOOO OFFLINE IMMEDIATE; -- 해당 테이블 스페이스는 ONLINE상태로 OFFLINE으로 변경해줘야 한다.
    9) RECOVER TABLESPACE OOOO;
  4. 아카이브 모드 복구 절차(데이터파일 완전 복구 방법)
    1) 오픈단계에서 장애발생 데이터 파일기준으로 복구한다.
    2) 오프라인 백업 데이터의 생성일자를 확인한다.
    3) 아카이브 모드로 운영중인지의 여부 확인한다.
    4) DB shutdown 후에 해당 데이터 파일을 복사한다.
    5) DB startup 한다. 기동 시에 해당 데이터 파일의 시점 불일치 에러 메시지가 발생한다.(ORA-01113, ORA-01110)
    6) alter database datafle 'OOOO.DBF' offline IMMEDIATE;
    7) ALTER DATABASE OPEN; -- 을 실행하여 정상적으로 OPEN 시도.
    8) RECOVER DATAFILE 'OOOO.DBF';
    9) AUTO
  5. 아카이브 모드 복구 절차(read-only 테이블 복구)
    1) 백업 파일 복사
    2) startup mount -- DB를 마운트 단계까지 간다.
    3) recover database
    4) alter database open;
    5) alter tablespace TABLESPACE_NAME read only;
  6. 패러럴 복구 절차

    1) initSID.ora 파일 관련 파라메터 수정(Parallel_min_servers=2 / Parallel_max_servers=4 / Recovery_parallel_servers =4)
    2) select name from v$bgprocess; (P000, P001 등 프로세스가 수행됨)
    3) recover database parallel(degree 4)

  7. 시간기반 불완전 복구 방법
    1) DROP 된 테이블을 DROP 시키기 전으로 복구
    2) 로그마이너 패키지로 확인 가능



    3) 백업된 모든 데이터 파일 복사
    ** 주의 **
    장애가 발생한 데이터 파일만 복사하여 아카이브 파일들을 순차적으로 적용하게 되면 복구 작업이 완료되었지만, 불완전 복구 방법에서는
    특정 파일만 재 설치해서는 모든 데이터를 과거 특정시점으로 되돌릴 수 없기 때문에 반드시 모든 데이터를 과거 시점으로 복구 해야 함.
    불완전 복구 작업을 수행할 때 가장 중요한 포인트 중에 하나는 마지막 오프라인 백업된 모든 데이터 파일들을 현재
    경로로 복사 해야 한다는 것임.
    이때, 마지막 컨트롤 파일이나 리두로그 파일들은 복사할 필요는 없으며, 데이터 파일이 깨진 것이므로 모든 데이터 파일들만 복사 해야 함.
    4) STARTUP MOUNT
    5) SET AUTORECOVERY ON
    6) RECOVER DATABASE UNTIL TIME '2011-07-12-12:10:10'; ## 시점 복구
    7) ALTER DATABASE OPEN; ## 해당 명령을 실행하면 아래와 같은 에러 메시지 발생.
    ORA- Can not open Database; Please Open Database with resetlog option
    8) ALTER DATABASE OPEN RESETLOGS; ## SCN과 모든 로그 파일이 새로 시작되는 것임
    archivce log list 로 확인 가능
    9) DROP 된 테이블 복구 확인 후 OFF-LINE 백업 꼭 수행해야 함!!!(## RESETLOGS로 로그파일이 초기화 되기 때문에 꼭 백업 해야 함)
  8. 취소 기반 불완전 복구
    1) 복구 파일 복사 후 STARTUP MOUNT
    2) SET AUTORECOVERY ON
    3) RECOVER DATABASE UNTIL CANCEL; 과거 특정 시점까지 복구 완료
    ### 리두로그 파일 일부 삭제 시 복구

    ### 리두로그 파일 전체 삭제 시 복구



    ### 모든 컨트롤 파일이 삭제된 경우

    마지막 Current Redo log 파일을 지정해 주어야 함.
    ### 컨트롤 파일과 특정 datafile 삭제된 경우
  9. 변경기반 불완전 복구 방법
    1) RECOVER DATAABASE UNTIL CHANGE 80014;

6/2 일 SQL 튜닝 교육 5090912_workshop.zip5090914_labs.zip

  1. blocks 할당이 크고 avg_space의 크기가 크면 공간 낭비가 심한것임.
    SQL > select table_name, num_rows, blocks, avg_space, last_analyzed
    from user_tables
    where table_name like '%'
    SQL > save a1 -- 저장됨.
    SQL > get a1 -- 불러오기
    SQL > exec dbms_stats.gather_table_stats('sh','cust_test'); -- 통계정보 갱신
    SQL > exec dbms_stats.delete_table_stats('sh','sales_test'); -- 통계정보 삭제
  2. blevel 이 4level 로 떨어질 경우 공간 활용도가 떨어지고 있다는 것임.
    SQL > select index_name, num_rows, distinct_keys, leaf_blocks, blevel
    from user_indexes
    where table_name = 'sales_test'
  3. SQL TRACE
    SQL > alter session set tracefile_identifier = 'statement_trace';
    SQL > alter session set sql_trace=true;
    SQL > select max(cust_credit_limit) from customers
    where cust_city = ' Paris';
    SQL > alter session set sql_trace=false;
    #> tkprof orcl_ora_2364_statement_trace.trc run1.txt sys=no ## recursive SQL 문장 제외하라는 옵션(sys=no)
    SQL > create index cust_city_idx on customers(cust_city); -- index 생성 후 재실행해서 확인
  4. STATSPACK 생성 방법
    SQL > @%ORACLE_HOME%\rdbms\admin\spcreate
    perfstat_password의 값을 입력하십시오: pertstat
    pertstat


    Choose the Default tablespace for the PERFSTAT user
    ---------------------------------------------------
    Below is the list of online tablespaces in this database which can
    store user data. Specifying the SYSTEM tablespace for the user's
    default tablespace will result in the installation FAILING, as
    using SYSTEM for performance data is not supported.

    Choose the PERFSTAT users's default tablespace. This is the tablespac
    in which the STATSPACK tables and indexes will be created.

    TABLESPACE_NAME CONTENTS STATSPACK DEFAULT TABLESPACE
    ------------------------------ --------- ----------------------------
    EXAMPLE PERMANENT
    SYSAUX PERMANENT *
    USERS PERMANENT

    Pressing <return> will result in STATSPACK's recommended default
    tablespace (identified by *) being used.

    default_tablespace의 값을 입력하십시오: USERS

    Using tablespace USERS as PERFSTAT default tablespace.


    Choose the Temporary tablespace for the PERFSTAT user
    -----------------------------------------------------
    Below is the list of online tablespaces in this database which can
    store temporary data (e.g. for sort workareas). Specifying the SYSTEM
    tablespace for the user's temporary tablespace will result in the
    installation FAILING, as using SYSTEM for workareas is not supported.

    Choose the PERFSTAT user's Temporary tablespace.

    TABLESPACE_NAME CONTENTS DB DEFAULT TEMP TABLESPACE
    ------------------------------ --------- --------------------------
    TEMP TEMPORARY *

    Pressing <return> will result in the database's default Temporary
    tablespace (identified by *) being used.

    temporary_tablespace의 값을 입력하십시오: temp
    SQL > show user
    SQL > exec statspack.snap; -- 스냅샷 찍음.

  5. SQL Access Advisor TEST
    SQL > exec dbms_stats.gather_table_stats('sh','sales_test');
    SQL> select * from sales_test where cust_id = 100866;
    SQL> select * from sales_test1 where cust_id=100866;
    SQL> select c.cust_id, s.channel_id, sum(s.amount_sold)
    from customers c, sales s
    where c.cust_id = s.cust_id
    group by c.cust_id, s.channel_id
  6. Materialized View
    - JOIN하는 테이블들에 Mview 생성이 되면 summary 된 하나의 테이블 형식으로 조회가 되며, 사용자가 기존의 쿼리를 사용하여
    조회를 하더라도 Mview가 자동으로 자체 쿼리를 생성하여 응답속도를 빠르게 조회한다.
  7. leaf block 공간 낭비 확인
    SQL> select lf_rows_len, del_lf_rows_len, (del_lf_rows_len/lf_rows_len)*100 "Delete %" from index_stats
    SQL> update cust_test set cust_id=cust_id + 20000000
    where rownum <= 2000; -- 업데이트 후 확인작업
    SQL> analyze index cust_id_idx validate structure; -- 통계 정보 갱신 후 블럭 확인
    SQL> select lf_rows_len, del_lf_rows_len, (del_lf_rows_len/lf_rows_len)*100 "Delete %" from index_stats
    LF_ROWS_LEN DEL_LF_ROWS_LEN Delete %
    ----------- --------------- ----------
    911322 29881 3.27886301 <== %가 20% 이상이면 공간 활용도가 낮음으로 rebuild 필요함.

    1 개의 행이 선택되었습니다.
    SQL> alter index cust_id_idx rebuild;

  8. Unused Index 모니터링
    SQL> select 'alter index '||index_name||' monitoring usage;' from user_indexes;
    SQL> select table_name, index_name, monitoring, used from v$object_usage

    SQL> exec dbms_stats.gather_schema_stats('hr'); -- 통계정보 갱신 후 확인하게 되면 index가 사용된 걸로 확인된다.(안좋음ㅡㅡ;)

6/3일 SQL 튜닝 교육

  1. function based index
    SQL> create index func_first_name_idx on cust_test(upper(cust_first_name));
    SQL> select index_name, index_type, status from user_indexes
    where table_name = 'CUST_TEST';
    SQL> select index_name, column_name, column_position
    from user_ind_columns
    where table_name = 'CUST_TEST'
    order by 1, 3;
    SQL> select index_name, column_expression
    from user_ind_expressions
    where table_name = 'CUST_TEST';
  2. HINT
    - /*+ */ <== 힌트 포맷, 여러개의 힌트 사용시 한 포맷안에서 띄어쓰기로 작성.
  3. TRACE
    SQL> set autot traceonly explain
    SQL> select /*+ index(sales_test prod_time_idx) */ *
    from sales_test
    where prod_id=13
    and time_id between to_date('19980510', 'yyyymmdd')
    and to_date('19980522','yyyymmdd');
  4. Meterialized view
    SQL> create materialized view cust_sales_mv
    enable query rewrite
    as
    select c.cust_id, s.channel_id, sum(s.amount_sold)
    from customers c, sales s
    where c.cust_id = s.cust_id
    group by c.cust_id, s.channel_id;
    SQL> create materialized view cust_sales_mv1
    enable query rewrite
    as
    select c.cust_id, s.channel_id, sum(s.amount_sold)
    from customers c, sales s
    where c.cust_id = s.cust_id
    group by c.cust_id, s.channel_id;
    SQL> set autot traceonly explain
    SQL> alter materialized view cust_sales_mv disable query rewrite;
  5. Using DBMS_MVIEW Package
    declare
    task_nm varchar2(20) := 'emp_tune';
    begin
    dbms_advisor.tune_mview(task_name=>task_nm,
    mv_create_stmt=>'create materialized view emp_mv
    as
    select department_id, avg(salary)
    from employees
    group by department_id');
    end;
    /
  6. FLASHBACK
    - 9i 에서는 DML 에 대해 flashback query
    - 10g Database :

    . table --> Drop
    --> Table
    --> Version
    --> Transaction
    #### flashback transaction
    SQL> select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') from dual;
    SQL> delete from dept where deptno=40;
    SQL> select * from dept as of timestamp
    to_timestamp('2011/06/03 15:46:07', 'yyyy/mm/dd hh24:mi:ss') -- 과거 특정 시간대로 돌아갈 경우
    where deptno=40 -- 과거 시간대 40번 부서가 있었는지 확인
    SQL> select * from dept as of timestamp
    systimestamp - interval '10' minute
    -- 과거 시간대로 돌아갈 경우
    where deptno=40 -- 과거 시간대 40번 부서가 있었는지 확인
    SQL> select * from dept as of timestamp
    sysdate - 10/1440
    -- 과거 시간대로 돌아갈 경우(10분/60분 환산 * 24)
    where deptno=40 -- 과거 시간대 40번 부서가 있었는지 확인
    SQL> show parameter undo
    undo_retention integer 900 -- 복구 가능한 최대 시간(900초)
    undo 공간이 부족할 경우 해당 과거 시간까지의 데이터를 보장 못함(젠장)
    SQL> show recyclebin -- 휴지통에서 확인(drop된 테이블 확인할 수 있음)
    ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    EMP_FLASH BIN$s/Vv2p9dSemiALQ05QJWuw==$0 TABLE 2011-06-03:16:09:14
    EMP_FLASH BIN$ahDZ8KZxQ2+26wiG+vjimA==$0 TABLE 2011-06-03:16:07:48
    EMP_FLASH BIN$aS6Q/kqETYa2NLqb7m+LHA==$0 TABLE 2011-06-03:16:06:36
    SQL> select * from "BIN$ahDZ8KZxQ2+26wiG+vjimA==$0"
    #### flashback drop
    SQL> flashback table emp_flash to before drop; -- drop 테이블 복원
    플래시백이 완료되었습니다.
    SQL> flashback table "BIN$aS6Q/kqETYa2NLqb7m+LHA==$0" to before drop; -- 특정 테이블 복구시
    플래시백이 완료되었습니다.
    SQL> flashback table "BIN$ahDZ8KZxQ2+26wiG+vjimA==$0" to before drop rename to emp_new; -- 테이블 이름을 변경 하여 복구도 가능
    플래시백이 완료되었습니다.
    #### flashback table
    16:24:37 SQL> insert into dept values(50,'New','CA');

    1 개의 행이 만들어졌습니다.

    16:25:07 SQL> commit;

    커밋이 완료되었습니다.

    16:25:36 SQL> update dept set loc = 'Test1' where deptno=10;

    1 행이 갱신되었습니다.

    16:25:51 SQL> commit;

    커밋이 완료되었습니다.

    16:25:54 SQL> select * from dept;

    DEPTNO DNAME LOC
    ---------- -------------- -------------
    50 New CA
    10 ACCOUNTING Test1
    20 RESEARCH DALLAS
    30 SALES CHICAGO
    16:27:59 SQL> alter table dept enable row movement; -- 테이블의 row 이동 가능 활성화
    16:28:07 SQL> flashback table dept to timestamp to_timestamp('2011/06/03 16:24:37', 'yyyy/mm/dd hh24:mi:ss'); -- 테이블 자체 rollback
    플래시백이 완료되었습니다.

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함