728x90

공식문서

MOS 사이트 주소(Oracle과 계약된 계정 필요) : https://support.oracle.com/ 

Understanding Automatic Diagnostic Repository (Doc ID 422893.1)

 

 

기능 및 내용 설명

11g New Features RDBMS 진단을 위한 파일 기반 저장소
ADR HOME 내부에 아래 그림처럼 여러 디렉터리를 소유

 

실제 디렉터리 구성 정보

 

ADR BASE의 DEFAULT 경로 : $ORACLE_BASE

SQL>set linesize 200
SQL>set pagesize 200
SQL>col name format a23
SQL>col value format a57

SQL>show parameter diagnostic_dest
SQL>select * from v$diag_info;

 

디렉터리 별 설명

alert XML 포맷의 alert 로그가 저장
cdump 이전 버전의 core_dump_dest 에 해당하는 core_dump가 저장
hm Health Monitor가 여러 컴포넌트를 검사한 후 일부 파일을 저장
incident incident 별로 서로 다른 디렉터리에 저장
Incpkg incident 를 패키징할 때 특정 지원 파일들이 저장
Metadata alert, incident, pakage 등에 대한 metadata 저장
trace 사용자 trace 및 background trace가 alert 로그의 텍스트 버전과 함께 저장

 

Problem - Database의 Critical 에러 (예 : ORA-00600, ORA-07445, ORA-04031 등)
Incident - 각 사건 숫자 ID 를 내포하고 있는 문제의 단일 occurance.
( Problem 1 회 발생을 의미하며 ORA-00600 에러가 3 번 발생할 경우 ORA-0600 Problem 이 3 번의
Incident가 기록

 

ADRCI를 이용한 자동 로그 정리

ADR에 접속하여 관리하는 유틸리티, 쉘을 작성하여 ADRCI를 이용한 자동 로그 정리 예시

예시에서는 LISTENER와 RDBMS의 로그를 삭제, 원하는 항목을 추가하여 수행

[oracle@ol7 orcl]$ vi adrci.sh

#!/bin/bash
# Usage: PURGE [[-i  |  ] |
# [-age  [-type ALERT|INCIDENT|TRACE|CDUMP|HM|UTSCDMP]]]:
#
# Purpose: Purge the diagnostic data in the current ADR home. If no
# option is specified, the default purging policy will be used.
#
# Options:
# [-i id1 | id1 id2]: Users can input a single incident ID, or a
# range of incidents to purge.
#
# [-age ]: Users can specify the purging policy either to all
# the diagnostic data or the specified type. The data older than 
# ago will be purged
#
# [-type ALERT|INCIDENT|TRACE|CDUMP|HM|UTSCDMP]: Users can specify what type of
# data to be purged.
#
# Examples:
# purge
# purge -i 123 456
# purge -age 60 -type incident
# LISTENER (

for i in `adrci exec="show homes"|grep listener`;do
echo "adrci exec=\"set home $i;\""
adrci exec="set home $i;purge -age 1800";
done
# ADR HOME
ADR_HOME=`adrci exec="show home " | grep rdbms`
# HOME Check
# echo $ADR_HOME
adrci exec="set home $ADR_HOME;purge -age 4320 -type ALERT"
adrci exec="set home $ADR_HOME;purge -age 1080 -type TRACE

 

참고

[oracle@ol7 orcl]$ adrci

ADRCI: Release 12.2.0.1.0 - Production on Fri Apr 8 17:45:42 2022

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/app/oracle"
adrci> show homepath
ADR Homes:
diag/rdbms/orcl/orcl
adrci> show homes
ADR Homes:
diag/rdbms/orcl/orcl
adrci> set home diag/rdbms/orcl/orcl
adrci> show control
ADR Home = /app/oracle/diag/rdbms/orcl/orcl:
*************************************************************************
ADRID                SHORTP_POLICY        LONGP_POLICY         LAST_MOD_TIME                            LAST_AUTOPRG_TIME                        LAST_MANUPRG_TIME                        ADRDIR_VERSION       ADRSCHM_VERSION      ADRSCHMV_SUMMARY     ADRALERT_VERSION     CREATE_TIME
-------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ----------------------------------------
1335663986           720                  8760                 2021-12-14 10:54:11.032204 +09:00        2022-04-08 10:43:27.718338 +09:00                                                 1                    2                    107                  1                    2021-12-14 10:54:11.032204 +09:00
1 row fetched

 

<grid adrci>
ADRCI(Automatic Diagnostic Repository Command Interpreter) 유틸리티는 Oracle Database 진단 데이터를 관리하는 데 사용하는 명령줄 도구입니다.

ADR_BASE= ORACLE_BASE
파라미터 조회 : show parameter diagnostic_dest 로 확인
11g부터 Background_dump_dest 및 'user_dump_dest'는 무시, 이후 모든 trace 파일이 trace 디렉토리에 저장

select * from v$diag_info;

1. oracle 계정에서 ardci입력
2. 관련 명령어
adrci>show homes    --홈경로 확인(adrci 명령어 사용 전)
adrci>show problem  --문제 확인
adrci>show incident   --
adrci>show alert       -- alert log 확인(db alert 1, listener 6 등)

 

 

 

 

# SHORTP_POLICY : trace file, core dump file .etc
# LONGP_POLICY : incident file, health monitor waring file .etc

 

 

<단위 : 시간>
adrci> set control (SHORTP_POLICY = 48) 
adrci> set control (LONGP_POLICY = 48)


# diag 디렉토리 하위 디렉터리 내의 파일 정리(경고로그 등의 *.log 파일은 정리 대상에서 제외)


디스크가 많은것 하루치 로그만 남기고 모두 삭제(60*24=1440 하루, 아래는 10일치)
adrci>purge -age 14400 -type INCIDENT   => 심각한 오류에 관련된 덤프 파일
adrci>purge -age 14400 -type ALERT        => xml 포맷의 alert log
adrci>purge -age 14400 -type TRACE       => 사용자 trace 파일 및 Alert.log
adrci>purge -age 14400 -type CDUMP      => core dump
adrci>purge -age 14400 -type HM           => Health Monitor

 

728x90

필수사항

1. OS 에서 oracle 계정으로 접속(Oracle DBMS가 설치된 OS 계정)

  ex) su - oracle

 

2. SYS 계정으로 접속                           

  ex) sqlplus / as sysdba

 

 

AWR

1. AWR 보관 주기 확인

SQL>set lines 200 pages 200
SQL>col SNAP_INTERVAL for a25
SQL>col RETENTION for a25
SQL>SELECT DBID, SNAP_INTERVAL, RETENTION FROM DBA_HIST_WR_CONTROL;    << 보관 주기 확인(아래 내용은 1시간 마다 수집, 8일 간 보관)

 

[결과(예시)]

 

             DBID  SNAP_INTERVAL      RETENTION

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

1607515869   +00000 01:00:00.0   +00008 00:00:00.0

 

 

 

2. AWR 수집 주기 변경(30분) / AWR 보관 주기 변경 (30일)

SQL>EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(RETENTION=>60*24*30, INTERVAL=>30); 
 --  RETENTION : AWR 보관 주기  /  INTERVAL : AWR 수집 주기
 
 -- 설정 최소 범위는 RETENTION=>60*24*8 : 8일(691200초) / INTERVAL=>10 : 10분(10 ~ 52560000분 사이)

SQL>SELECT DBID, SNAP_INTERVAL, RETENTION FROM DBA_HIST_WR_CONTROL;                       << 보관 주기 확인

 

