728x90

FlashBack

오라클 DB 데이터를 매우 빠른 속도로 복구하는 기술이다. 사용자 실수로 인한 데이터 오류, 테이블 삭제, 또는 데이터베이스 전체에 대해 문제가 발생했을 때 매우 빠른 속도로 복구할 수 있다.

FlashBack이 필요한 이유

예를 들어 쇼핑몰을 운영하는 회사에서 인플레이션으로 인해 사장님이 전체 상품에 대해 5% 인상을 이대리에게 요청한다. 이대리는 상품 테이블을 update 명령어로 5% 인상해야 하는데 실수로 50% 인상을 해버렸다.

FlashBack을 사용안하던 과거에는 실수로 상품 table을 삭제했을 때는 EXP/IMP, DATAPUMP, RMAN이 있는데 EXP/IMP, DATAPUMP는 원하는 시점으로 복구하기가 어렵고 RMAN은 가능하지만 데이터 크기가 크면 복구하는데 오래 걸릴 수 있다. 이럴 때 FlashBack table 기능을 이용하면 간단하게 복구할 수 있다.

FRA(Fast Recovery Area)

빠르게 복구할 수 있는 공간을 의미하고 백업 데이터 파일들을 통합 관리하는 기능을 제공한다.

테이블, 데이터 삭제 복구

1. find 명령어로 spfile위치를 확인한다.

find $ORACLE_HOME -name spfile*

2. spfile 백업

cp spfileSTR.ora spfileSTR.ora_20221231

3. UNDO RETENTION 파라미터 변경

-- 1Day = 86400sec
show parameter undo_retention
alter system set undo_retention=86400 scope=spfile;

4. DB 종료, 재시작

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작
STARTUP

5. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 1건 입력
INSERT INTO STR.FRA_TEST VALUES(TO_CHAR(SYSDATE,'YYYYMMDD HH24MISS'));
COMMIT;
-- 데이터 확인
SELECT * FROM STR.FRA_TEST;
-- 테이블 삭제
DROP TABLE STR.FRA_TEST;

6. FLASHBACK을 이용한 테이블 복구

FLASHBACK TABLE username.table_name TO BEFORE DROP;

테이블은 남아있고 데이터만 삭제 복구

1. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 5건 입력
INSERT INTO STR.FRA_TEST VALUES('1');
INSERT INTO STR.FRA_TEST VALUES('2');
INSERT INTO STR.FRA_TEST VALUES('3');
INSERT INTO STR.FRA_TEST VALUES('4');
INSERT INTO STR.FRA_TEST VALUES('5');
COMMIT;
-- INSERT 완료 시간 확인
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. 
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "COMMIT_TIME" FROM DUAL;
-- 데이터 전체 삭제
DELETE FROM STR.FRA_TEST;
COMMIT;

2. 데이터 복구

-- 데이터 전체 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
INSERT INTO STR.FRA_TEST
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
COMMIT;

부분 데이터 삭제 복구

1. Test 데이터 삭제

-- 부분 데이터 삭제
-- FRA_NO   3   데이터 삭제
DELETE FROM STR.FRA_TEST
WHERE FRA_NO = '3';
COMMIT;

2. 부분 데이터 복구(원본 테이블은 두고 복제 테이블을 만든다.)

-- CTAS를 이용한 FRA_TEST_20221219_1000 테이블 생성 및 데이터 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
CREATE TABLE STR.FRA_TEST_20221219_1000
AS
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');

-- 데이터 1건 복구 확인
SELECT * FROM * STR.FRA_TEST;

-- 테이블 삭제
DROP TABLE STR.FRA_TEST_20221219_1000 PURGE;
DROP TABLE STR.FRA_TEST PURGE;

3. 복제 테이블에서 원본 테이블과 빠진 데이터를 확인해서 Insert

-- 데이터 1건 복구 SQL
INSERT INTO STR.FRA_TEST
SELECT FRA_NO
FROM STR.FRA_TEST_20221219_1000
WHERE FRA_NO NOT IN (
	SELECT FRA_NO FROM STR.FRA_TEST);
COMMIT;     

데이터베이스 전체 복구

1. 아카이브 & FRA 디렉터리 생성, root 실행

mkdir /FRA
chown oracle.dba /FRA

ls -ld /FRA

