백업 중에는 hot백업과 cold백업 두 가지가 있다.
hot 백업이란 데이터베이스가 온라인 상태 즉 서버가 켜저 있는 상태에서 백업 받는 것을 hot backup이라고 한다.
cold백업 이란 데이터베이스가 오프라인 상태여서 session이 데이터베이스에 엑세스 할 수 없고,
데이터베이스의 변경이 없어 데이터를 복사하기에 가장 안전한 방법이다.
하지만 백업중 데이터베이스에 엑세스 할 수 없기 때문에 다운타임을 수반한다.
이번 포스트에서는 oracle cold백업 과정에 대해 알아보자.
예제) ※
A라는 서버에 orcl과 orcldev라는 DB instance가 2개 기동되어 있다고 가정하자.
이때 orcl의 DB와 orcldev라는 DB를 동일하게 맞춰주기 위해
orcl의 DB를 cold백업 후 -> orcldev에 복구하는 방법에 대해 설명하겠다.
1.사전작업
1-1. orcldev init파일 백업
export ORACLE_SID=orcldev
sqlplus "/as sysdba"
create pfile = 'C:\WINDOWS.X64_193000_db_home\dbs\initORCLDEV.ora_20240228' from spfile;
orcldev는 spfile로 기동되어있고, orcldev의 spfile을 pfile로 백업받는다. 물론 pfile로 기동되어있다면 OS상에서 pfile을 백업받는다.
1-2. orcldev control 파일을 백업
alter database backup controlfile to trace as 'C:\WINDOWS.X64_193000_db_home\control_trace\control.trc_20240228';
orcldev의 control파일을 백업받는다.
1-3. orcldev의 control file, redo log file, datafile을 삭제하는 스크립트 작성
SELECT name, value
FROM "V$PARAMETER"
WHERE name = 'control_files';
위 sql문을 통해서 control file의 위치를 확인 할 수 있다.
중요*) value에 있는 ctl파일을 지우는 스크립트 작성 or 위치를 기억해놓는다.
SELECT *
FROM v$logfile;
위 sql문을 통해서 redo log file의 위치를 확인 할 수 있다.
중요*) member에 위치한 log파일을 지우는 스크립트 작성 or 위치를 기억해놓느다.
select *
from dba_data_files;
위 sql문을 통해서 datafile의 위치를 확인 할 수 있다.
중요*) 지우는 스크립트 작성 or 위치를 기억한다.
2. 본 작업
2-1. orcl, orcldev 리스너 stop
lsnrctl stop li_orcl
lsnrctl stop li_orcldev
Window에서는 cmd, Linux에서는 bash에서 위의 커맨드를 사용해서 orcl과 orcldev의 리스너를 중지한다
2-2. orcl, orcldev DB종료
set %ORACLE_SID%=orcl
sqlplus "/as sysdba"
shutdown immediate
cmd에서 orcl로 변경해준후 DB를 종료한다.
set %ORACLE_SID%=orcldev
sqlplus "/as sysdba"
shutdown immediate
cmd에서 orcldev로 변경해준후 DB를 종료한다.
2-3. orcldev 의 control file, redo log file, dartafile삭제
1-3에서 기억한 위치에 file을 모두 지운다. (orcldev의 파일을 지운다는 것을 꼭 명심해라)
2-4. orcl의 datafile을 전부 복사해서 orcldev의 datafile위치에 붙여넣는다.
예를들어 orcl의 datafile이
C:\APP\ORADATA\ORCL
밑에 모두 저장되어 있다고 한다.
orcldev의 datafile은 기존에
C:\APP\ORADATA\ORCLDEV
밑에 모두 저장되어있다. orcl의 datafile을 orcldev로 복사를 한다.
2-5. 1-2에서 백업한 control trace파일로 control파일 생성 script를 작성하여 실행
C:\WINDOWS.X64_193000_db_home\control_trace\control.trc_20240228
파일을 실행하면 case 2부분중 아래 부분을 .sql파일로 저장한다.
각각의 설정값은 DB서버마다 다를 수 있으니 꼭 백업을 해서 그 값을 가져가야한다.
중요※) redo log파일은 새로 생성할 것이기 때문에 필요한 위치에다가 지정을 할 것.
중요※) datafile은 현재 생성된 datafile을 꼭 똑같이 작성해줘야한다.
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'C:\APP\ORADATA\ORCLDEV\ONLINELOG\O1_MF_1_LWVB1V23_.LOG',
'C:\APP\FAST_RECOVERY_AREA\ORCLDEV\ONLINELOG\O1_MF_1_LWVB1V84_.LOG'
) SIZE 200M BLOCKSIZE 512,
GROUP 2 (
'C:\APP\ORADATA\ORCLDEV\ONLINELOG\O1_MF_2_LWVB1V2T_.LOG',
'C:\APP\FAST_RECOVERY_AREA\ORCLDEV\ONLINELOG\O1_MF_2_LWVB1V96_.LOG'
) SIZE 200M BLOCKSIZE 512,
GROUP 3 (
'C:\APP\ORADATA\ORCLDEV\ONLINELOG\O1_MF_3_LWVB1V38_.LOG',
'C:\APP\FAST_RECOVERY_AREA\ORCLDEV\ONLINELOG\O1_MF_3_LWVB1V9W_.LOG'
) SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'C:\APP\ORADATA\ORCLDEV\DATAFILE\O1_MF_SYSTEM_LWV9W1TL_.DBF',
'C:\APP\ORADATA\ORCLDEV\DATAFILE\O1_MF_SYSAUX_LWV9WTYY_.DBF',
'C:\APP\ORADATA\ORCLDEV\DATAFILE\O1_MF_UNDOTBS1_LWV9XB3Y_.DBF',
'C:\APP\ORADATA\ORCLDEV\DATAFILE\O1_MF_USERS_LWV9XC7C_.DBF'
CHARACTER SET AL32UTF8
;
위 sql문을 'create_control.sql'로 저장한다.
이제 orcldev로 DB를 nomount기동하여 진행할것이다.
set ORACLE_SID=orcldev
sqlplus "/as sysdba"
위 스크립트를 통해 orcldev로 sqlplus접속을 한다.
startup nomount pfile='C:\WINDOWS.X64_193000_db_home\dbs\initORCLDEV.ora_20240228'
※ 1-1.에서 백업한 pfile로 nomount한다.
@create_control.sql
방금 작성한 create_control.sql을 실행한다.
2-6. orcldev DB recover 수행
recover database using backup controlfile until cancel;
cancel
위 SQL문을 통해 orcldev Recover를 수행한다.
2-7. orcldev DB open 수행 및 재기동
alter database open resetlogs;
shutdown immediate
startup
위 SQL문을 통해 orcldev의 DB를 기동한다.
2-8. orcldev의 default temp tablespace수정
temp tablespace를 생성하지 않았기 때문에 temp tablespace는 없는 상태이다
따라서 새로 만들어주어야하는데 기존에 orcl의 temp tablespace의 값을 가지고 있기 때문에 temp tablespace의 temp file을 만들고
default temp tablespace를 수정해줘야 한다.
/* default temp tablespace확인*/
select distinct TEMPORARY_TABLESPACE from dba_users;
select * from sys.props$ where name = 'DEFAULT_TEMP_TABLESPACE';
--> 결과 : TEMP
위 결과가 TEMP로 나왔기 때문에 TEMP1을 생성해줘서 TEMP1로 옮겨준다
-- TEMP1 temptablespace 및 TEMP파일 생성
create temporarytablespacee TEMP1 tempfile 'C:\app\oradata\temp\temp01.dbf' size 30G;
-- default temp tablespace를 TEMP1로 변경
alter database default temporary tablespace TEMP1;
-- TEMP drop
drop tablesapce TEMP;
/* default temp tablespace변경된것 확인*/
select distinct TEMPORARY_TABLESPACE from dba_users;
select * from sys.props$ where name = 'DEFAULT_TEMP_TABLESPACE';
--> 결과 TEMP1
2-9. spfile로 기동되었는지 확인하고 기동이 되어 있지않으면 재기동
show parameter pfile
위 SQL문을 통해
값이 들어있으면 spfile을 사용하는 것이고,
값이 없으면 pfile을 사용하는 것이다.
2-10. orcl DB 기동
set ORACLE_SID=orcl
sqlplus "/as sysdba"
startup
orcl DB로 변경해서 기동시켜준다
2-11. orcl, orcldev listener기동
lsnrcrtl start orcl
lsnrctl start orcldev
'DB (데이터베이스) > Oracle (오라클)' 카테고리의 다른 글
[Oracle] Oracle UTL_SMTP페키지로 메일 전송하기 (0) | 2024.05.03 |
---|---|
[Oracle] oracle patition의 high_value기준으로 조회하기 (0) | 2024.05.03 |
[Oracle] 리눅스 awk와 grep으로 oracle의 alert log찾기 (0) | 2024.03.19 |
[Oracle] oracle temp tablespace 변경 (0) | 2024.03.17 |
[Oracle] oracle 리스터 포트 변경방법 (0) | 2024.03.15 |