[결과(예시)]

 

             DBID  SNAP_INTERVAL      RETENTION

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

1607515869    +00000 00:30:00.0   +00030 00:00:00.0

 

 

 

3. AWR 저장 내용 확인

SQL>set lines 200 pages 200
SQL>SELECT  SNAP_ID, 
                         DBID, 
           INSTANCE_NUMBER, 
                         TO_CHAR(BEGIN_INTERVAL_TIME, 'YYYY/MM/DD HH24:MI') BEGIN_TIME, 
                 TO_CHAR(END_INTERVAL_TIME, 'YYYY/MM/DD HH24:MI') END_TIME 
             FROM  DBA_HIST_SNAPSHOT
          ORDER BY  DBID, INSTANCE_NUMBER, SNAP_ID; 

 

[결과(예시)]

 

   SNAP_ID       DBID           INSTANCE_NUMBER  BEGIN_TIME          END_TIME

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

        12            1607515869                                 1   2022/02/08 19:00    2022/02/08 20:00

        13            1607515869                                 1   2022/02/08 20:00    2022/02/08 21:00

        14            1607515869                                 1   2022/02/08 21:00    2022/02/08 22:00

 

 

 

4.AWR이 저장되는 Tablespace 확인/추가

AWR 저장되는 Tablespace : sysaux

10g에서 새로 추가된 system default tablespace의 하나로 AWR(auto workload repository) 데이터들이 저장되는 Tablespace

 

AWR Tablespace 확인(SYSAUX)

SQL>set lines 200 pages 200
SQL>col FILE_NAME format a50
SQL>SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 "MB" FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='SYSAUX';
         

 

[결과(예시)]

 

TABLESPACE_NAME   FILE_NAME                                                         MB

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

SYSAUX                       /app/oracle/oradata/orcl/sysaux01.dbf                  540

 
 

 

AWR AWR Tablespace 공간 확인(SYSAUX)


SQL>col TABLESPACE format a10
SQL>SELECT   SUBSTR(A.TABLESPACE_NAME,1,30) TABLESPACE,
                          ROUND(SUM(A.TOTAL1)/1024/1024, 1) "TOTALMB",
                          ROUND(SUM(A.SUM1)/1024/1024, 1) "FREEMB",
                          ROUND((ROUND(SUM(A.TOTAL1)/1024/1024, 1)-ROUND(SUM(A.SUM1)/1024/1024, 1))/ROUND(SUM(A.TOTAL1)/1024/1024,1)*100,2) "USAGE%"
               FROM  ( SELECT   TABLESPACE_NAME,
                                               0 TOTAL1,
                                               SUM(BYTES) SUM1,
                                               MAX(BYTES) MAXB,
                                               COUNT(BYTES) CNT
                                FROM     DBA_FREE_SPACE
                               GROUP BY TABLESPACE_NAME
                                UNION
                                SELECT   TABLESPACE_NAME,
                                                 SUM(BYTES) TOTAL1,
                                                 0,
                                                 0,
                                                 0
                                   FROM     DBA_DATA_FILES
                                 GROUP BY TABLESPACE_NAME
                             ) A
WHERE A.TABLESPACE_NAME='SYSAUX'
GROUP BY A.TABLESPACE_NAME
ORDER BY TABLESPACE;            


[결과(예시)]

 

TABLESPACE    TOTALMB     FREEMB     USAGE%

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

SYSAUX                    1040           523.5          49.66

 
 

 

SYSAUX 테이블 스페이스 용량 증설 및 확인
      SQL>ALTER TABLESPACE <TABLESPACE_NAME> ADD DATAFILE '<파일경로 + 파일명>' SIZE <지정 크기>                                     << 작성 예시
SQL>
ALTER TABLESPACE SYSAUX ADD DATAFILE '/app/oracle/oradata/orcl/sysaux02.dbf' SIZE 500M;
SQL>SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 "MB" FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='SYSAUX';

 

[결과(예시)]

 

TABLESPACE_NAME   FILE_NAME                                                         MB

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

SYSAUX                       /app/oracle/oradata/orcl/sysaux01.dbf                  540

SYSAUX                       /app/oracle/oradata/orcl/sysaux02.dbf                  500

728x90

준비물

Oracle Linux7.9 설치 : https://peryh.tistory.com/66?category=871552

다운로드 설치 파일 : https://peryh.tistory.com/68?category=871557

 

 

설치 방법

1. OS 유저 생성(공통)
2. 디스크 추가 및 공유 디스크 설정(공통)
3. 라이브러리 설치(공통)
4. 미사용 서비스 및 hugepage, MTU 설정(공통)
5. 파라미터 및 유저 리소스 설정(공통)
6. 환경변수 설정, 권한 설정
7. 그리드 엔진 설치(1번기)
8. Diskgroup 생성(1번기)
9. 오라클 엔진 설치(1번기)
10. 오라클 DB 생성(1번기)

 

1. OS 유저 생성(공통)