2. FRA 파라미터 변경

-- 1Day = 1440min defualt
show parameter DB_FLASHBACK_RETENTION_TARGET

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G scope=spfile; -- 용량 설정
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/FRA' scope=spfile; -- 디렉터리 설정

3. DB 종료 후 Mount 상태로 올려야한다.

SHUTDOWN IMMEDIATE
STARTUP MOUNT

4. 아카이브 로그 모드, Flashback 모드로 변경 후 DB Open

ALTER DATABASE ARCHIVELOG;
-- 아카이브 로그 확인
ARCHIVE LOG LIST; 
-- Flashback 모드 변경
ALTER DATABASE FLASHBACK ON;
-- Flashback 모드 확인
SELECT FLASHBACK_ON FROM V$DATABASE;
-- DB OPEN
ALTER DATABASE OPEN;

FRA를 사용하려면 아카이브 로그모드와 FlashBack on이 되어있어야 한다.

5. 아카이브 & Flashback 상태 확인

SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

FlashBack이 실행되어 있으면 리눅스에서 RVWR 프로세스가 실행 중이다.

-- Linux 실행 RVWR(Recovery Writer) 프로세스 확인
ps -efl | grep [r]vwr

6. 시작 시간 확인

SELECT
TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "START_TIME" ,
TIMESTAMP_TO_SCN(SYSDATE) AS "SCN"
FROM DUAL;

7. DB mount 상태로 이동 mount 상태에서 복구해야 한다.

STARTUP MOUNT

8. DB 전체 Flashback으로 원하는 시간으로 복구 후 DB를 RESETLOGS로 Open 한다.

-- (시작 시간 확인) 쿼리에 START_TIME을 확인한다. (2022/12/19 10:00:00)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
-- DB OPEN
ALTER DATABASE OPEN RESETLOGS;

FRA 관리 방법

1. FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.

--  sqlplus / as sysdba 접속
sqlplus / as sysdba
SET LINES 180
COL NAME FOR A20
-- FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.
SELECT 
    FILE_TYPE, 
    PERCENT_SPACE_USED, 
    PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES 
FROM V$FLASH_RECOVERY_AREA_USAGE;

SELECT 
    NAME, 
    ROUND(SPACE_LIMIT/1024/1024/1024)   AS "SPACE(GB)",
    ROUND(SPACE_USED/1024/1024/1024,2)  AS "USED(GB)"
FROM V$RECOVERY_FILE_DEST;

백업 파일 삭제

1. Recovery Manager에 접속 후 백업 파일 삭제

-- rman에서 로그 확인 및 백업 파일 삭제
rman target /

REPORT OBSOLETE;
LIST ARCHIVELOG ALL;

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;

DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE FORCE OBSOLETE;

FRA 원상 복구

1. 파라미터 원복

ALTER SYSTEM RESET UNDO_RETENTION;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST_SIZE;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST;

2. DB 종료 후 Mount 상태로 Open

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작(Mount 상태)
STARTUP MOUNT

3. Flashback, 아카이브 로그 OFF 후 DB Open

-- Flashback 기능 OFF
ALTER DATABASE FLASHBACK OFF;
-- 아카이브 로그 OFF
ALTER DATABASE NOARCHIVELOG;
-- DB OPEN
ALTER DATABASE OPEN;

4. DB 상태 확인

-- DB 상태 확인
SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

5. FRA 디렉터리 삭제

-- root 접속
cd /
rm -rf /FRA

참고

https://www.youtube.com/watch?v=CqqNRKaVwqg 

 

728x90
728x90

AWR

Oracle 상태가 어떤지 분석할 때 가장 많이 사용하는 방법입니다.

vi 파일 수정(꼭 할 필요는 없음)

vi ~/.zshrc # vi로 열어서 아래의 내용을 붙여 넣는다

#Terminal Prompt
export PS1="%F{cyan}%n@%m%f %F{green}%1~%f %# "

#SQL Developer
export SQLPATH=/Applications/SQLDeveloper.app/Contents/Resources/sqldeveloper/sqldeveloper/bin
alias sqld="cd $SQLPATH"
alias sqlp="$SQLPATH/sqldeveloper &"
alias sqlpe="$SQLPATH/sqldeveloper --AddVMOption=-Duser.language=en &"

