오라클 서버 접속

오라클계정

  • 관리자용 : sys, system
  • 일반용(연습용) : scott, HR (dbca 과정에서 sample schema 체크/ 안했으면 수동으로 설치해야함)


  • 서버접속

  • 리눅스 : $ sqlplus scott/tiger (프로그램명 계정/암호)
  • db 종료 되어있어 접속안되면 관리자 계정으로 접속해 db를 시작해줘야함
  • ERROR:

    ORA-01034: ORACLE not available
    ORA-27101: shared memory realm does not exist
    Linux Error: 2: No such file or directory
    Process ID: 0
    Session ID: 0 Serial number: 0

    • Enter user-name: sys/oracle as sysdba
    • SQL>startup
    • SQL> CONN scott/tiger

  • 오라클을 처음 설치할 경우에는 보안 문제로 연습용 계정인 scott 계정을 사용 못하도록 막아두기 때문에 아래와 같은 에러가 발생할경우 관리자계정으로 접속해 계정을 풀어줘야함

  • ERROR:

    ORA-28000: the account is locked

    • Enter user-name: sys/oracle as sysdba
    • SYS> ALTER USER scott IDENTIFED BY tiger ACCOUNT UNLOCK;

  • 계정 확인: SQL>show user
  • 프롬프트를 현재 접속해 있는 계정이름으로 변경: SQL> SET sqlprompt "_USER>"



  • 데이터 가져오기

    SELECT

  • SELECT [컬럼명 or 표현식] FROM [테이블명 or 뷰(view) 명
    • SQL>SELECT * FROM emp; 모든 컬럼조회
  • DESC : 특정 테이블에 어떤 칼럼들이 있는지 조회(describe)
    • SQL> DESC dept ;
  • 모든 테이블 조회: SELECT * FROM TAB;


  • Column 변경

  • Column 길이 조정
    • 숫자 데이터: SQL> COL 컬럼명 FOR 9999 (자리수만큼 9할당)
    • 문자 데이터: SQL>COL 컬럼명 FOR a15 (자리수만큼 숫자할당)
  • 화면 길이 조정
    • 한 화면에 출력가능한 가로길이: SQL>SET LINE 200
    • 한 화면에 출력가능한 세로길이: SQL>SET PAGES 50
  • 표현식(Expression) = 리터럴 상수
    • 컬럼명 이외에 원하는 내용으로 출력할수 있음.
    • SELECT 구문 컬럼명 뒤에 '원하는내용'로 묶어서 사용
    • '를 출력하려면 ''사용
  • 기본 산술 연산자: +, -, *, / 사용해 출력가능 (우선순위 주의)
  • 별칭(column alias) 사용: 일시적으로 출력
    • 컬럼명 "별칭" // 별칭에 공백이나 특수문자, 대소문자 구분이 필요할 경우 쌍따옴표 필수
    • 컬럼명 AS "별칭"
    • 컬럼명 별칭 // 쌍따옴표 하지 않을경우는 모두대문자로 출력
  • 연결(합성) 연산자(Concatenation): - || 서로 다른 컬럼을 하나의 컬럼처럼 연결해서 출력 *백업/복구 작업이나 데이터베이스 운영 관련 작업, 튜닝 작업등에 아주 많이 사용됨.
  • SQL>SELECT ename||'''s job is '||job " NAME AND JOB"
     2  FROM emp;
    
     NAME AND JOB
    -----------------------------
    SMITH's job is CLERK
    ALLEN's job is SALESMAN
    WARD's job is SALESMAN
    


    DISTINCT

  • 중복된 값 제거하고 출력
  • 1개의 칼럼에만 적어도 모든 칼럼에 적용해 시간이 많이소요 (성능저하 발생) ​* 10g R1 까지는 정렬이용 R2부터는 hash 알고리즘 이용(성능개선)
  • 반드시SELECT 다음에 와야 하며 그렇지 않을 경우 에러발생.(ORA-00936)
  • SQL>SELECT DISTINCT job, ename
     2  FROM emp
     3  ORDER BY 1,2;
    
    JOB       ENAME
    --------- ----------
    ANALYST   FORD
    ANALYST   SCOTT
    CLERK     JAMES
    CLERK     SMITH
    
    


    WHERE

  • SELECT [컬럼 or 표현식] FROM [table or view] WHERE 조건
  • 문자 & 날짜 조회 시 ' ' 사용해야함 (숫자이외에 모두 홑따옴표 사용)
    • 문자의 경우 대소문자 구분 (날짜는 구분안함)
    • 날짜의 경우 윈도우와 리눅스 날짜 형식 다름 * 윈도우) yy/mm/dd, 리눅스) dd-MON-yy
  • 연산자 활용가능
    • = 같은 조건 검색
    • !=, <> 같지 않은 조건 검색
    • > (<) 큰(작은) 조건 검색
    • >= (<=) 크(작)거나 같은 조건 검색 숫자,문자,날짜 모두 비교가능(날짜의경우 최신날짜 일수록 값이큼)
    • BETWEEN a AND b a와 b사이에 있는 범위값 검색 ( a, b값 모두 포함/ 한글은 b포함 안됨) * 속도면에서 위의 비교연산자가 더 빠름
    • IN(a,b,c) a거나 b거나 c인 조건 검색 (속도빠름)
    • LIKE 특정 패턴 있는 조건 검색, 아래의 두 기호와 함께쓰임. 홑따옴표필수
        1. % : 글자수 제한X(0포함)
          _ : 한글자 %나 _를 먼저 쓰면 SQL성능최악임(Index때문). 주의할것.
    • IS NILL / IS NOT NULL Null 값/아닌값 검색 =연산 사용못함
    • A AND B A,B 모두 만족하는 값 검색 (우선수위: 괄호, AND > OR)
    • A OR B A,B 중 하나라도 만족하는 값 검색
    • NOT A A가 아닌 모든 조건 검색
  • 사용자에게 조건 입력받고 그 조건에 맞는 값 출력: & WHERE절 이외에 입력을 받아야 할곳에 모두 쓰일수있음


  • ORDER BY

  • 오름차순ASC(default), 내림차순DESC 컬럼명 뒤에 명시
  • SQL 문장에서 가장 마지막에 사용
  • 컬럼명대신 SELECT절에 오는 칼럼의 순서를 숫자로 사용 가능
  • 많이 쓸수록 성능저하되므로 최대한 쓰지않는게 좋음. INDEX 사용 권장.


  • SET OPERATOR (집합 연산자)

  • UNION 합집합, 중복 값 제거, 정렬
  • UNION ALL 합집합, 중복 값 제거X, 정렬X
  • INTERSECT 교집합, (정렬동반(12c기준) 데이터 많으면 속도저하)
  • MINUS 차집합, 정렬(쿼리순서 중요)
    • 두 집합의 SELECT 절에 오는 칼럼의개수와 데이터형이 동일해야함.
    • UNION & UNION ALL 많이 연결할수록 성능 저하되므로 DECODE, CASE 등 다른 방법 사용해 작성할것.


    기타

  • SQL>ed // vi 로 수정
  • SQL>/ // 마지막에 실행했던 sql 실행
  • SQL>SET verify OFF //설명부분 해제




  • [출처] 다양한 예제로 쉽게 배우는 오라클 SQL과 PL/SQL 서진수 저




    코스목록

    1 The Data Scientist`s Toolbox

    2 R Programming

    3 Getting and Cleaning Data

    4 Exploratory Data Analysis

    5 Reproducible Research

    6 Statistical Inference

    7 Regression Models

    8 Practical Machine Learning

    9 Developing Data Products

    10 Data Science Capstone


    강의목록


    1 클라우드 컴퓨팅 배경지식: 분산컴퓨팅개념

    2 클라우드 컴퓨팅 배경

    3 클라우드 유형과 서비스 형태

    4 Amazon, Google, MS PaaS 비교 현황

    5 가상화 기술 소개1

    6 가상화 기술 소개2

    7 가상화 기술 비교 및 Xen 실습

    8 MS Hyper-V 활용 실습 및 VMWare 활용 실습

    9 보안 기술 개론

    10 클라우드 보안 위협과 보안 기술

    11 클라우드 침입탐지 시스템 소개

    12 하둡파일 시스템 소개

    13 하둡파일 시스템 실습

    14 Map/Reduce 소개

    15 클라우드를 위한 VDI 기술 소개

    16 클라우드 네트워크 기술





    오라클 서버의 전체 구조


    (1) 메모리와 디스크

    ● INSTANCE (작업)

    메모리 부분에 생성되는 구조

    실제 작업하는 장소

    오라클은 메모리를 나눠서 관리


     

    SGA(System Global Area)

    실제 작업장소(공유메모리)

    모든 조회나 대부분의 작업이 이루어짐


    -​ Background Process

    오라클 서버가 잘 운영되도록 해주는 역할

     



    ● DATABASE (저장)

    - 데이터가 저장되는 데이터 파일

    - DB 전체의 관리정보가 들어있는 컨트롤 파일

    ​- 장애 복구 시 사용되는 Redo 로그파일





      






    (2) Instant 할당 및 관리



    ● Instance 생성과정

    1. startup 요청을 받은 최초의 Oracle Server process가 초기화 파라미터(pfile 또는 spfile)에 적혀있는 설정을 참고해 OS kernel에게 공유메모리를 사용할 수 있도록 할당해 달라고 요청

    2. 요청받은 kernel은 자신의 OS kernel 파라미터를 조회해 그 파일들에 설정되어 있는 내역으로 공유메모리(SGA)할당

    3. 세마포어 설정 값 등을 기반으로 커널이 관리를 시작

    (Server process가 종료되어도 SGA는 종료되지 않고, Instance가 종료되야 SGA가 공유메모리에서 사라짐)




    ● Kernel

    - 모든 하드웨어를 관장 (RAM을 사용해 작업하려면 kernel에게 허락받아야 함)
    - RAM 하나를 여러 프로그램이 공유해서 사용하므로 스케줄링 잘못하면 같은 메모리를 덮어쓸 수 있음 →블루스크린, kernel panic 초래

    - 커널이 메모리 관리를 잘 해야 성능이 좋아짐
    - 오라클이 요청한대로 메모리를 할당해 주는것이 아니라 커널의 설정파일에 적혀있는대로 할당(​만약, 서버의 총 RAM이 1G인데, 오라클이 2G를 요구할 수도 있기 때문)

    ○ linux 커널값 적는 파일    /etc/sysctl.conf

    ○ solaris 커널값 적는 파일   /etc/system

    ​  

    >> 예로, 오라클이 1G를 요청해도 /etc/sysctl.conf 파일에 500MB만 허락하도록 적혀있다면 그만큼만 할당해줌

    >> 물리적으로 RAM을 추가해도(10G→30G) 설정파일의 값을 바꾸지 않는다면 프로그램이 사용하는 메모리는 변화 없음



    ● 공유메모리 관리

    - 모든 Server process들이 동시에 함께 RAM(공유메모리)을 사용하기 때문에, 하나의 메모리 블록을 여러 프로그램이 동시에 중복 사용하는 사태를 막기 위해 OS차원에서 제공하는 세마포어와 몇가지 Kernel 파라미터들이 존재함

    ​   

    세마포어(Semaphore) : 깃발(flag)이란 의미로 어떤 자원의 현재 사용 여부를 표현 set unset, ​셋트로 여러개씩 사용함

    1. 사용할 메모리블록의 세마포어 상태를 먼저 확인함

    2. 만약, 사용중(set)으로 설정돼있으면 Process는 대기하고 있다가 블록이 release되어 unset이 되는 순간에 세마포어를 set으로 설정함 -> 메모리블록 사용가능


    Kernel 파라미터 : 유닉스계열 OS별로권장 수치는 다를수 있음

     SEMMSL

    시스템 내에서 여러개의 process들이 세마포어를 동시에 사용하기 때문에 세마포어 사용량이 많음 그래서 세마포어는 하나씩 사용하지 않고 여러개를 묶어서 세트로 사용함


    >정의: 하나의 세마포어 세트당 세마포어의 최대개수

    >권장: 초기화 파라미터 파일의 PROCESSES 변수의 최대값 + 10

    >기본값: 100이상


    oracle 11g 버전의 PROCESSES 기본값은 150개로 설정되어 있음

     SEMMNI

    >정의 : 리눅스 전체에서 설정 가능한 세마포어 세트의 최대 개수

    >권장 : 100이상

    SEMMNS

    >정의 : 리눅스 전체에서 사용 가능한 세마포어의 최대 개수

    >이론값 : SEMMSL X SEMMNI ≤ SEMMNS

     SEMOPM

    하나의 시스템 호출을 통해 여러개의 세마포어를 지원할 수 있으며 한 개의 세마포어 셋에서 가질 수 있는 세마포어의 최대값은 SEMMSL 파라미터를 통해 정의됨


    >정의 : 1call(1개의 시스템호출)이 초당 호출 가능한 최대 세마포어 개수 

    >권장: SEMOPM = SEMMSL

    >>  위의4가지 모두 세마포어와 관련된 파라미터로 시스템에 어떻게 설정되어 있는지 확인하려면 ipcs -ls 명령어를 사용하면 됨

     SHMMAX

     커널이 응용프로그램에게 메모리를 할당해 줄때 작게 여러번 할당X,  큰덩어리(segment)로 한번에 

    >정의: 공유 메모리 세그먼트의 최대크기(byte)

    >디폴트값: 32MB


    ex)​ 오라클이 RAM을 100MB 쓸 수 있는데 shmmax를 20MB로 설정할 경우 100MB의 메모리를 5개의 세그먼트로 나눠서 사용해야함(10명이 5개 테이블에 2명씩 따로따로 앉음) -> 성능이 좋지않음

    그렇다고 무조건 크게 설정해도 문제(10인용 테이블에 1,2명이 앉을수 있음) -> 메모리 낭비


    kernel.shmmax값을 아주 작게 주고 DB에 접속을 시도하면 서버에 접속이 되지 않거나

    ORA-27123: unable to attach to shared memory segment 라는 메시지가 발생 할 수 있음


    >> 설정값 확인 : # cat /proc/sys/kernel/shmmax  (디폴트값은 너무작아 보통 2G로 설정)

    >> 변경방법

     /proc 파일시스템에 변경사항을 직접 반영시켜 Server의 재부팅 없이 변경하는 방법

    # echo "2147483648" > /proc/sys/kernel/shmmax

    ②  sysctl 명령어를 사용해 변경

    sysctl -w kernel.shmmax=2147483648

     /etc/sysctl.conf 파일에 커널변수 값들을 추가해 변경 사항을 영구적으로 적용(vi editor로)

    sysctl -p 명령어를 수행하면 재부팅 없이 즉시적용가능

     SHMMNI

    >정의: 공유메모리 세그먼트의 최대개수 (시스템전체에서 사용가능한)

    >디폴트값: 4096 (충분)

     SHMALL

    >정의: 특정 시정에 시스템에서 사용 가능한 공유 메모리의 최대크기(page단위)

    >디폴트값: 2097152 bytes

    >권장값: 최소 ceil(SHMMAX/PAGE_SIZE) 값보다 큰 값

    SHMMIN

    >정의: 단일 공유메모리 세그먼트의 최소크기(byte) 

     SHMSEG

    >정의: 공유메모리 세그먼트의 최대개수 (1개의 Process가 사용할 수 있는)


     

    ● 커널이 위의 파라미터들을 기초로 해서 Oracle에 공유메모리를 할당하는 3가지 방법


    1. 물리적 메모리 충분할 경우 : 하나의 세그먼트에 전체 SGA 할당
    2. 하나의 세그먼트에 할당 할수 없는 경우 : 연속된 여러 세그먼트로 분산시켜 할당
    3. 연속으로 할당 할수 없는 경우: 불연속적인 여러 세그먼트에 분산시켜 할당

        

    ( Fixed Area 부분은 반드시 전체가 1개의 세그먼트에 할당 되어야 함 )






    (3) SGA 주요 구성요소


    Oracle Server process가 SGA를 생성하기 위해 커널에게 공유메모리를 할당 받아온다. 그 후 파라미터 파일과 각종 사항을 참고해서 SGA를 이루고 있는 구성 요소들을 생성함.

    - 필수 구성요소 : DB Buffer Cache, Redo Log Buffer, Shared Pool 




    Database Buffer Cache

    - 데이터의 조회와 변경 등의 실제 작업이 일어나는 공간

    - 사용자가 조회하거나 변경하려는 모든 데이터는 이 곳에 있어야 하고, 없을경우 HDD의 데이터 파일에서 해당 내용이 들어있는 Block을 복사해서 가져옴 (그렇게 하기위해서는 Buffer Cache의 Block 상태를 먼저 확인해야함)

    - 여러명의 사용자가 이 곳을 공유해서 사용하므로 하나의 메모리 Block을 여러 사용자가 동시에 I/O 하는 것을 방지하기 위해 오라클은 Buffer Cache Block의 상태를 확일할 수 있는 LRU(Least Recently Used) List를 통해 관리하고 있음


    블록 상태

     의미

     commit (여부) 

     Pinned Buffer

     다른 사용자가 현재 사용하고 있는 Buffer

     변경중

     Dirty Buffer

     현재 진행중인 작업은 없지만 다른 사용자가 내용변경 후 저장 안한 Buffer

     변경완료/저장(x)

     Free Buffer

     사용되지 않았던지 or Dirty Buffer 였다가 데이터 파일로 저장완료되어 재사용가능한 Buffer

     변경완료/저장(o)



    - LRU 알고리즘 : 공유메모리의 공간은 용량이 제한적이므로 SGA의 일부분을 덮어 써야 하는 경우가 생길 수 있는데, 이때 무작정 덮어 쓰는 것이 아니라 가장 최근까지 사용된 것은 지키고 가장 사용이 안된 것은 버리는(덮어쓰는) 알고리즘.


    - 오라클은 LRU List 스캔의 효율성을 위해 LRU List와 LRUW List로 나누어 관리하고 있음

    (Working Data Set 혹은 Working Set = LRU List + LRUW List)


    Working Data Set

     LRU List

    LRUW List 

     메인 리스트

     사용된 buffer들의 list (Hot/Cold 영역으로 나뉨)

     변경된 buffer들의 list (Dirty list)

     보조 리스트

     미사용된 buffer들이나 DBWR에 의해 기록된 Buffer들 (Free list)

     현재 DBWR에 의해 기록중인 buffer들의 list



    - 사용자가 데이터파일의 데이터를 DB Buffer Cache로 복사해와야 할 경우에 복사하기전 우선 먼저 LRU 보조 리스트에서 free buffer를 찾아서 확보해야함. 만약 보조 리스트의 free buffer가 모두 사용된 경우, LRU 메인 리스트 Cold 영역에서 free buffer를 다시 찾음

    - 특정개수(10g 기준 40%)만큼 찾았는데 못찾으면 scan 멈추고 DBWR[각주:1]한테 dirty buffer 내려쓰라고 요청함

    - 변경내용을 저장안한 dirty buffer는 DBWR에 의해 데이터파일로 저장이 완료되어 free buffer로 바뀌게 되고 LRU list의 보조리스트에 추가됨.

    - 이제 사용자는 free buffer를 확보한 후 데이터 파일에서 필요한 블록을 DB Buffer Cache로 복사해 올 수 있게됨.

    (HDD의 데이터파일에서 필요한 블록을 찾아 Buffer Cache로 복사해 오는 작업은 Server process가 함) 


    * Instance 최초 구동시 모든 buffer들은 LRU List의 보조리스트에서 관리됨


    - 위에서 살펴본 List들은 모든 사용자가 공유해서 사용하기 때문에 한번에 여러 Server process들이 동시에 이 List를 사용하려고 시도할 수 있음. 그래서 오라클은 일반적으로 대용량인 DB Buffer Cache를 빠르게 관리하기 위해 여러 구역으로 나누고 관리하는 WorkingSet을 여러개 생성해 여러 사용자가 동시에 free buffer를 찾을수 있도록 함.

    - 유한한 자원을 여러 process가 한꺼번에 사용하려고 할 경우 사용 순서를 관리하기 위해 Latch[각주:2]를 사용




    ● Redo Log Buffer

    - 데이터에 변경사항이 생길경우(DDL이나 DML 실행될 경우) 해당 변경 내용을 기록하는 메모리공간(장애 발생시 복구하기위해)

    - Redo Log File이 Redo Log Buffer의 내용을 디스크로 저장함.

    - 모든 변경사항이 전부 이곳에 기록되는것은 아님.

    ex) Direct Load(SQL Loader, insert /*+APPEND*/)나 table이나 index 생성시 nologging 옵션을 주는경우에는 Redo Log에 기록되지 않음. (단, nologging 옵션으로 생성된 table이라도 일반적인 insert, update, delete 같은 작업은 모두 기록됨)




    ● Shared Pool

    - 다른 사용자와 어떤 대상을 공유해서 사용하기 위한 공간

    - Shared_Pool_Size 파라미터(동적파라미터라서 DB를 종료하지 않아도 alter system set으로 사이즈변경가능)로 전체크기 설정가능.

    - Library Cache나, Dictionary Cache 크기는 각각 따로 관리 할 수 없음


     Library Cache

     Soft Parse할 때 사용되는 공간.

     이미 수행됐던 SQL, PL/SQL 문장의 parse code와 해당 SQL, PL/SQL 문장, 실행계획등이 저장돼있음.

     LRU 알고리즘으로 관리.

     Dictionary Cache

     구문분석이나 Optimizer가 실행계획을 세울 때 사용되는 주요 Dictionary들이 row단위로 저장돼있음.

     LRU 알고리즘으로 관리.

     Server Result Cache

     결과값을 Cache해 두는 공간. (11g에서 새로생김)

     동일한 Select가 수행됐을 경우 DB Buffer Cache까지 안가고 즉시 이곳에서 가져오도록 해 속도를 높임.

     default : 사용안함 / 사용하려면 SQL문장에 /*+ result_cache */ 힌트사용해서 수동으로 설정해야함.

     매번 힌트 쓰기 번거로우면 alter system set RESULT_CACHE_MODE=Force; 로 변경하여 사용.

     Reserved Pool

     Shared Pool에 5KB(11g기준)가 넘는 오브젝트가 적재돼야 할 경우 사용하기 위해서 예약해둔 공간.

     기본설정: Instance가 시작될때 Shared_Pool_Size 크기의 5%.

     SHARED_POOL_RESERVED_SIZE 파라미터로 용량설정.




    ● Large Pool

    - 필수 구성 요소 X, 특정 기능 사용할 경우에만 사용

    - shared server mode로 오라클 서버를 운영할 경우 UGA를 이곳에 생성함

    - 병렬처리 작업을 할 경우 각 프로세스들간의 메세지 buffer를 이곳에 생성

    - RMAN으로 백업이나 복구할 경우 RMAN이 사용하는 I/O용 buffer가 이곳에 생성됨



    ● Java Pool

    - java 관련 code나 Java Virtual Machine(JVM) 관련 데이터를 저장하기 위해 생성되는 선택적인 공간



    ● Streams Pool

    - 10g 이상 버전부터 생긴 SGA 구성요소로 Streams 기능을 사용할 경우에만 사용됨.



    ● Fixed SGA

    - 오라클이 내부적으로 사용하기 위해 생성시키는 공간

    - 주로 백그라운드 프로세스들이 필요한 데이터베이스의 전반적인 공유 정보나 각 프로세스들끼리 공유해야만 하는 Lock 정보 같은 내용들이 저장됨.

    - 이 공간의 크기는 오라클이 시작될 때 자동으로 설정되며 사용자나 관리자가 임의로 변경X



     

     


    (4) Dynamic SGA 기능(9i~)


    - 관리자가 필요에 의해 SGA의 구성요소의 크기를 변경한 후 오라클 인스턴스의 재시작 없이 즉시 적용할 수 있는 기능

    (단, Redo Log Buffer를 포함한 몇가지는 제외)

    - 8i 버전까지는 SGA의 각 구성요소 크기를 변경하고 나서 오라클 인스턴스를 중단했다가 재시작해야만 변경사항이 적용되는 Static SGA 방식이었음.

    - 오라클에서 동적으로 메모리를 할당할 때 사용하는 단위: 그래뉼(Granule)

    - 10g 이후 버전기준 SGA_MAX_SIZE가 1GB 이하면 1Granule이 4MB, 1GB 초과면 1Granule이 16MB가 됨




    ● 관련 파라미터 


    SGA_MAX_SIZE

    SHARED_POOL_SIZE

    DB_CACHE_SIZE



     




    (5) Program Global Area(PGA) 주요 구성 요소


    - 각 프로세스들이 개별적으로 사용하는 메모리 공간

    - 모든 서버 프로세스들은 각각의 PGA를 가짐

    - 주로 정렬관련 작업등이 이루어짐





    ● Private SQL Area

    - Persistent Area와 Runtime Area로 나뉨

    - 사용자가 SQL 문장을 수행하면 User Process가 Server Process에게 해당 쿼리를 전달해 주는데 이때 Server Process가 자신에게 작업을 요청한 User Process의 정보를 Session Memory부분에 저장을 한 후 해당 SQL을 Parse함

    - 해당 SQL에 Bind 변수 등이 있을경우 해당 Bind변수값을 Persistent Area에 저장함

    - 쿼리의 실행 상태정보와 쿼리를 수행하면서 임시로 정보를 저장해야 하는 경우 Runtime Area에 저장함




    ● SQL Work Area

    - Sort 관련 작업(Sort Area)이나 Hash 관련 작업을 수행하는 공간

    - 9i부터 PGA크기를 Oracle Server가 자동으로 관리할 수 있음

    - 관련 파라미터

     

     PGA_AGGREGATE_TARGET= PGA 총량 지정

     WORKAREA_SIZE_POLICY=AUTO (동적관리), MANUAL (수동관리)

     


    * 1개의 개별 Server Process가 쓸 수 있는 PGA 메모리량

     

     _SMM_MAX_SIZE

     



    - 현재 서버의 PGA관련값 조회

     

     SYS> SELECT * FROM v$pgastat;

     










    참고

    - 오라클 관리 실무 (서진수. 생능출판사. 2013)

    - 사진출처:https://docs.oracle.com/database/121/CNCPT/intro.htm#CNCPT-GUID-2B1BADE1-C36F-4555-9867-3B15B6CE858C




    각주


    1. DB Buffer Cache에 있는 변경 완료된 데이터(dirty buffer)를 데이터 파일로 저장해 주는 백그라운드 프로세스. [본문으로]
    2. 마치 은행의 번호표처럼 순서를 정해주는 역할, 모든 메모리 자원에는 각 Latch가 별도로 존재함. [본문으로]



    RAC_ASM설치 ( OEL5 + ORACLE 11g )






    6. DB생성




    - 재부팅하고 oracle계정으로 로그인후 dbca 시작


    [oracle@rac1 ~]$ dbca






















     

















     





    - DB생성 확인



    [oracle@rac1 database]crs_stat -t






     











    RAC_ASM설치 ( OEL5 + ORACLE 11g )







    4. 11g Engine 설치



    grid 설치 완료후 재부팅하고 oracle계정으로 로그인. 





     engine 설치 시작 



    [oracle@rac1 ~]$ cd database

    [oracle@rac1 database]$ ./runInstaller

     



























     



    - node1,2에서 각각 스크립트 실행



    [oracle@rac1 ~]$ su -

    [oracle@rac1 ~]# /app/oracle/11g/db/root.sh


     


    - Engine설치완료






    5. ASM 구성



    - ASM configuration assistant 실행


    [oracle@rac1 ~]$ asmca

      






     









     










            -  상태확인




    [oracle@rac1 database]$ crs_tat -t







     


     




    RAC_ASM설치 ( OEL5 + ORACLE 11g )






    3. grid 설치



     grid 설치 시작 


    [oracle@rac1 ~]$ cd grid

    [oracle@rac1 grid]$ ./runInstaller

     











































     


    - node1,2에서 각각 패키지 설치  

     


    [oracle@rac1 ~]$ su -

    [oracle@rac1 ~]# cd /media/Oracle\ Linux\ Server\ dvd\ 20110119/Server/

    [oracle@rac1 Server]# rpm -ivh libaio-devel-0.3.106-5.i386.rpm

    경고: libaio-devel-0.3.106-5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

    준비 중...               ########################################### [100%]

       1:libaio-devel           ########################################### [100%]

     

    [root@rac1 Server]#





              - 다시 확인 





    - 모두 무시 체크 


     












     





    - 스크립트 실행 (순서 잘지켜야함)



    [root@rac1 Server]# /app/oraInventory/orainstRoot.sh

    ..완료

    [root@rac2 Server]# /app/oraInventory/orainstRoot.sh

    ..완료


    [root@rac1 Server]# /app/11g/grid/root.sh
    .....succeeded.
    [root@rac2 Server]# /app/11g/grid/root.sh
    .....succeeded.




     

     grid 설치완료


       ( 당황하지않고 확인)






    - 상태확인




    [oracle@rac1 grid]$ crs_stat -t








    - GSD(global service daemon) 가동 



    [oracle@rac1 grid]srvctl enable nodeapps -g

    [oracle@rac1 grid]srvctl start nodeapps

    [oracle@rac1 grid]$  ocr check






     



    - crs_stat 확인



    [oracle@rac1 grid]crs_stat -t


     



      











    RAC_ASM설치 ( OEL5 + ORACLE 11g )






    1. VMware 설정 및 리눅스 설치



      VMware (rac1) 설정  



    - virtual machine name: rac1






    - RAM: 1500MB






    - HDD: 30GB






    - Disk file name: rac1.vmdk







    - 불필요한 하드웨어 삭제 : Edit virtual machine settings -> Floppy, USB controller, Sound card, Printer 삭제






    - Add Hard ware type : Network Adapter 추가






    - Network Adaptor type: Host-only






    Add Hard ware type : HDD추가






    - virtual disk type: SCSI

    - Mode: Independent - persistent






    -disk size/ Allocate all disk space now / single file






    - Disk file name







    Advanced setting


    - Virtual device node :SCSI 1:0

    - Mode: Independent - persistent




     










               - 이렇게 각각 총 6개 HDD 추가.



                          ocr_vote01 1G SCSI 1:0


                   ocr_vote02 1G SCSI 1:1


                   ocr_vote03 1G SCSI 1:2


                   asm01         5G SCSI 1:3


                   asm02         5G SCSI 1:4


                   asm03         5G SCSI 1:5






    - rac1 폴더의 rac1.vmx 파일 메모장으로 열고 내용 추가.



    disk.locking = "FALSE"

    diskLib.dataCacheMaxSize = "0"

    scsi1.sharedBus = "virtual"


    scsi1:0.deviceType = "disk"

    scsi1:1.deviceType = "disk"

    scsi1:2.deviceType = "disk"

    scsi1:3.deviceType = "disk"

    scsi1:4.deviceType = "disk"

    scsi1:5.deviceType = "disk"







      OEL5 설치  













    - Partition (/sda만)

    /            7000

    /boot      100

    /var       1000

    swap     3000

    /home   8000

    /app     나머지





















    - Network devices : eth0, eth1 모두 Active
    - Hostname : rac1








    - 패키지 설치 : 사용자정의  ( 개발도구 모두 선택, 서버 모두 체크해제, 시스템툴 선택)



     






     - 시스템도구 -> 오른쪽 하단에 optional pakage선택



    ocfs2-2.6.18-238.el5-1.4.6.-2.el5.i686

    ocfs2-tools-1.6.3-2.el5.i386
    ocfs2-console-1.6.3-2.el5.i386
    oracleasm-2.6.18-238.el5-2.0.5.1.el5.i686
    oracleasm-support-2.1.4-1.el5.i386
    sysstat-7.0.2-3.el5_5.1.i386

     






     







    2. node 설정 



     node_1 (rac1) 설정 




    - 주소확인


    ifconfig :   ip, netmask 주소확인

    eth0 ip - 172.16.133.131

    eth1 ip - 172.16.23.130

    netmask - 255.255.255.0


    netstat -nr :  gateway 172.16.133.2






    - 주소바꾸기

    rac1                rac2


    eth0 (NAT) = public     172.16.133.100     172.16.133.200

    eth1 (host) = private    172.16.23.111       172.16.23.222

    eth0 (NAT) = vip          172.16.133.10       172.16.133.20


    gw             172.16.133.2  (eth1은 gw설정 안함)

    dns            168.126.63.1

















    - vi /etc/hosts 내용추가



    [root@rac1 ~]# vi /etc/hosts


    # public

    172.16.133.100        rac1

    172.16.133.200        rac2

    # private

    172.16.23.111         rac1-priv

    172.16.23.222         rac2-priv

    # vip

    172.16.133.10         rac1-vip

    172.16.133.20         rac2-vip

    172.16.133.30         rac-scan





    리눅스 부팅 후 불필요한 서비스 OFF 

      


    [root@rac1 ~]# chkconfig --level 123456 xinetd off

    [root@rac1 ~]# chkconfig --level 123456 sendmail off

    [root@rac1 ~]# chkconfig --level 123456 cups off

    [root@rac1 ~]# chkconfig --level 123456 cups-config-daemon off

    [root@rac1 ~]# chkconfig --level 123456 smartd off

    [root@rac1 ~]# chkconfig --level 123456 isdn off

    [root@rac1 ~]# chkconfig --level 123456 iptables off





    - 계정생성


    [root@rac1 ~]# groupadd -g 5000 dba

    [root@rac1 ~]# groupadd -g 5001 oinstall

    [root@rac1 ~]# useradd -g oinstall -G dba oracle

    [root@rac1 ~]#

    [root@rac1 ~]# passwd oracle





    -  winscp로 설치파일옮기고,  설치파일 압축해제 및 권한변경



    [oracle@rac1 ~]# cd /home/oracle

    [root@rac1 oracle]#  unzip p10098816_112020_LINUX_1of7.zip && unzip p10098816_112020_LINUX_2of7.zip && unzip p10098816_112020_LINUX_3of7.zip


    [root@rac1 oracle]# chown -R oracle.oinstall /home/oracle





    vi /etc/sysctl.conf 내용 추가



    [oracle@rac1 ~]# vi /etc/sysctl.conf


    kernel.shmmni = 4096

    kernel.sem = 250 32000 100 128

    net.ipv4.ip_local_port_range = 9000 65500

    net.core.wmem_max = 1048576

    net.core.rmem_default = 4194304

    net.core.rmem_max = 4194304

    net.core.wmem_default = 262144

    fs.file-max = 6815744

    fs.aio-max-nr = 1048576




     


     vi /etc/security/limits.conf 내용 추가



    [oracle@rac1 ~]# vi /etc/security/limits.conf


    grid soft nproc 2047

    grid hard nproc 16384

    grid soft nofile 1024

    grid hard nofile 65536

    oracle soft nproc 2047

    oracle hard nproc 16384

    oracle soft nofile 1024

    oracle hard nofile 65536






     vi /etc/pam.d/login 내용 추가



    [oracle@rac1 ~]# vi /etc/pam.d/login


    session     required     pam_limits.so





     vi /etc/modprobe.conf 내용 추가



    [oracle@rac1 ~]# vi /etc/modprobe.conf


    options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180






      modprobe



    [root@rac1 ~]# modprobe -v hangcheck-timer

    insmod /lib/modules/2.6.18-238.el5/kernel/drivers/char/hangcheck-timer.ko hangcheck_tick=30 hangcheck_margin=180





     vi /etc/rc.local 내용추가 



    [oracle@rac1 ~]# vi /etc/rc.local


    /sbin/modprobe hangcheck-timer

    rdate -s 203.248.240.140






     vi /etc/sysconfig/ntpd  (options= -x 추가 )



    [oracle@rac1 ~]# vi /etc/sysconfig/ntpd


    -x








     ntpd 재시작



    [root@rac1 ~]# service ntpd restart

    ntpd를 종료중:                                               [ 실패 ]

    ntpd: 시간서버와 동기화함:                            [  OK  ]

    ntpd (을)를 시작 중:                                       [  OK  ]


    [root@rac1 ~]# chkconfig --level 123456 ntpd on

    [root@rac1 ~]#

    [root@rac1 ~]# chown -R oracle.oinstall /app

    [root@rac1 ~]# chmod -R 755 /app




     vi .bash_profile (root) 내용추가



    [root@rac1 ~]# vi .bash_profile


    export GRID_HOME=/app/11g/grid

    export PATH=$PATH:$HOME/bin:$GRID_HOME/bin





     vi /home/oracle/.bash_profile 내용추가



    [root@rac1 ~]# vi /home/oracle/.bash_profile


    export EDITOR=vi

    export TMP=/tmp

    export TMPDIR=$TMP

    export ORACLE_HOSTNAME=rac1

    export ORACLE_UNQNAME=racdb

    export ORACLE_BASE=/app/oracle

    export ORACLE_HOME=$ORACLE_BASE/11g/db

    export GRID_HOME=/app/11g/grid

    export ORACLE_SID=racdb1

    export ORACLE_TERM=xterm

    export PATH=/usr/sbin:$PATH

    export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

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

    export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib






     파티션 분할 (sdb,sdc,sdd,sdf,sdg)



    [root@rac1 ~]# fdisk /dev/sdb


    Command (m for help): n

    Command action

       e   extended

       p   primary partition (1-4)

    p

    Partition number (1-4): 1

    First cylinder (1-130, default 1):

    Using default value 1

    Last cylinder or +size or +sizeM or +sizeK (1-130, default 130):

    Using default value 130


    Command (m for help): w

    The partition table has been altered!


    Calling ioctl() to re-read partition table.

    Syncing disks.

    [root@rac1 ~]#





     ASM환경설정 



    [root@rac1 ~]# oracleasm configure -I

    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


    The next two configuration options take substrings to match device names.

    The substring "sd" (without the quotes), for example, matches "sda", "sdb",

    etc.  You may enter more than one substring pattern, separated by spaces.

    The special string "none" (again, without the quotes) will clear the value.


    Device order to scan for ASM disks []:

    Devices to exclude from scanning []:

    Writing Oracle ASM library driver configuration: done


    [root@rac1 ~]#





     마운트 포인트 생성



    [root@rac1 ~]# oracleasm init

    Creating /dev/oracleasm mount point: /dev/oracleasm

    Loading module "oracleasm": oracleasm

    Mounting ASMlib driver filesystem: /dev/oracleasm




      공유디스크 생성 (/dev/oracleasm 밑에 생성됨)



    [root@rac1 ~]# oracleasm createdisk ocr_vote01 /dev/sdb1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]# oracleasm createdisk ocr_vote02 /dev/sdc1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]# oracleasm createdisk ocr_vote03 /dev/sdd1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]# oracleasm createdisk asm01 /dev/sde1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]# oracleasm createdisk asm02 /dev/sdf1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]# oracleasm createdisk asm03 /dev/sdg1

    Writing disk header: done

    Instantiating disk: done

    [root@rac1 ~]#




      생성 리스트 확인하고 시스템 종료



    [root@rac1 ~]# oracleasm scandisks

    Reloading disk partitions: done

    Cleaning any stale ASM disks...

    Scanning system for ASM disks...

    [root@rac1 ~]# oracleasm listdisks

    ASM01

    ASM02

    ASM03

    OCR_VOTE01

    OCR_VOTE02

    OCR_VOTE03

    [root@rac1 ~]# chown -R oracle.oinstall /dev/oracleasm

    [root@rac1 ~]#

    [root@rac1 ~]# init 0






     node_2 설정 



    - rac1 폴더의 vmdk, vmx 파일을 rac2 폴더로 복사한후 rac2로 이름변경



     



    - rac2.vmx파일 메모장으로 열고 rac1을 rac2로 모두 수정





     

    - VMware에서 rac2.vmx 불러온후 i copied it.






      주소바꾸기 : 앞에 node1에서 지정했던 주소로 바꿔줌 (#neateth0,2.bak은 비활성화후 삭제


    rac1                rac2


    eth0 (NAT) = public     172.16.133.100     172.16.133.200

    eth1 (host) = private    172.16.23.111       172.16.23.222

    eth0 (NAT) = vip          172.16.133.10       172.16.133.20


    gw             172.16.133.2 (eth1은 gw설정 안함)

    dns            168.12

















     vi /home/oracle/.bash_profile (rac1 -> rac2 로 수정) 



    [root@rac2 ~]# vi /home/oracle/.bash_profile


    export EDITOR=vi

    export TMP=/tmp

    export TMPDIR=$TMP

    export ORACLE_HOSTNAME=rac2

    export ORACLE_UNQNAME=racdb

    export ORACLE_BASE=/app/oracle

    export ORACLE_HOME=$ORACLE_BASE/11g/db

    export GRID_HOME=/app/11g/grid

    export ORACLE_SID=racdb2

    export ORACLE_TERM=xterm

    export PATH=/usr/sbin:$PATH

    export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

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

    export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib





     node1에서 rpm설치후 node2에도 rpm파일전송하고 설치



    [root@rac1 ~]# cd /home/oracle/grid/

    [root@rac1 grid]# cd rpm/

    [root@rac1 rpm]#

    [root@rac1 rpm]# export CVUQDISK_GRP=dba

    [root@rac1 rpm]# rpm -ivh cvuqdisk-1.0.9-1.rpm

               준비중:             ########################################### [100%]

       1:cvuqdisk               ########################################### [100%]

    [root@rac1 rpm]# scp cvuqdisk-1.0.9-1.rpm rac2:~/

    The authenticity of host 'rac2 (172.16.133.200)' can't be established.

    RSA key fingerprint is 18:e2:c7:0b:4e:bd:7e:98:7b:7a:f8:b1:7e:2a:11:e2.

    Are you sure you want to continue connecting (yes/no)? yes

    Warning: Permanently added 'rac2,172.16.133.200' (RSA) to the list of known hosts.

    root@rac2's password:

    cvuqdisk-1.0.9-1.rpm                          100% 8233     8.0KB/s   00:00



    [root@rac2 ~]# export CVUQDISK_GRP=dba

    [root@rac2 ~]# rpm -ivh cvuqdisk-1.0.9-1.rpm

           준비중‘...               ########################################### [100%]

       1:cvuqdisk               ########################################### [100%]

    [root@rac2 ~]#