OS 그룹 및 유저 생성 (https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ladbi/creating-operating-system-privileges-groups.html#GUID-164A7218-166D-4B58-9A86-88149E8FCB83)

두 개 이상의 Oracle 소프트웨어 제품이 서버에 설치된 경우 계획된 설치의 일부로 Oracle Inventory 그룹을 수동으로 생성합니다.
기본적으로 oraInventory 그룹이 없는 경우 설치 프로그램은 설치 중인 Oracle 소프트웨어에 대한 설치 소유자의 기본 그룹을 oraInventory 그룹으로 사용합니다. 이 그룹이 계획된 모든 Oracle 소프트웨어 설치 소유자에 대한 기본 그룹으로 사용 가능한지 확인하십시오.
파일이 없으면 oraInst.loc다음과 유사한 명령을 입력하여 Oracle Inventory 그룹을 생성합니다.

ASM용 OSDBA 그룹 생성
설치하는 동안 그룹 을 ASM용 OSDBA( asmdba) 그룹으로 지정해야 합니다. 이 그룹의 구성원에게는 Oracle Automatic Storage Management에 대한 액세스 권한이 부여됩니다.

ASM용 OSOPER 그룹 생성 설치 중에
그룹을 ASM용 OSOPER 그룹( )으로 지정하도록 선택할 수 있습니다 . asmoper이 그룹의 구성원에게는 Oracle Automatic Storage Management에 대한 시작 및 종료 권한이 부여됩니다.

데이터베이스 설치를 위한 OSDBA 그룹 생성
각 Oracle 데이터베이스에는 OSDBA 그룹으로 지정된 운영 체제 그룹이 필요합니다. 이 그룹의 구성원에게는 데이터베이스를 관리할 수 있는 SYSDBA 시스템 권한이 부여됩니다.

데이터베이스 설치를 위한 OSOPER 그룹
생성 제한된 데이터베이스 관리 권한(SYSOPER 운영자 권한)으로 운영 체제 사용자 그룹을 식별하려는 경우에만 OSOPER 그룹을 생성하십시오.
대부분의 설치에서는 OSDBA 그룹만 만드는 것으로 충분합니다. 단, OSOPER 그룹을 사용하기 위해서는 다음과 같은 상황에서 생성해야 합니다.
OSOPER 그룹이 존재하지 않는 경우, 예를 들어 시스템에 Oracle Database 소프트웨어를 처음 설치하는 경우
OSOPER 그룹이 존재하지만 새로운 Oracle 설치에서 다른 운영 체제 사용자 그룹에 데이터베이스 운영자 권한을 부여하려는 경우

데이터베이스 설치를 위한 OSBACKUPDBA 그룹 만들기 설치하는 동안 그룹을 OSBACKUPDBA 그룹으로 지정해야 합니다. 이 그룹의 구성원에게는 RMAN 또는 SQL*Plus를 사용하여 백업 및 복구 작업을 수행할 수 있는 SYSBACKUP 권한이 부여됩니다.

데이터베이스 설치를 위한 OSDGDBA 그룹 생성 설치하는 동안 그룹을 OSDGDBA 그룹으로 지정해야 합니다. 이 그룹의 구성원에게는 Data Guard 작업을 수행할 수 있는 SYSDG 권한이 부여됩니다.

데이터베이스 설치를 위한 OSKMDBA 그룹 만들기 설치하는 동안 그룹을 OSKMDBA 그룹으로 지정해야 합니다. 이 그룹의 구성원에게는 투명 데이터 암호화 키 저장소 작업을 수행할 수 있는 SYSKM 권한이 부여됩니다.

데이터베이스 설치를 위한 OSRACDBA 그룹 생성 데이터베이스를 설치하는 동안 그룹을 OSRACDBA 그룹으로 지정해야 합니다. 이 그룹의 구성원에게는 Oracle RAC 클러스터에서 Oracle 데이터베이스의 일상적인 관리를 수행할 수 있는 SYSRAC 권한이 부여됩니다.

#필요 시 선택하여 생성, 최소 사항으로 dba만 있어도 설치에 문제는 없음
/usr/sbin/groupadd -g 54321 oinstall
/usr/sbin/groupadd -g 54327 asmdba
/usr/sbin/groupadd -g 54328 asmoper
/usr/sbin/groupadd -g 54322 dba
/usr/sbin/groupadd -g 54323 oper
/usr/sbin/groupadd -g 54324 backupdba
/usr/sbin/groupadd -g 54325 dgdba
/usr/sbin/groupadd -g 54326 kmdba
/usr/sbin/groupadd -g 54330 racdba

/usr/sbin/useradd -u 54321 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba oracle
/usr/sbin/useradd -u 54331 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba grid

passwd grid
grid

passwd oracle
oracle

 

2. 디스크 추가 및 공유 디스크 설정(공통)

그리드 및 오라클 엔진 설치 디스크 추가

서버 목록 ->  정보 -> 상단의 새로 만들기 -> 저장소 -> 맨 우측 그림 클릭

 

VDI 선택

 

동적 할당 선택

 

그리드 및 오라클 엔진 설치할 디스크 생성(grid : 30G / oracle : 30G)

 

선택 클릭하여 디스크 추가하기

 

공유 디스크 생성

서버 목록 ->  정보 -> 상단의 새로 만들기 -> 저장소 -> 맨 우측 그림 클릭

 

VDI 선택

 

동적 할당 선택

 

ASM 디스크 생성(MGMT 영역 : 40G(필수) / OCR : 15G / DATA :  30G / RECO 15G

시간이 상당히 소요됨(약 10분)

 

디스크 추가 완료된 모습, 선택 눌러서 종료

 

등록된 디스크 제거

 

파일 -> 가상 미디어 관리자 선택

 

상단의 속성 선택 및 종류 변경 후 적용

 

1번기 정보 -> 설정

 

저장소 -> 디스크 추가 선택

 

공유 디스크 선택

 

디스크 정보 확인

 

2번기 정보 -> 설정

 

저장소 -> 디스크 추가 선택

 

공유 디스크 선택

 

디스크 추가 및 내용 확인

 

OS 부팅 및 디스크 확인

 

엔진 설치 디스크 포맷 및 마운트 설정

디스크 확인(엔진 설치 디스크는 작성자 서버 기준/dev/sdb)

fdisk -l /dev/sdb
n -> p -> enter -> enter -> +30G -> p 

 

파티션 추가 생성

n -> p -> enter -> enter -> enter -> p ->w

 

파티션 포맷

mkfs.ext4 /dev/sdb1 -> enter
mkfs.ext4 /dev/sdb2 -> enter

 

마운트 설정 및 확인

cd /
mkdir /grid
mkdir /oracle
mount /dev/sdb1 /grid
mount /dev/sdb2 /oracle
df -h

 

오토마운트 설정 방법

디스크의 uuid 확인 및 uuid 복사

blkid

 

오토 마운트 등록 파일을 열고 아래처럼 내용 작성

vi /etc/fstab

UUID=4a1f9ed8-8837-432d-9a1a-14f5b64c3cd3 /grid                   ext4    defaults        0 0
UUID=75eb2227-4dd1-4c67-a115-97cc94abd07f /oracle                 ext4    defaults        0 0

 

저장 후 재기동 후 확인

wq
reboot
df -h

 

재기동 시 에러 발생한다면, 오토 마운트 정보 입력 에러 시 정상 부팅이 안 됨

해결책은 https://peryh.tistory.com/69

 

 

공유 디스크 구성, 파티션 및 파일시스템 지정(공유 디스크는 작성자 서버 기준 /dev/sdc)

fdisk /dev/sdc
 
n -> p -> 1 -> enter -> enter -> t -> 8e(LVM) -> p -> w

 

논리적 스토리지 생성

pvs/vgs 생성 논리적 개념은(https://tech.cloud.nongshim.co.kr/2018/11/23/lvmlogical-volume-manager-1-%EA%B0%9C%EB%85%90/)참조

pvcreate /dev/sdc1
vgcreate asm /dev/sdc1
pvs 

 

lvs 생성

lvcreate -n ocr01 -L 5G asm
lvcreate -n ocr02 -L 5G asm
lvcreate -n ocr03 -L 5G asm
lvcreate -n mgmt01 -L 20G asm
lvcreate -n mgmt02 -L 20G asm
lvcreate -n data01 -L 10G asm
lvcreate -n data02 -L 10G asm
lvcreate -n data03 -L 10G asm
lvcreate -n reco01 -L 5G asm
lvcreate -n reco02 -L 5G asm
#lvcreate -n reco03 -L 5G asm   => 공간부족으로 생성 불가
lvcreate -n reco03 -L 4G asm

 

생성된 디스크 확인

lvs
lsblk

 

2번기 확인, 1번기에서 설정한 디스크 정보가 없음

lvs
lsblk

 

디스크 내용에 대한 정보가 없기 때문, OS 커널이 인식하는 파티션 정보와 일치하지 않기 때문에 /dev 디렉토리 밑에 디바이스 파일이 생성되지 않음, reboot 하지 않고 파티션을 인식 시키는 명령으로 수행(해당 디바이스가 umount 상태에서만 가능)

단, 파일시스템에 대한 자동 동기화솔루션이나 다른 도움이 필요

만약, 1번기에서 file을 생성 후 partprobe로 동기화 후에 2번기에서 ls 해도 해당 파일은 보이지 않음(remount 해야 보임)

partprobe

 

디스크 권한 및 소유자 변경을 위한 확인(1번, 2번기 둘 다 수행)

ls -la /dev/asm/*

 

udev 설정, 내용 참조 : (https://lascrea.tistory.com/89)

vi /etc/udev/rules.d/60-raw.rules

KERNEL=="dm-0",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-1",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-2",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-3",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-4",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-5",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-6",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-7",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-8",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-9",OWNER="grid",GROUP="dba",MODE="0660"
KERNEL=="dm-10",OWNER="grid",GROUP="dba",MODE="0660"

 

권한 적용, 권한 변경된 디스크 확인

udevadm control --reload-rules
udevadm trigger --action=add
ls -l /dev/dm*

 

grid 유저를 생성하지 않고서는 적용해도 해당 내용이 변경되지 않음(그래서 처음 생성하고 시작함)

 

유저 생성 후 시도 시 정상 변경

 

 

3. 라이브러리 설치(공통)

오라클 DB 설치를 위한 필요 라이브러리

yum install -y bc
yum install -y binutils
yum install -y compat-libcap1
yum install -y compat-libstdc++-33
yum install -y elfutils-libelf
yum install -y elfutils-libelf-devel
yum install -y fontconfig-devel
yum install -y glibc
yum install -y glibc-devel
yum install -y ksh
yum install -y libaio
yum install -y libaio-devel
yum install -y libX11
yum install -y libXau
yum install -y libXi
yum install -y libXtst
yum install -y libXrender
yum install -y libXrender-devel
yum install -y libgcc
yum install -y libstdc++
yum install -y libstdc++-devel
yum install -y libxcb
yum install -y make
yum install -y net-tools
yum install -y nfs-utils
yum install -y python
yum install -y python-configshell
yum install -y python-rtslib
yum install -y python-six
yum install -y targetcli
yum install -y smartmontools
yum install -y sysstat
yum install -y unzip

 

xterm을 통한 X-window를 위한 패키지 설치, 아래 패키지가 설치 되면 X-window로 서버 다이렉트 접속이 아니라

putty를 연결한 host에서 GUI 설치 가능(단, 접속 프로그램이 mobaxterm 처럼 해당 windows를 지원해야 함)

yum -y install xorg*

 

미 설치 시 아래와 같은 에러 발생

 

 

설치 시 아래처럼 설치 창 나옴

 

 

4. 미사용 서비스 및 hugepage, MTU 설정(공통)

서비스 확인

systemctl list-unit-files | egrep "firewalld.service|chronyd.service|ntpdate.service|avahi-daemon.service"

 

DNS 중지

systemctl stop avahi-daemon.socket
systemctl stop avahi-daemon
systemctl disable avahi-daemon
systemctl status avahi-daemon

 

시간 동기화 중지

systemctl stop chronyd
systemctl disable chronyd
mv /etc/chrony.conf /etc/chrony.conf.bak
systemctl status chronyd

 

방화벽 중지

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

 

NTP 중지

systemctl stop ntpdate
systemctl disable ntpdate
systemctl status ntpdate

 

transparent hugepages 비활성화 설정(https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ladbi/disabling-transparent-hugepages.html#GUID-02E9147D-D565-4AF8-B12A-8E6E9F74BEEA)

활/비활성 여부 확인(always는 활성 상태)

cat /sys/kernel/mm/transparent_hugepage/enabled

 

설정 변경(위 사진이 전, 아래 사진이 후)

vi /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet transparent_hugepage=never"

 

변경 사항 적용

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.org
grub2-mkconfig -o /boot/grub2/grub.cfg

 

재부팅 후 변경사항 확인(Anonymous HugePages의크기가 0이면 적용 완료, 위 사진이 전, 아래 사진이 후)

cat /sys/kernel/mm/transparent_hugepage/enabled
grep Huge /proc/meminfo
reboot

cat /sys/kernel/mm/transparent_hugepage/enabled
grep Huge /proc/meminfo

 

Private MTU 사이즈 변경, Private MTU 사이즈는 9000 권고

1번, 2번 서버의 MTU 사이즈는 무조건 같게 설정, MTU size가 다를 경우 2번 노드에서 root.sh 돌리는 도중 실패함

내 인터페이스 확인(외부 : 192.168.88.X / 내부 : 192.168.11.X)

ifconfig

 

내부망 인터페이스 확인 및 설정

ip link show enp0s8
ip link set enp0s8 mtu 9000
ip link show enp0s8

 

 

5. 파라미터 및 유저 리소스 설정(공통)

메모리 확인

cat /proc/meminfo | grep MemTotal

 

페이지 확인

getconf PAGESIZE

 

커널 파라미터 설정(https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ladbi/changing-kernel-parameter-values.html#GUID-FB0CC366-61C9-4AA2-9BE7-233EB6810A31)

kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 2549152         # MemTotal (KB) * 1024 / 4096    page 단위 (Doc ID 301830.1)
kernel.shmmax = 5220663296      # MemTotal (KB) * 1024 / 2       bytes 단위(Doc ID 567506.1)
kernel.panic_on_oops = 1

net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2

fs.file-max = 6815744
fs.aio-max-nr = 1048576

net.ipv4.ip_local_port_range = 9000 65500

 

커널 파라미터 적용

sysctl -p

 

유저 리소스 제한

grid    soft   nproc     2047
grid    hard   nproc    16384
grid    soft   nofile     1024
grid    hard   nofile    65536
grid    soft   stack     10240
grid    hard   stack    32768

oracle   soft    nofile      1024
oracle   hard   nofile       65536
oracle   soft    nproc      16384
oracle   hard   nproc      16384
oracle   soft    stack       10240
oracle   hard   stack       32768
oracle   soft    memlock   9176947   # MemTotal의 약 90% (KB)
oracle   hard   memlock   9176947    # MemTotal의 약 90% (KB)

 

/etc/hosts 파일 변경 전 장치 확인

hostname
ifconfig

 

해당 정보를 /etc/hosts 내부에 기입

### Public
192.168.88.79   ol79rac1
192.168.88.80   ol79rac2

### Private
192.168.11.79   ol79rac1-priv
192.168.11.80   ol79rac2-priv

### Virtual
192.168.88.81   ol79rac1-vip
192.168.88.82   ol79rac2-vip

### SCAN
192.168.88.83   ol79rac-scan

 

6. 환경변수 설정, 권한 설정

grid 유저 프로파일 설정

su - grid
vi ~/.bash_profile

# Grid Environment:
export ORACLE_BASE=/grid/app/base
export GRID_HOME=/grid/app/12c/grid
export ORACLE_HOME=$GRID_HOME
export ORACLE_SID=+ASM1                # 2번 노드는 +ASM2
export BASE_PATH=/usr/sbin
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$GRID_HOME/bin:$BASE_PATH:$HOME/.local/bin:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
 
export PS1=`whoami`@`hostname`\['$ORACLE_SID'\]':$PWD$ '

 

oracle 유저 프로파일 설정 및 적용

# Oracle Environment:
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12c/dbhome_1
export ORACLE_PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch
export ORACLE_SID=RAC1                                         # 2번 노드는 RAC2
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export PATH=$PATH:$ORACLE_PATH:$HOME/.local/bin:$HOME/bin
 
# Set up the shell variables:
export EDITOR=vi
export LANG=C
export PS1=`whoami`@`hostname`\['$ORACLE_SID'\]':$PWD$ '

. ~/.bash_profile

 

설치 파일 각 디스크로 전송 및 확인

ls -l /grid /oracle

 

디렉터리 권한 변경

chmod -R 775 /grid /oracle
chown -R grid. /grid /oracle
chown -R oracle. /oracle
ls -l / ; ls -l /grid /oracle

 

 

7. 그리드 엔진 설치

설치 파일 압축 해제

su - grid
cd /grid
mkdir -p $GRID_HOME
unzip <압축파일명> -d $GRID_HOME

 

ssh 접속 설정(RAC 설치 시, 1번기에서 설치되는 내역을 ssh를 통해 2번기로 파일을 넘겨주기 때문에 필수적으로 설정해야 함)

cd $GRID_HOME/oui/prov/resources/scripts
./sshUserSetup.sh -user grid -hosts "ol79rac1 ol79rac2" -noPromptPassphrase -advanced

 

중간에 작성해 줄 부분

Do you want to continue and let the script make the above mentioned changes (yes/no)?
yes

The user may be prompted for a password here since the script would be running SSH on host ol79rac1.
Warning: Permanently added 'ol79rac1,192.168.88.79' (ECDSA) to the list of known hosts.
grid@ol79rac1's password: grid 입력
Done with creating .ssh directory and setting permissions on remote host ol79rac1.
Creating .ssh directory and setting permissions on remote host ol79rac2
THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR grid. THIS IS AN SSH REQUIREMENT.
The script would create ~grid/.ssh/config file on remote host ol79rac2. If a config file exists already at ~grid/.ssh/config, it would be backed up to ~grid/.ssh/config.backup.
The user may be prompted for a password here since the script would be running SSH on host ol79rac2.
Warning: Permanently added 'ol79rac2,192.168.88.80' (ECDSA) to the list of known hosts.
grid@ol79rac2's password: grid 입력
Done with creating .ssh directory and setting permissions on remote host ol79rac2.

 

ssh 정상적으로 맺었는지 확인, remote node 접속 시 패스워드를 묻지 않아야 함

ssh ol79rac2 date              #외부 통신 영역
ssh ol79rac2-priv date       #내부 interconnect 영역

#interconnect 영역이 ssh 설정되지 않았다면 yes만 눌러주면 설정 완료

 

해당 스크립트를 돌린 후 grid 설치 중 ssh 연결이 안되어 있다면 수동으로 ssh 연결 맺기

 

 

cvuqdisk 패키지 설치(모든 노드, 해당 패키지가 없으면 클러스터 확인 유틸리티(CVU)는 공유 디스크를 찾을 수 없음)

해당 패키지는 oinstall 그룹이 존재해야만 설치되며, 없을 경우 에러나서 설치 불가

echo $GRID_HOME   #해당 내용 복사
exit
cd /grid/app/12c/grid/cv/rpm
ls -l
rpm -ivh cvuqdisk-1.0.10-1.rpm

cat /etc/hosts
scp cvuqdisk-1.0.10-1.rpm root@ol79rac2:/tmp
yes
root

ssh ol79rac2
cd /tmp
ls -l | grep cvu
rpm -ivh cvuqdisk-1.0.10-1.rpm

 

설치 전 사전 점검(해당 부분 확인을 위해서는 /tmp 디렉터리가 5G 이상이여야 함, 아니면 / 에 여유 공간 필요)

필수 사항은 아니며, 맞추면 장애 없이 설치가 가능하고, grid 설치 전 check 사항에서 한번 더 체크 가능

새로운 접속창으로 grid 접속
cd $GRID_HOME
./runcluvfy.sh stage -pre crsinst -n ol79rac1,ol79rac2 -osdba dba -orainv dba -verbose

 

아래는 설치 전 테스트 내용 확인

 

서버에서 바로 설치하는 것이 아니라면 X-windows 설정이 필요

X-windows 설치 : root 유저에서 yum - y install xorg* 패키지 설치

cd $GRID_HOME
./gridSetup.sh

 

 

 

 

 

노드 추가

 

설치 전 ssh 접속 설정을 안했다면 여기서 ssh connectivity로 설정 가능

cd $GRID_HOME/oui/prov/resources/scripts
./sshUserSetup.sh -user grid -hosts "ol79rac1 ol79rac2" -noPromptPassphrase -advanced

 

정상 설정인지 확인하는 법은 Test 눌러서 선택하면 아래같은 화면이 나옴

 

인터페이스 설정

 

 

 

 

 

 

유저 패스워드 설정(oracle_4U)

 

 

EM 설치 안함

 

그룹 생성 다 한 경우 아래처럼, dba만 설정한 경우 전부 dba 그룹으로 설정

 

asmoper를 주지 않은 경우 아래 같은 에러 발생

 

아래처럼 설정

 

yes로 넘어가기

 

 

비어있지 않아도 YES

 

 

스크립트 수동으로 돌릴 예정

 

설정 내용 확인, 패키지가 없거나 kernel 설정이 부족한 경우 변경 후 retry

 

 

쉘 돌리기

순서는 1번기 orainstRoot.sh -> 2번기 orainstRoot.sh -> 1번기 root.sh -> 2번기 root.sh

 

 

root.sh 이 에러나는 경우 재설치 해야함

2번기의 ASM 디스크 인식을 못하는 경우 cluster 17번에서 막히거나 1 에러 내용 나옴

아니면 무사히 넘어갔다 하더라도 2번기의 root 쉘 이후 클러스터 리소스에 등록 안되는 문제 발생함

 

아래는 정상적으로 설치되는 과정

 

2번기도 동일하게 진행

 

이후 ok를 눌러 계속 진행

 

설치 완료 후 INS-20802 에러 발생, details로 내용 확인

 

로그 내역을 보면 SCAN ip가 DNS에 등록되어 있지 않아서 발생한 문제

 

무시 가능하니 OK로 마무리

 

fail 2개가 났지만 괜찮음 Next 선택

 

스킵할 건데 괜찮냐고 묻는 메시지, YES 

 

설치 완료

 

설치 된 내용 확인, 정상적으로 등록된 리소스들이 보임

 

 

8. Diskgroup 생성(1번기)

DB를 생성 시, datafile을 넣기 위한 diskgroup 생성이 필요함

su - grid
asmca 

 

디스크 그룹 선택 및 Create

 

DATA 디스크 영역 생성

 

RECOVERY 데이터 영역 생성

 

생성 내용 확인

 

디스크 그룹 생성 조회

export ORACLE_SID=+ASM
asmcmd
ls -l

 

 

9. 오라클 엔진 설치

1번기 오라클 엔진 파일 압축 해제

su - oracle
cd /oracle
ls -l
unzip Oracle\ Database\ 12.2.0.1.0\ for\ Linux\ x86-64\,\ 3.2\ GB.zip

 

 ssh 설정

cd /oracle/database/sshsetup
./sshUserSetup.sh -user oracle -hosts "ol79rac1 ol79rac2" -noPromptPassphrase -advanced

 

오라클 엔진 설치

cd /oracle/database
ls -l
./runInstaller

 

메일 안받음, 체크 해제 후 Yes

 

엔진만 인스톨 할 예정이라 software only 선택

 

RAC 선택

 

node 선택, grid와 마찬가지로 ssh 접속 잘 했다면, 그냥 Next

 

아니면 테스트 확인


엔터프라이즈 선택

 

경로 선택

 

그룹 설정, 운영 시에는 일반적으로 DBA로 다 통일함

 

실제로 아래처럼 변경 후 Next

 

SCAN이 없어서 나오는 에러 무시하고 Next

 

경고창 무시

 

인스톨 진행

 

스크립트는 1번, 2번 순으로 수행

 

1번기 수행

 

2번기 수행 

 

엔진 설치 완료

 

 

10. 오라클 DB 생성(1번기)

DB생성

dbca

 

Advanced 선택

 

Custom

 

Node 선택

 

인스턴스 이름 지정

 

데이터 파일 경로 지정, OMF 해제

 

yes

 

 

컴포넌트 선택

 

메모리 설정

 

인코딩 설정

 

샘플 스키마

 

 에러가 발생한다

 

 

에러나면 해제

 

EM 및 CVU 삭제

 

비밀번호 설정(oracle_4U)

 

스크립트 생성 시 체크

 

파일 크기랑 경로 설정 원하면 Customize 클릭, 여기 내부에서 선택

 

파라미터 관련 설정은 All initialization 선택, 특이사항 없으면 Next

 

SCAN 무시

 

Finish 선택

 

생성 중, 에러 없으면 정상 완료

 

설치 완료, 계정정보를 GUI에서 컨트롤 하고 싶으면 Password 선택

 

후속처리

root 계정에서도 srvctl 및 crsctl 사용을 위해 프로파일 적용

su - 
vi ~/.bash_profile

아래내용 기입
# User specific environment and startup programs

export ORACLE_HOME=$ORACLE_BASE/product/12c/dbhome_1
export GRID_HOME=/grid/app/12c/grid

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

export PATH

 

이후 적용, 확인

. ~/.bash_profile
which srvctl

728x90

정의 : 파일 처리 시스템의 문제점을 해결하기 위해서 등장한 소프트웨어 도구의 집합

 

 

[파일 시스템의 문제점]

데이터 독립성 보장 미흡 : 파일의 구성 방법이나 접근 방법을 인지해야 처리 가능

데이터 일관성 보장 문제 : 동일한 내용의 데이터가 서로 다르게 보관

데이터 무결성 보장이 곤란 : 중복 데이터 및 관련 데이터의 일관성 유지가 어려움

공유성 및 사용 편의성 저조 : 프로그램별로 자신만의 파일을 별도로 관리

낮은 경제성 : 데이터의 중복 보관, 저장 공간 및 갱신 비용 증가

보안 관리 곤란 : 동일 데이터에 대한 보안 등급 상이

 

 

[DBMS의 궁극적 목표]

물리적 독립성 : 디스크 블록, 실린더, 바이트, 데이터 항목의 위치와 같은 물리적 구성에 대한 종속성을 제거

접근의 독립성 : 프로그램으로부터 요구되는 레코드와 파일의 탐색과 접근을 위한 접근 경로를 제거

데이터의 독립성 : 데이터가 프로그램 언어, 운영 체계와 처리 환경으로부터 분리

 

 

[DBMS의 특징]

중복성 통제 : 데이터의 사전 검증을 통해 중복된 데이터를 최소화함으로써 데이터의 저장, 개발, 성능 및 유지보수 측면에 장점을 갖게 됨

데이터의 일관성 유지 : 중앙 집중식 통제로 동일한 사실을 표현하는 데이터들 간의 불일치를 방지하고 동질성을 보장

메타 데이터 : 데이터의 관계나 특성들이 메타 데이터에 저장, 이런 메타 데이터의 관리로 관련 프로그램들의 수정 없이 데이터의 구조적 변경이 가능

사용자 중심의 데이터 처리 : 데이터 간 복잡한 관계를 DBMS가 처리해 줌으로써 사용자에 의한 데이터 처리가 좀 더 용이함, 대부분의 DBMS는 다중의 사용자를 위해서 다양하고 용이한 인터페이스를 제공

데이터의 정합성 보장 : DBMS는 입력이나 갱신 작업을 수행할 때마다 사용된 데이터가 규칙에 위배되지 않는 정확한 값인가를 검사하여 유효한 데이터만 허용, 이처럼 데이터 정합성을 검증하므로 모든 데이터는 정합성을 유지함

백업 및 복구 기능 : 보관된 데이터의 안정성을 높이기 위해서 데이터의 복제본을 저장할 수 있도록 하는 백업 기능 제공, 또한, 장애가 발생했을 경우 백업 기능으로 생성된 복제 본을 이용하여 데이터를 복원시킬 수 있는 복구 기능 제공

질의 처리 : 데이터를 사용하기 위해 사용자가 질의를 수행할 경우 효과적인 방법으로 데이터에 접근하는 방법을 제공

보안 기능 : 데이터베이스에 대해서 허용된 사용자에 의해서만 접근을 가능하게 할 수 있으며, 처리 가능한 데이터를 확인 및 검사함으로써 개인 정보를 보호할 수 있도록 한다

 

 

[DBMS의 단점]

백업 복구의 어려움

고성능 하드웨어 및 고가의 DBMS 구입 비용과 장애에 대한 사전 대비를 위한 백업 및 복구 비용이 큼

 

 

[DBMS의 언어]

사용자가 데이터를 정의하고 조작하기 위하여 DBMS에서 제공하는 언어 = SQL

데이터 정의어(DDL) : 데이터 정의어를 통해 데이터베이스를 구성하는 오브젝트가 정의되며 데이터베이스의 메타데이터로 저장, 각 DBMS 마다 많은 데이터 정의어들이 존재, 데이터 테이블 생성(Create Table), 테이블 변경(Alter Table) 및 테이블 삭제(Drop Table)이 존재

데이터 제어어(DCL) : 데이터베이스에 저장된 데이터를 올바르게 유지하기 위해 사용되며 데이터 무결성 또는 보안에 대한 작업을 수행, 사용자에 의해서 사용되기 보다는 데이터베이스 관리자에 의해 사용, 권한 부여(Grant) 및 권한 해제(Revoke)등이 존재

데이터 조작어(DML) : 데이터베이스에 데이터를 입력, 수정 및 삭제 등의 작업을 수행하기 위해서는 각각의 작업에 맞는 DML을 이용, DML은 INSERT(입력), UPDATE(수정), 및 DELETE(삭제)를 의미

데이터 검색어(Query) : 데이터베이스에 저장되어 있는 데이터를 조회하기 위해 사용하는 SQL 언어, 데이터 검색어로는 SELECT를 사용

 

 

[관계형 DBMS(RDBMS) 종류]

객체 지향 DBMS : ObjectStore, Open ODB 및 Versant

객체 관계 DBMS : Universal Server가 존재, 오라클은 보완된 기능으로 객체 관계 DBMS의 형태를 갖춤

 

 

[오라클 버전 및 제품군]

오라클 엔터프라이즈 에디션(Enterprise Edition) : 단일 시스템 환경뿐만 아니라 클러스터 환경을 지원하며 많은 수의 사용자와 대용량 데이터베이스 운영을 위한 기업용 버전

오라클 스탠다드 에디션(Standard Edition) : 오라클 엔터프라이즈 에디션에 비해 비교적 저렴한 비용으로 중, 소규모 비즈니스 및 부서 단위 환경을 위한 버전

오라클 퍼스널 에디션(Peronal Edition) : 오라클 엔터프라이즈 에디션의 모든 기능을 갖추고 있는 개인용 버전이며 일반적으로 어플리케이션 개발을 위한 개인 사용자 버전

오라클 라이트 에디션(Lite Edition) : 모바일 데이터베이스 구축, 배포 및 관리를 위한 버전

오라클 익스프레스 에디션(Express Edition) : 개발용으로 사용할 수 있는 무료 버전

728x90

설치 환경

운영체제 : centos 7 3-10.0-1127.13.1.el7.x86_64

DB 버전 : 11.9

 

구성도

 

설치 방법

특이사항

  • replication 설정 후 시작, replication 설정은 https://peryh.tistory.com/8?category=871555 참조
  • pgpool을 두가지 방식으로 사용하는 방법을 기술(pgpool이 load balance만 하는 경우, pgpool이 replication을 담당하는 경우)
  • postgres 기본 경로 변경(/var/lib/pgsql/11/data -> /pgsql/11/data)하여 수행, 변경하지 않는 경우 scp로 파일을 생성할 때, root의 권한이 있는 디렉터리에 생성되지 않음, 설정은 peryh.tistory.com/7?category=871555 참조

 

master 쪽 설정

Pgpool-II 설치

yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-release-4.0-1.noarch.rpm

yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-4.0.1-1pgdg.rhel7.x86_64.rpm

yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-debuginfo-4.0.1-1pgdg.rhel7.x86_64.rpm

yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-devel-4.0.1-1pgdg.rhel7.x86_64.rpm

yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-extensions-4.0.1-1pgdg.rhel7.x86_64.rpm

 

확인

#rpm -qa | grep pgpool

pgpool-II-release-4.0-1.noarch

pgpool-II-pg11-debuginfo-4.0.1-1pgdg.rhel7.x86_64

pgpool-II-pg11-extensions-4.0.1-1pgdg.rhel7.x86_64

pgpool-II-pg11-4.0.1-1pgdg.rhel7.x86_64

pgpool-II-pg11-devel-4.0.1-1pgdg.rhel7.x86_64

 

 

pgpool디렉터리 생성(로그 보기 위한 디렉터리)

mkdir -p /var/log/pgpool

 

 

Step 2. pgpool 설정을 한다.

pgpool.conf 복사 및 수정

어떻게 작동시킬 것인가에 따라 필요한 conf 파일을 복사해서 사용한다

스트리밍 복제모드(Streaming replication mode) : stream PostgreSQL이 데이터베이스를 동기화하고 Pgpool은 Load Balancing을 담당

논리 복제모드(logical replication mode) : logical PostgreSQL이 테이블 동기화를 담당하며 Pgpool은 Load Balancing을 담당

마스터 슬레이브 모드(master slave mode(slony mode)) : master-slavePgpool이 데이터베이스 동기화와 Load Balancing을 담당

네이티브 복제모드(native replication mode) : replication동기식으로 동기화를 수행

원시 모드(raw mode) : sample

설명 문서 : https://www.pgpool.net/docs/latest/en/html/configuring-pgpool.html

#cd /etc/pgpool-II

#rm -rf pgpool.conf

#cp pgpool.conf.sample-stream pgpool.conf

#chmod 764 pgpool.conf

#vi /etc/pgpool-II/pgpool.conf

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

# pgpool 외부 접근정보

# 외부 접속 정보

#  '*' for all, '' for no TCP/IP connections

listen_addresses = '*'

port = 9999

 

#------------------------------------------------------------------------------

# - Backend Connection Settings -

#------------------------------------------------------------------------------

# backend_hostname : Pgpool이 서버에 접속할 때 사용할 hostname 또는 IP

# backend_port : 포트번호

# backend_weight : 백엔드의 Load balancing 비율

# backend_data_directory : 백엔드의 데이터베이스 클러스터 디렉터리

# backend_flag : 백엔드 동작을 제어

# 백엔드를 여러 개 사용할 경우 매개변수 이름 끝에 숫자(DB node ID)를 추가한다.

# 0은 서버를 하나만 사용한다. 숫자가 가장 낮은 DB noid ID가 마스터 노드가 된다.

backend_hostname0 = '10.178.0.1'                      => 1번 OS ip

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/pgsql/11/data'

backend_flag0 = 'ALLOW_TO_FAILOVER'

 

backend_hostname1 = '10.178.0.2'                      => 2번 OS ip

backend_port1 = 5432

backend_weight1 = 1

backend_data_directory1 = '/pgsql/11/data'

backend_flag1 = 'ALLOW_TO_FAILOVER'

 

#------------------------------------------------------------------------------

# FILE LOCATIONS

#------------------------------------------------------------------------------

#클라이언트 인증을 위해 pool_hba.conf를 참조, 기본값은 false

#서버 수가 둘 이상인 경우 postgresql에서 정의한 인증방법이 trust이면 off로 설정 가능

enable_pool_hba = off

 

# 로그 파일 저장 위치 지정

logdir = '/var/log/pgpool'

 

#------------------------------------------------------------------------------

# REPLICATION MODE

#------------------------------------------------------------------------------

# replication 모드 활성화/비활성화

replication_mode = off

replicate_select = off

insert_lock = off

 

#------------------------------------------------------------------------------

# - Degenerate handling -

#------------------------------------------------------------------------------

# 데이터 정합성 검사

# insert나 update, delete시에 반영되는 로우가 다를시 쿼리실행이 중지됨

replication_stop_on_mismatch = off    (1/5 현재 on상태)

 

#------------------------------------------------------------------------------

# LOAD BALANCING MODE

#------------------------------------------------------------------------------

#pgpool의 load_balance 기능, 위에서 설정한 backend host에 맘대로 왔다갔다하여 붙음

#확인 방법은 $psql -h <pgpool 설치된곳 ip> -p 9999 -U <유저=롤> 이후 select inet_server_addr();

load_balance_mode = on

 

#------------------------------------------------------------------------------

# MASTER/SLAVE MODE

#------------------------------------------------------------------------------

# Streaming Replication

# 마스터 / 슬레이브 모드 확성화/비활성화

# replication_mode 와 함께 사용할 수 없다. 둘 중 하나만 활성화해서 사용.

 

//master_slave_mode =  off      설정을 off로 하면 pgpool에서 자체적으로 replication을 함

master_slave_mode = on

 

master_slave_sub_mode = ‘stream’

 

#------------------------------------------------------------------------------

# - Streaming -

#------------------------------------------------------------------------------

# Streaming Replication 방식을 사용할 경우 설정

# sr_check_user 설정을 정확히 안하면 primary node 를 찾지 못함(DB 유저 postgres의 계정, 비밀번호, DB정보)

sr_check_period = 10

sr_check_user = 'postgres'

sr_check_password = 'psql'

sr_check_database = 'postgres'

delay_threshold = 0

 

#------------------------------------------------------------------------------

# FAILOVER AND FAILBACK

#------------------------------------------------------------------------------

# 기본 노드를 찾는 시간

search_primary_node_timeout = 10

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

 

 

pgpool에서 master, slave 서버에 접근할 수 있도록 설정한다.

 

vi /etc/pgpool-II/pool_hba.conf

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

host all all 10.178.0.0/24 trust

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

 

pgpool을 기동한다.

# pgpool -f /etc/pgpool-II/pgpool.conf -n -D -d > /var/log/pgpool/pgpool.log 2>&1 &

 

 

 

여기서 에러가 나면

https://qastack.kr/ubuntu/50621/cannot-connect-to-postgresql-on-port-5432

오류 메시지는 유닉스 도메인 소켓을 참조하므로 netstat제외하지 않으려면 호출을 조정해야 합니다.

옵션없이 시도하십시오 

 

netstat -nlp | grep 5432

클라이언트가 연결하려고하는 /tmp/.s.PGSQL.5432것이 아니라 서버가 실제로 소켓에서 수신 대기 하고 /var/run/postgresql/.s.PGSQL.5432있다고 생각합니다. 이것은 유닉스 도메인 소켓 디렉토리의 소스 기본값 /tmp이 데비안 패키징에서로 변경 되기 때문에 데비안 또는 우분투에서 수동 컴파일 또는 타사 PostgreSQL 패키지를 사용할 때 발생하는 일반적인 문제 /var/run/postgresql입니다.

 

가능한 해결 방법 :

타사 패키지에서 제공 한 클라이언트를 사용하십시오 (call /opt/djangostack-1.3-0/postgresql/bin/psql). 우분투 제공 패키지를 모두 제거 할 수 있습니다 (다른 역 종속성으로 인해 어려울 수 있음).

타사 패키지의 소켓 디렉토리가 Debian / Ubuntu와 호환되도록 수정하십시오.

-H localhost대신 TCP / IP를 통해 연결하는 데 사용하십시오 .

올바른 디렉토리를 가리 키려면 -h /tmp이와 동등한 PGHOST설정을 사용하십시오 .

타사 패키지를 사용하지 마십시오.

 

vi /var/lib/pgsql/11/data/postgresql.conf의 unix_socket_directories = '/var/run/postgresql, /tmp' 주석 해제 후

pid관련 파일 삭제 후 재부팅하여 해결하였음

 

pgpool 관련 에러 발생 시, pg_hba.conf 파일 수정

[postgres@policyserver1 ~]$ psql -h localhost -p 9999 -U postgres

psql: ERROR:  unable to read message kind

DETAIL:  kind does not match between master(45) slot[1] (52)

 

 

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

pgpool 정지

#pgpool stop

 

-pgpool 기동하고 접속

$psql -h 10.178.0.1 -p 9999 -U postgres

 

# master, slave 노드정보 확인

postgres=# \x

postgres=# show pool_nodes;

 

 

 

# 현재 접속된 노드 확인

# 로드밸런싱 설정을 해놔서 master, slave 왔다갔다 하면서 붙음(안바뀜)

select inet_server_addr();

 

 

 

Step 3. failover 설정

failover시, master 서버가 slave 서버한테 failover trigger 파일을 전송한다. 이 때 비밀번호 없이 전송하기 위해 ssh key 복사를 해준다.

 

master 노드 (postgres 계정으로 진행)

ssh-keygen -C postgres@10.178.0.1

엔터- 엔터- 엔터

ssh-copy-id postgres@10.178.0.2     <=이 IP는 상대 IP 넣기

 

slave 노드 (postgres 계정으로 진행)

ssh-keygen -C 10.178.0.2로 생성

엔터 3번

클라우드 환경이라면 cd .ssh

내부의 id_rsa.pub 파일 내용을 메타데이터의 ssh키에 저장

ssh-copy-id postgres@10.178.0.1

 

정상 동작 확인(master에서)

ssh -T postgres@10.178.0.2 touch /home/postgres/testfile.txt

해당 위치에 파일 생성된 것 확인

 

failover_command 설정, pgpool은 master의 장애를 감지하면 failover_command를 수행한다.(master에서 수행)

#vi /etc/pgpool-II/pgpool.conf

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

failover_command = '/usr/pgsql-11/share/failover.sh %d %H /pgsql/11/data/failover_trigger'

 

health check 설정 : 자동으로 failover기능이 활성화 되도록 설정

health_check_period = 0 --> 15

health_check_timeout= 20 --> 10

health_check_max_retries = 0 --> 3

health_check_retry_delay = 1

health_check_user = 'postgres'

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

 

 

# failover 스크립트 작성

master 서버에 장애가 생기면 slave 서버에게 trigger 파일을 전송

slave에 trigger 파일이 있으면 master로 전환, trigger 파일 경로는 slave의 /var/lib/pgsql/11/data/recovery.conf 에도 설정(master에서 설정)

 

$ cd /usr/pgsql-11/share

$ vi failover.sh

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

if [ $# -ne 3 ]

then

        echo "failover failed_node new_master trigger_file"

        exit 1

fi

 

FAILED_NODE=$1

NEW_MASTER=$2

TRIGGER_FILE=$3

 

# Do nothing if standby server goes down

if [$FAILED_NODE = 1]; then

        echo "Standby Server is downed\n" >> /var/log/pgpool/failover.log

        exit 0

fi

 

echo "failover.sh FAILED_NODE:${FAILED_NODE}; NEW_MASTER:${NEW_MASTER}; at $(date)\n" >> /var/log/pgpool/failover.log

 

sudo -u postgres  ssh -T postgres@$NEW_MASTER touch $TRIGGER_FILE

 

exit 0

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

 

# failover.sh 권한 변경

$ chmod 775 /usr/pgsql-1/share/failover.sh

 

pgpool을 재시작

pgpool stop

pgpool -f /etc/pgpool-II/pgpool.conf -n -D -d > /var/log/pgpool/pgpool.log 2>&1 &

 

master 쪽 stop

$pg_ctl -D /pgsql/11/data/ stop

 

slave쪽에서 접속하여 확인

$psql -h 10.178.0.2 -p 9999 -U postgres

postgres=# show pool_nodes;

 

<참고>일반적인 수동 active 전환 방법

$pg_ctl promote -D /var/lib/pgsql/11/data 

 

failover 후 추가작업(new master가 살아있어야 함, pgpool있는 곳에서 작업)

failover 후 old master를 올려도 자동으로 slave 로 추가되는 기능은 제공되지 않기 때문에 아래와 같은 과정을 수동으로 진행

old master 서버가 failover 되어 new master 가 된 상황 1번 서버를 올려도 자동으로 slave로 추가되지 않으며

pgpool은 이 서버를 인식하지 못함

 

10.178.0.2(new master)쪽 설정(최초에 설정했으면 수정할 필요 없음)

vi /pgsql/11/data/pg_hba.conf

host     replication      all    0.0.0.0/0   md5

추가

 

이후 재기동

$pg_ctl -D /pgsql/11/data start

 

10.178.0.1(old master)에서 진행

$ cd /pgsql/11

$ mv data data_old

 

$pg_ctl -D /pgsql/11/data stop

 

Standby Server의 Data 폴더를 보면 이전에 recovery.conf로 만들어 놓은 파일이 recovery.done으로 변경되어 있는 것을 확인할 수 있음, 새로 master가 된 2번기의 데이터 파일 가져오기

$ pg_basebackup -h 10.178.0.2 -D /pgsql/11/data -U repl -v -P -X stream

 

recovery.done을 .conf로 바꾸고 host ip도 변경

$cd /pgsql/11/data

$mv recovery.done recovery.conf

vi recovery.conf

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

standby_mode='on'

 

# master 노드의 정보를 적는다.

 

primary_conninfo='host=10.178.0.2 port=5432 user=repl password=repl'

 

# slave노드에 trigger file이 있으면, slave가 master로 전환된다.

 

trigger_file='/var/lib/pgsql/11/data/failover_trigger'

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

old master up

$ cd /usr/pgsql-11/bin/

$./pg_ctl -D /var/lib/pgsql/11/data/ start

 

pgpool node로 추가(pgpool에서 up으로 인식되어지는 작업)

# echo "postgres:$(pg_md5 --username=postgres postgres)" >> /etc/pgpool-II/pcp.conf

 

이거 때문에 password 지정해야 함

$ pcp_attach_node -n 0

Password : postgres (echo에서 설정한 비밀번호 입력해야 함)

 

 

new master가 죽었을 경우 slave를 pgpool에 붙여주기 위해서는

pgpool 재기동이 필요

 

 

'데이터베이스 > postgres' 카테고리의 다른 글

Postgresql 11 replication  (0) 2021.03.15
Postgres 기본 경로 변경  (0) 2021.03.15
Postgres 설치 및 사용 방법  (0) 2021.01.14

+ Recent posts