#VirtualBox Linux
alias strdb="ssh oracle@192.168.0.111"
alias strdbf="sftp oracle@192.168.0.111"

#Safari
alias safari="open /Applications/Safari.app"

#AWR 환경에 맞는 폴더를 만들어서 입력한다.
alias AWRD="cd /Volumes/EXT1TB/AWR"

# Lang Set
#export LANG=en_US
#export LANG=ko_KR.UTF-8

source ~/.zshrc

AWR 분석에 가장 중요한 기본 분석 주기(DEFUALT 1시간에 8일)

SELECT
         DBID
       , SNAP_INTERVAL
       , RETENTION
       , TOPNSQL
FROM DBA_HIST_WR_CONTROL;

분석 주기 변경

-- 10분 단위 (보관주기 30일)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>10, RETENTION=>30*24*60);

-- 10분 단위 (보관주기 90일)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>10, RETENTION=>90*24*60);

-- 10분 단위 (보관주기 30일)(TOPNSQL 100)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>10, RETENTION=>30*24*60, TOPNSQL=>'100');

-- 10분 단위 (보관주기 90일)(TOPNSQL 100) -> 업계에서 많이 사용
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>10, RETENTION=>90*24*60, TOPNSQL=>'100');

-- 30분 단위 (보관주기 90일)(TOPNSQL 100)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>30, RETENTION=>90*24*60, TOPNSQL=>'100');

-- Default값 변경(60분 단위 8일 보관)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>60, RETENTION=>8*24*60, TOPNSQL=>'DEFAULT');

TOPNSQL Default값 분석

SELECT *
FROM V$PARAMETER
WHERE NAME = 'statistics_level';

만약 TYPICAL이면 값이 30이고 ALL이면 100이다.

AWR 보관 주기 관련해서 가장 중요한 건 SYSAUX 테이블스페이스 공간이 충분이 확보되어야 한다. AWR의 interval을 짧게 주고 retension을 길게 주면 빠른 속도로 데이터가 늘어나기 때문에 꼭 확인해주어야 한다.

SYSAUX TABLESPACE 상태, 사이즈 확인

SELECT 
    TABLESPACE_NAME, 
    FILE_NAME, 
    BYTES/1024/1024 AS "SIZE(GB)" 
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'SYSAUX'
ORDER BY 1, 2;

SNAP_ID 분석

SELECT
    DBID,
    SNAP_ID,
    TO_CHAR(END_INTERVAL_TIME, 'YYYY/MM/DD(DY) HH24:MI') AS "END_INTERVAL_TIME"
FROM 
      DBA_HIST_SNAPSHOT
WHERE END_INTERVAL_TIME >= TRUNC(SYSDATE) -1
AND   END_INTERVAL_TIME <  TRUNC(SYSDATE) +1
ORDER BY SNAP_ID;

AWR 보고서 디렉터리 생성

cd /home/oracle
mkdir AWR

AWR 보고서 생성

-- 리눅스 서버 접속(sqlplus / as ysdba 실행)
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
@/oracle/app/oracle/product/19.0.0.0/db_1/rdbms/admin/awrrpt.sql

AWR 비교 보고서 생성

-- 리눅스 서버 접속(sqlplus / as ysdba 실행)
@$ORACLE_HOME/rdbms/admin/awrddrpt.sql
@/oracle/app/oracle/product/19.0.0.0/db_1/rdbms/admin/awrddrpt.sql

AWR 보고서에서 가장 많이 보는 건 오라클 이벤트를 확인하고 어디에 문제 있는지 분석하고 TOPSQL을 확인하는 게 중요하다. AWR에서 가장 중요한 건 서버에 들어갈 AWR 일자와 시간을 어떻게 뽑느냐가 관건이다. AWR interval을 짧게 주어야 보다 정확하게 분석이 가능하다.

참고

https://www.youtube.com/watch?v=_j8BHtFVRB0 

 

728x90
728x90

내 컴퓨터 IP 확인(macOS)

ifconfig | grep inet
ifconfig | grep inet | grep -v 'inet6'
ipconfig getifaddr en0

sqlnet.ora 변경

vi sqlnet.ora 

