외부에서 DB접속 불가 시 check
1. DB가 정상인지 확인
sqlplus system/oracle@자기자신tns
-- 이거 접속 잘 되면 무조건 DB쪽 잘못은 아니고 사용자쪽임.
2. client쪽에서 tnsnames.ora 확인
3. 방화벽 확인 (네트워크 담당자)
[증분 백업 Incremental backup]
full backup과는 다르게 이전 백업파일을 기준으로 변경된 블럭만 압축하여 백업을 받는 방식.
백업 속도 개선.
백업 용량 효율적 관리 (압축함) -> 보관 비용 절약
레벨을 사용하여 백업 계획
** 레벨
– 증분 백업을 받는 기준 설정
– 현재 레벨보다 작거나 같은 레벨의 이후 변경된 블럭을 백업함
1) 0레벨
– full backup을 의미.
2) 1레벨
– 0레벨 백업셋 이후에 변경된 블럭만 백업.
3) 2레벨
– 1레벨 백업셋 이후에 변경된 블럭만 백업.
** 명령어
backup incremental level 0 database;
backup incremental level 0 database format ‘/home/oracle/backup/db_&U’;
backup incremental level 1 database;
backup incremental level 1 database format ‘/home/oracle/backup/db_&U’;
[RMAN 증분 백업을 사용한 복구(물리장애)]
1. oel8copy에서 0레벨 증분 백업 진행
backup incremental level 0 database;
-- tag=TAG20250122T110440
2. 테이블 생성
create table recover_test200(no number);
insert into recover_test200 values(1000);
insert into recover_test200 values(2000);
insert into recover_test200 values(3000);
commit;
alter system checkpoint;
3. 1레벨 증분 백업
backup incremental level 1 for recover of copy with tag 'tag_recover_test1' database;
list backup;
list backup of database summary;
5. 로그 스위치 5번
alter system switch logfile;
6. 장애 발생
select 'rm '||file_name from dba_data_files;
------------------
rm /oracle19/app/oracle/oradata/ORA19DB/system01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/sysaux01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/undotbs01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/users01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf
7. db shutdown abort
8. 복구
startup mount;
run {
restore database from tag TAG20250122T110440;
recover database from tag tag_recover_test1;
recover database;
sql 'alter database open';
}
-- 0 level backupset tag
-- 1 level backupset tag
-- archive를 사용한 recover
8. 데이터 확인
select * from system.recover_test200;
[RMAN 증분 백업을 사용한 복구 (논리 장애)]
ORA19DB에서 테이블 truncate 발생. (증분백업 상황 가정)
-> recoverdb 서버에 새로운 복구 DB 구축 후 시점 복구 진행
-> ora19db -> recover dblink를 통한 데이터 이관
사전준비
1. recoverdb 용 리스너 구성
1. listener.ora 수정
vi $ORACLE_HOME/network/admin/listener.ora
---------------------------------------------------
LISTENER_RECOVERDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = recoverdb)(PORT = 1521))
)
)
2. tnsnames.ora 수정
RECOVERDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = recoverdb)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora19db)
)
)
LISTENER_RECOVERDB =
(ADDRESS = (PROTOCOL = TCP)(HOST = recoverdb)(PORT = 1521))
3. 로컬리스너 추가
alter system set local_listener = LISTENER_RECOVERDB scope = both;
show parameter local_listener
4. 리스너 start
lsnrctl start LISTENER_RECOVERDB
2. ora19db -> recoverdb dblink 생성
1. /etc/hosts 수정
172.16.124.135 recoverdb
2. ora19db의 tnsnames.ora 수정
RECOVERDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = recoverdb)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora19db)
)
)
3. dblink 생성
create public database link dblink_recoverdb connect to system identified by oracle using 'RECOVERDB';
복구 실습
0. 양쪽서버 모두에서 기존 백업 / 아카이브 삭제
편하게 scp로 보내기 위해서
rm /oracle19/backup/ora19db/*
rm /oracle19/arch/*
> delete backupset;
1. 0레벨 백업
configure controlfile autobackup format for device type disk to '/oracle19/backup/ora19db/%F';
configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
backup incremental level 0 database;
-- tag=TAG20250122T131249
select sysdate from dual;
-- 2025/01/22 13:14:10
2. 테이블 생성
create table recover_test300(no number);
insert into recover_test300 values(300);
insert into recover_test300 values(400);
insert into recover_test300 values(500);
commit;
alter system checkpoint;
3. 1레벨 백업
backup incremental level 1 for recover of copy with tag 'tag_recover_test1' database;
list backup;
list backup of database summary;
4. 장애 발생
select sysdate from dual;
-- 2025/01/22 14:13:42
truncate table recover_test300;
alter system switch logfile;
5. copydb (recoverdb) 를 사용한 복구를 위해 파일 전송하기
** 필요 파일
– parameter file
– archive file
– backup file
create pfile='/home/oracle/backup/init.ora' from spfile;
scp /home/oracle/backup/* oracle@recoverdb:/home/oracle/backup
scp /oracle19/arch/* oracle@recoverdb:/oracle19/arch
scp /oracle19/backup/ora19db/* oracle@recoverdb:/oracle19/backup/ora19db
6. recoverdb에서 복구
1) init.ora 수정하기
* 수정대상
- 로그위치 수정(실제 물리적인 디렉토리도 생성돼야 함)
- controlfile 위치 수정
- 아카이브 위치 수정
- ORA19DB로 시작하는 모든 파라미터 삭제
- local_listener 설정 삭제
- pluggable 설정 유지
mv /home/oracle/backup/init.ora /home/oracle/backup/initrecoverdb.ora
vi /home/oracle/backup/initrecoverdb.ora
--------------------------------------
*.audit_file_dest='/oracle19/recover/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/oracle19/recover/data/control01.ctl'
*.db_block_size=8192
*.db_name='ora19db'
*.diagnostic_dest='/oracle19/recover'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora19dbXDB)'
*.enable_pluggable_database=true
*.log_archive_dest_1='location=/oracle19/arch'
*.memory_target=1192m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
----------------------------------------
cp initrecoverdb.ora $ORACLE_HOME/dbs
2) nomount
export ORACLE_SID=recoverdb
startup nomount
3) controlfile restore - 0레벨 controlfile!
RMAN> restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250122-04';
4) mount
alter database mount;
5) restore & recover
catalog start with '/oracle19/backup/ora19db';
-- 아래 이거 맞나? 모름...
run {
allocate channel ch1 device type disk ;
allocate channel ch2 device type disk ;
set newname for tempfile 1 to '/oracle19/recover/data/temp01.dbf';
set newname for datafile 1 to '/oracle19/recover/data/system01.dbf';
set newname for datafile 3 to '/oracle19/recover/data/sysaux01.dbf';
set newname for datafile 4 to '/oracle19/recover/data/undotbs01.dbf';
set newname for datafile 5 to '/oracle19/recover/data/pdbseed/system01.dbf';
set newname for datafile 6 to '/oracle19/recover/data/pdbseed/sysaux01.dbf';
set newname for datafile 7 to '/oracle19/recover/data/users01.dbf';
set newname for datafile 8 to '/oracle19/recover/data/pdbseed/undotbs01.dbf';
set newname for datafile 9 to '/oracle19/recover/data/orapdb/system01.dbf';
set newname for datafile 10 to '/oracle19/recover/data/orapdb/sysaux01.dbf';
set newname for datafile 11 to '/oracle19/recover/data/orapdb/undotbs01.dbf';
set newname for datafile 12 to '/oracle19/recover/data/orapdb/users01.dbf';
set newname for datafile 13 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf';
set newname for datafile 14 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf';
restore datafile 1,3,4,5,6,7,8,9,10,11,12,13,14;
switch datafile all;
switch tempfile all;
}
restore database from tag TAG20250122T131249;
run {
set until time "to_date('2025/01/22 14:13:42', 'YYYY/MM/DD HH24:MI:SS')";
recover database from tag tag_recover_test1;
recover database;
}
-- 위에 잘 안되면
run {
set until time "to_date('2025/01/22 14:13:42', 'YYYY/MM/DD HH24:MI:SS')";
restore database from tag TAG20250122T131249;
recover database from tag tag_recover_test1;
recover database;
}
6) open
alter database open resetlogs;
7. 조회
select * from system.recover_test300;
[Multi-Tenant DB]
하나의 인스턴스에 데이터를 분리하여 여러 DB를 구성하기 위한 아키텍처.
새로운 DB를 쉽게 생성, 삭제 가능함.
각 DB들이 공유 자원을 사용하므로 자원 사용이 효율적임.
1. CDB (container DB)
– sqlplus / as sysdba로 접속할 수 있는 main DB
– 여러 PDB를 관리
– 공통 인프라(메모리, 프로세스, 로그 파일 등을 공유)
– 공통 인프라를 사용하여 여러 개의 DB를 관리할 수 있기 때문에 자원을 보다 효율적으로 사용할 수 있음
2. PDB (pluggable DB)
– CDB와 다르게 개별적으로 분리된 DB. 보통 업무용 DB
– CDB에서 간단하게 생성/해제 가능
– 각 PDB마다 독립적인 스키마 생성, 운영
– PDB 템플릿을 사용하여 새로운 PDB 생성이 용이
1. CDB datafile 조회
select * from dba_data_files;
2. 전체 datafile 조회
select file#, name, bytes/1024/1024
from v$datafile
order by 2;
-----------------------
-- PDB
/oracle19/app/oracle/oradata/ORA19DB/orapdb/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/system01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/undotbs01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/users01.dbf
-- pdbseed = template
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/system01.dbf
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/undotbs01.dbf
-- CDB datafile
/oracle19/app/oracle/oradata/ORA19DB/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/system01.dbf
/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf
/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf
/oracle19/app/oracle/oradata/ORA19DB/undotbs01.dbf
/oracle19/app/oracle/oradata/ORA19DB/users01.dbf
** 아키텍처 architecture
1. 공유 구성 요소
– 시스템 자원 (cpu, memory, process 등)
– 인스턴스 (SGA)
– 백그라운드 프로세스
– parameter file / controlfile / redo log file
2. 독립 구성 요소
– datafile only
– 스키마, 유저 정보
1. CDB/PDB 조회
1. CDB(기본 접속 DB)
sqlplus / as sysdba
show con_name
CON_NAME
------------------------------
CDB$ROOT
2. PDB
col name format a10
col open_mode format a10
select name, open_mode from v$pdbs;
NAME OPEN_MODE
---------- ----------
PDB$SEED READ ONLY
ORAPDB MOUNTED
2. PDB open
PDB는 최초 설치 후 상태가 mounted 이므로 사용을 원하면 open해줘야 함
alter pluggable database ORAPDB open;
select name, open_mode from v$pdbs;
NAME OPEN_MODE
---------- ----------
PDB$SEED READ ONLY
ORAPDB READ WRITE
-- READ WRITE가 open상태라는 뜻
3. PDB 접속 (CDB를 통한 접속)
alter session set container=ORAPDB;
show con_name
CON_NAME
------------------------------
ORAPDB
select * from system.recover_test1; -- CDB에서 생성한 데이터는 PDB에서 조회 불가
4. PDB 접속 (직접 접속)
1. tns 이용하는 방
1-1. tnsnames.ora에 내용 추가
vi tnsnames.ora
ORAPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oel8copy)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orapdb)
)
)
1-2. 접속
sqlplus system/oracle@orapdb
show con_name
CON_NAME
------------------------------
ORAPDB
2. easy connect
sqlplus system/oracle@localhost:1521/orapdb
show con_name
show con_name
CON_NAME
------------------------------
ORAPDB
[PDB 생성]
기존 템플릿을 사용한 PDB 생성
1. 템플릿 확인
select name from v$pdbs;
NAME
--------------------------------------------------------------------------------
PDB$SEED -- 얘가 기본으로 제공되는 템플릿
ORAPDB
2. 템플릿 위치 확인
select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle19/app/oracle/oradata/ORA19DB/system01.dbf
/oracle19/app/oracle/oradata/ORA19DB/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/undotbs01.dbf
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/system01.dbf -- /pdbseed/ 하위에 생성됨
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/users01.dbf
/oracle19/app/oracle/oradata/ORA19DB/pdbseed/undotbs01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/system01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/sysaux01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/undotbs01.dbf
/oracle19/app/oracle/oradata/ORA19DB/orapdb/users01.dbf
/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf
/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf
3. 새로운 PDB 생성 (CDB에서 작업)
create pluggable database orapdb2 admin user scott identified by oracle file_name_convert=('/pdbseed/', '/pdbseed2/');
4. 접속
alter session set container=orapdb2;
show con_name
col name format a10
col open_mode format a10
select name, open_mode from v$pdbs;
NAME OPEN_MODE
---------- ----------
ORAPDB2 MOUNTED
5. PDB open
alter pluggable database orapdb2 open;
select name, open_mode from v$pdbs;
NAME OPEN_MODE
---------- ----------
ORAPDB2 READ WRITE
6. (생략 가능) tnsnames.ora 수정해서 접속하기
sqlplus scott/oracle@orapdb2
PDB 2개 모두 listener 설정해서 외부접속 가능하게 하기
-- windows의 tnsnames.ora 파일 수정
ORAPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.124.134)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orapdb)
)
)
ORAPDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.124.134)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orapdb2)
)
)