# 192.160.*,192.161.*,192.162.*,192.163.* 접근 제어
# localhost,STRDB01,192.168.0.111,192.168.0.11, 192.168.0.84 접근 허용
TCP.VALIDNODE_CHECKING = YES
TCP.EXCLUDED_NODES= (192.160.*,192.161.*,192.162.*,192.163.* )
TCP.INVITED_NODES=(localhost,STRDB01,192.168.0.111,192.168.0.11,192.168.0.84)

INVITED_NODES에 해당하는 IP만 허용

vi sqlnet.ora 

# localhost,STRDB01,192.168.0.111,192.168.0.11, 192.168.0.84 접근만 허용
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES=(localhost,STRDB01,192.168.0.111,192.168.0.11,192.168.0.84)

참고

https://www.youtube.com/watch?v=aktnGkzJWTE 

 

728x90
728x90

TDE

TDE(Transparent Data Encryption)는 특정 데이터 영역을 암호화하는 것이다. 크게 보면 두가지로 테이블 스페이스를 통해 특정 데이터 공간을 암호화 하거나 테이블의 특정 칼럼만 암호화 할 수 있다.

TDE에서 사용하는 암호화 알고리즘

  1. 3DES168
  2. AES128
  3. AES198
  4. AES256

가능하면 AES256을 사용하는 것을 추천한다. WALLET 암호화 파일 생성이 완료되면 USB에 따로 저장하고 WALLET 만들 때 사용했던 암호는 꼭 보관하거나 기억해야한다.

WALLET 디렉터리 생성

cd $ORACLE_BASE
cd /oracle/app/oracle

mkdir /oracle/app/oracle/wallet

sqlnet.ora파일에 내용 추가

cd $ORACLE_HOME/network/admin
cd /oracle/app/oracle/product/19.0.0.0/db_1/network/admin

-- sqlnet.ora 파일 백업
cp sqlnet.ora sqlnet.ora_20221215

vi sqlnet.ora

ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=/oracle/app/oracle/wallet)))

WALLET Key 생성 및 AUTO LOGIN 설정

cd /oracle/app/oracle/wallet

-- sqlplus / as sysdba 접속
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/oracle/app/oracle/wallet' IDENTIFIED BY oracle123;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY oracle123;
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY oracle123 WITH BACKUP;
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/oracle/app/oracle/wallet' IDENTIFIED BY oracle123;

Oracle TDE 테이블스페이스 생성

-- AES 128 테이블스페이스 생성
CREATE TABLESPACE TS_STRS_D
DATAFILE '/oracle/app/oracle/oradata/STRP/TS_STRS_D_001.DBF' SIZE 2048M
ENCRYPTION USING 'AES128'
DEFAULT STORAGE (ENCRYPT);

-- AES 256 테이블스페이스 생성
CREATE TABLESPACE TS_STRE_D
DATAFILE '/oracle/app/oracle/oradata/STRP/TS_STRE_D_001.DBF' SIZE 2048M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE (ENCRYPT);

-- TDE 생성 확인
SELECT
    A.NAME, 
    B.ENCRYPTIONALG,
    C.NAME,
    C.BYTES/1024/1024 AS "SIZE(MB)"
FROM 
    V$TABLESPACE A,
    V$ENCRYPTED_TABLESPACES B,
    V$DATAFILE C
WHERE A.TS# = B.TS#
AND   A.TS# = C.TS#
ORDER BY 1,2;

테이블 특정 칼럼 암호화(ENCRYPT AES256)

CREATE TABLE SYSTEM.TDE_TEST4
(
    T_NAME	VARCHAR2(500),
    T_KEY		VARCHAR2(500),
    T_MOB		VARCHAR2(100)	ENCRYPT USING 'AES256',
    T_ADR		VARCHAR2(2000)	ENCRYPT USING 'AES256'
)
TABLESPACE SYSAUX;

Tips.

TDE의 암호화된 공간은 테이블의 데이터만 넣어주어야 한다. 암호화되면 DB성능에 영향이 있기 때문에 테이블만 넣고 인덱스는 일반 테이블 스페이스 공간에 넣어주어야 문제 없이 사용이 가능하다. 개인 정보가 있는 중요한 데이터만 넣고 테이블의 데이터가 너무 크면 특정 칼럼만 암호화해서 사용하는게 좋다.

참고

https://www.youtube.com/watch?v=u5ReY3qi9Lg 

 

728x90
728x90

오라클 서버에서 .sql 파일 실행법

@파일이름.sql

전체 복구(기본)

ls -lh EXPDP_STR_FULL_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
DUMPFILE=EXPDP_STR_FULL_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_20221207.log

전체 복구(기본+TDE)

ls -lh EXPDP_STR_FULL_TDE_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_TDE_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_TDE_20221207.log

전체 복구(압축+TDE)

ls -lh EXPDP_STR_FULL_COMP_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_COMP_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_COMP_20221207.log

전체 복구(백업 파일 100M 분할)

ls -lh EXPDP_STR_FULL_DIV_20221207

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_DIV_20221207_%U.DMP \
LOGFILE=IMPDP_STR_FULL_DIV_20221207.log

전체 복구(Parallel+압축+TDE)

ls -lh EXPDP_STR_FULL_PCOMP_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
PARALLEL=4 FULL=YES ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_PCOMP_20221207_%U.DMP \
LOGFILE=IMPDP_STR_STR_FULL_PCOMP_20221207.log

Datapump 스키마(유저) 복구 STR계정 복구(Parallel+압축)

ls -lh EXPDP_STR_STR_P_20221207*

impdp system/oracle DIRECTORY=STR_DUMP SCHEMAS=STR \
PARALLEL=4 \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_STR_P_20221207_%U.dmp \
LOGFILE=IMPDP_STR_STR_P_20221207.log

Datapump 테이블 복구(계정명: STR 테이블명: CUST)

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST

Datapump 테이블 복구

-- 테이블스페이스 위치 변경: TS_STR_D, TS_STR_I  -->  SYSTEM

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST \
REMAP_TABLESPACE=TS_STR_D:SYSTEM \
REMAP_TABLESPACE=TS_STR_I:SYSTEM

복구 진행 중에 계속 멈춰 있다면 테이블 스페이스 공간을 확인하자

SELECT 
    OWNER, 
    SEGMENT_TYPE, 
    SEGMENT_NAME,
    TABLESPACE_NAME
FROM DBA_SEGMENTS
WHERE  SEGMENT_NAME IN ('CUST','CUST_IDX1');

ALTER DATABASE DATAFILE '/oracle/app/oracle/oradata/STR/system01.dbf' RESIZE 2048M;

Datapump 테이블 복구(테이블명 변경: CUST --> CUST_BACKUP_20221003)

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST \
REMAP_TABLE=CUST:CUST_BACKUP_20221207

참고

https://www.youtube.com/watch?v=fEVnBQJNuvQ 

 

728x90
728x90

EXPDP

Oracle Data Pump Export Utility로 백업을 한 시점에서 복구를 한다던가 다른 데이터 베이스에 이관을 쉽게 할 수 있어서 매우 유용하다.

디렉터리 생성과 삭제

cd /home/oracle
mkdir /home/oracle/oracle_dump
-- 디렉토리 생성
CREATE OR REPLACE DIRECTORY STR_DUMP AS '/home/oracle/oracle_dump';
GRANT READ, WRITE ON DIRECTORY STR_DUMP TO PUBLIC;

--디렉토리 삭제
REVOKE READ,WRITE ON DIRECTORY STR_DUMP FROM PUBLIC;
DROP DIRECTORY STR_DUMP;

전체 백업

-- FULL=YES
expdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
DUMPFILE=EXPDP_STR_FULL_20221206.DMP LOGFILE=EXPDP_STR_FULL_20221206.log

암호화가 되어 있는 테이블 스페이스나 테이블이 있을 경우 오류가 난다.

DATAPUMP 백업 상태 확인

-- SQL Developer 확인(SYS계정)
SELECT * FROM DBA_DATAPUMP_JOBS;

암호화되어있는지 확인(TDE Check)

-- Tablespace Level
SELECT 
    TABLESPACE_NAME,
    ENCRYPTED,
    STATUS 
FROM DBA_TABLESPACES;

-- Table Level
SELECT * 
FROM DBA_ENCRYPTED_COLUMNS;

암호화가 되어 있는지 테이블스페이스 단위, 테이블 단위로 확인을 한다.

전체 백업(기본+TDE)

-- FULL=YES ENCRYPTION_PASSWORD=oracle123
expdp system/oracle DIRECTORY=STR_DUMP FULL=YES ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_TDE_20221206.DMP LOGFILE=EXPDP_STR_FULL_TDE_20221206.log

전체 백업(압축+TDE)

-- FULL=YES COMPRESSION=ALL ENCRYPTION_PASSWORD=oracle123
expdp system/oracle DIRECTORY=STR_DUMP FULL=YES COMPRESSION=ALL ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_COMP_20221206.DMP LOGFILE=EXPDP_STR_FULL_COMP_20221206.log

전체 백업(백업 파일 100M 분할)

-- FULL=YES FILESIZE=100M ENCRYPTION_PASSWORD=oracle123
expdp system/oracle DIRECTORY=STR_DUMP FULL=YES FILESIZE=100M ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_DIV_20221206_%U.DMP LOGFILE=EXPDP_STR_FULL_DIV_20221206.log

DUMPFILE에 파일 명 쓰고 %U를 붙여줘야 1,2,3… 숫자가 포함된다.

전체 백업(Parallel+압축+TDE)

-- FULL=YES COMPRESSION=ALL PARALLEL=4 ENCRYPTION_PASSWORD=oracle123
expdp system/oracle DIRECTORY=STR_DUMP FULL=YES COMPRESSION=ALL PARALLEL=4 ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_PCOMP_20221206_%U.DMP LOGFILE=EXPDP_STR_FULL_PCOMP_20221206.log &

Parallel의 장점은 병렬로 처리하기 때문에 매우 빠르고 단점은 CPU 사용량이 높아서 전체 CPU 코어의 반 정도 사용하는 것을 추천한다.

부분 백업 STR계정 백업(Parallel+압축)

-- SCHEMAS=STR COMPRESSION=ALL PARALLEL=4
expdp system/oracle DIRECTORY=STR_DUMP SCHEMAS=STR COMPRESSION=ALL PARALLEL=4 \
DUMPFILE=EXPDP_STR_STR_P_20221206_%U.dmp LOGFILE=EXPDP_STR_STR_P_20221206.log

테이블 단위 백업

-- 계정명: STR, 테이블명: CUST
expdp system/oracle DIRECTORY=STR_DUMP DUMPFILE= EXPDP_STR_CUST_20221206.DMP LOGFILE=EXPDP_STR_CUST_20221206.log \
TABLES=STR.CUST

참고

https://www.youtube.com/watch?v=Ie0jjerBqvk&t=1s 

 

728x90
728x90

Optimizer_mode

  • RULE
    • RBO(Rule-based optimizer) 규칙 기반 옵티마이저
  • CHOOSE
    • CBO(Cost-based optimizer) 비용 기반 옵티마이저
  • FIRST_ROWS
    • CBO(Cost-based optimizer) 비용 기반 옵티마이저
    • 옵티마이저가 인덱스를 가장 많이 사용할 수 있도록 하는 모드 중 하나이다.
  • FIRST_ROWS_N
    • CBO(Cost-based optimizer) 비용 기반 옵티마이저
    • N은 1, 10, 100, 1000개 행을 의미하고 최초의 N건의 응답 속도를 최적화할 때 사용하는 모드 중 하나이다. B2C 고객의 수가 엄청 많다면 FIRST_ROWS_1을 추천한다.
    • FIRST_ROWS_1을 사용한다면 optimizer_index_caching과 optimizer_index_cost_adj를 변경해주어야 한다.
    • optimizer_index_caching는 인덱스를 사용해 접근한 블록을 오라클 메모리, 버퍼 캐시 디비 캐시 사이즈 파라미터에서 찾을 수 있는 비율을 말한다. 보통 90 ~ 95
    • optimizer_index_cost_adj는 테이블을 Full Scan을 많이 할지 아니면 인덱스를 더 많이 사용할지를 결정하는 파라미터이다. 보통 30 ~ 35
  • ALL_ROWS(DEFUALT)
    • CBO(Cost-based optimizer) 비용 기반 옵티마이저
    • 데이터의 모든 ROW를 빠르게 가져오고 테이블 Full Scan을 선호하는 경향이 있다.
    • 소형 프로그램이거나 DBA가 없을 경우 권장한다.

Adaptive Query Optimization

Oracle 자동 SQL 최적화 관리이고 Oracle 12C부터 적용 되었다. 데이터 베이스가 내부적으로 분석해서 SQL 실행 계획을 최적화하는 방식이다.

  • 오라클 옵티마이저 통계 및 통계 어드바이저
  • SQL Plan 관리
  • 정확도가 비교적 높은 SQL 처리

Adaptive Query Optimization를 false로 처리할려면

  • 완벽에 가까운 모델링(테이블 설계)
  • 아름다운 인덱스 설계
  • 확실한 테이블, 인덱스 통계정보 관리
  • 환상적인 SQL 튜닝

Adaptive Query Optimization 기능을 제어하는 대표적인 파라미터

  • optimizer_adaptive_plans (Defualt: true)
    • 옵티마이저가 adaptive_plan을 고려 대상으로 판단할지 여부를 결정한다.
  • optimizer_adaptive_statistics (Defualt: false)
    • 통계 피드백을 비활성화해서 SQL Plan 변경을 방지한다.
  • optimizer_adaptive_reporting_only (Defualt: false)
    • 어뎁티브 기능에 필요한 정보만 수집하고 SQL Plan을 변경할지 여부를 결정한다.
  • _optimizer_adaptive_cursor_sharing (Defualt: true)
    • 변숫값에 따라서 SQL Plan을 변경하는 파라미터이다.
  • _optimizer_aggr_groupby_elim (Defualt: true)
    • 특정 기준 조건으로 group by를 할 때 안에 group by 있고 밖에 group by가 또 있다고 하면 두 개의 group by가 아닌 하나의 group by만 사용하는 경우가 있다. 이럴 경우 문제가 있을 수도 있어 false로 놓고 많이 사용한다.
  • _add_col_optim_enabled (Defualt: true)
    • 오라클 내부에서 테이블 칼럼을 추가하면 빠른 속도로 처리가 된다. 하지만 Not null 조건에 defualt라고 하면 약간 문제가 있을 수 있어서 false로 놓고 많이 사용한다.

참고

https://www.youtube.com/watch?v=Y7scjyhY_1E&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=4 

 

728x90
728x90

Parameter

파라미터는 오라클을 설정할 수 있는 환경 변수 값들이 모여있는 곳들을 말한다. 서버 파라미터 파일인 spfileDB이름.ora 안에 환경 변수 값들이 있다.

AMM

Automatic Memory Management로 오라클 데이터 베이스 메모리의 대표적인 SGA, PGA를 자동으로 관리하는 방식이다.

ASMM

Automatic Shared Memory Management로 오라클의 메모리 영역인 SGA를 자동으로 관리하는 방식이다. DB의 사용자가 적고 트렌젝션이 별로 없거나 DBA가 없고 개발자가 관리한다면 ASMM을 사용하는 것을 권장하긴 한다.

파라미터 변경

ALTER SYSTEM SET 파라미터명=값 SCOPE=MEMORY|SPFILE|BOTH;

MEMORY는 오라클의 메모리에 즉시 적용, SPFILE은 SPFILE에만 적용, BOTH는 둘다 적용

파라미터 값 복구

ALTER SYSTEM RESET 파라미터명 SCOPE=MEMORY|SPFILE|BOTH;

가능한 SPFILE로 변경하는 것이 좋다.

pfile, spfile 백업

cp spfileSTR.ora spfileSTR.ora_20220711
mv initSTR.ora initSTR.ora_20220706

sqlplus / as sysdba
create pfile from spfile;
exit

mv initSTR.ora initSTR.ora_20220711

파라미터 값 확인

SELECT * FROM V$PARAMETER;

파라미터 값 변경하기 전에 모든 파라미터 값 조회한 것을 엑셀 파일로 백업한다.

오라클 메모리 자동 관리 확인

show parameter statistics_level

위의 명령어를 치면 TYPICAL로 나오는 것을 확인할 수 있다. TYPICAL 값이 DEFUALT 값이다.

오라클 대표 파라미터

  • sga_max_size : SGA 메모리의 최대 크기를 변경할 때 사용
  • sga_target : ASMM 관리할 때 사용하는 방식 이 파라미터를 0으로 저장하면 메모리가 관리 방식이 수동으로 바뀐다.
    • shared_pool_size : 라이브러리 캐시, 데이터 딕셔너리 캐시가 저장되는 장소
    • shared_pool_reserved_size : shared_pool의 공간을 예약한다.
    • db_cache_size : 데이터 파일에서 불러온 블럭을 저장한다.
    • java_pool_size
    • large_pool_size : 오라클의 페러럴 처리 작업이나 RMAN 백업, 복구할 때 사용
    • streams_pool_size : 데이터 백업과 관련있다. 버퍼링 된 큐 메시지 저장하거나 캡처 프로세스 및 적용 프로세스를 위한 메모리 공간 중 하나이다.
  • pga_aggregate_target : DB 인스턴스에 연결된 모든 서버 프로세스가 사용할 수 있는 PGA 메모리 영역 중 하나이다.

데이터 베이스에 동시에 접속할 수 있는 숫자를 결정하는 대표적인 파라미터

  • processes
  • sessions
  • transactions
  • open_cursors

옵티마이저와 관련된 파라미터

  • optimizer_dynamic_sampling : 테이블 통계정보가 없는 상태에서 테이블의 특정 조건이 맞으면 자동으로 통계 정보가 갱신된다. 이 파라미터에 따라서 SQL Plan이 변경될 수 있다.
  • "_optim_peek_user_binds" : SQL 사용할 때 바인드 변수를 많이 넣는데 이 파라미터에 따라서 SQL Plan이 변경될 수 있다.
  • "_optimizer_use_feedback" : 새로운 SQL이 실행될 때 예측 값과 실측 값이 있다. 이 두 값의 차이가 발생하면 실행 계획이 변경될 수 있다.

앞에 _가 붙은 파라미터는 히든 파라미터라고 부른다.

업계에서 권장하는 메모리 값은 물리적인 서버 메모리 대략 10~20% 수준에서 오라클 메모리 파라미터 초기 설정을 하고 테스트를 통해서 계속 변경한다. 파라미터 적용할 때 spfile에 적용했다가 DB를 내렸다 올리는 게 좋다.

히든 파라미터 조회

-- Hidden Parameter 조회
SELECT 
    a.ksppinm "Parameter", 
    b.KSPPSTDF "Default Value",
    b.ksppstvl "Session Value", 
    c.ksppstvl "Instance Value",
    decode(bitand(a.ksppiflg/256,1),1,'TRUE','FALSE') IS_SESSION_MODIFIABLE,
    decode(bitand(a.ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',3,'IMMEDIATE','FALSE') IS_SYSTEM_MODIFIABLE
FROM   x$ksppi a,
       x$ksppcv b,
       x$ksppsv c
WHERE  a.indx = b.indx
AND    a.indx = c.indx
AND    a.ksppinm LIKE '/_%' escape '/'
AND    a.ksppinm IN ('_optim_peek_user_binds','_optimizer_use_feedback');

SGA, PGA Hit Ratio 상태 정보 조회

-- SGA, PGA Hit Ratio 상태 정보
SELECT 
    'SHARED_POOL_SIZE(LIBRARY CACHE)' AS "MEMORY_PARAMETER", 
    ROUND((1-SUM (reloads)/SUM(pins))*100,2) AS "HIT_RATIO"
From V$LIBRARYCACHE
UNION ALL
SELECT 
    'SHARED_POOL_SIZE(DATA DICTIONARY)', 
    ROUND((1-SUM(getmisses)/SUM(gets))*100,2)
FROM V$ROWCACHE
UNION ALL
SELECT 
    'DB_CACHE_SIZE',
    ROUND(((1-(SUM(DECODE(name, 'physical reads', value,0)) / 
    (SUM(DECODE(name, 'db block gets', value,0))+(SUM(DECODE(name, 'consistent gets', value, 0))))))*100),2) 
FROM V$SYSSTAT
UNION ALL
SELECT 
    'PGA_AGGREGATE_TARGET',
    ROUND(VALUE,2) 
FROM V$PGASTAT
WHERE NAME = 'cache hit percentage';

Hit Ratio값이 높으면 거의 사용 안한다는 뜻이다. 값이 낮아지면 사용량이 높아지는 거여서 확인하면서 메모리 값을 변경해야 한다.

참고

https://www.youtube.com/watch?v=aBBgIYxKSkE&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=3 

 

728x90

+ Recent posts