[DB full restore shell 만들기]
# full_restore.sh
#!/bin/sh
# 김성현이 만들었습니다
# 사용 설명
# 가장 먼저 DB가 꺼져있는지 확인한다.
# 백업본이 있는 디렉터리 경로 입력하면 그 디렉터리 안에 있는
# pfile의 내용을 읽어서 control_files의 경로를 알아낸다.
# 그 후 .ctl 파일들을 해당 경로로 cp한다.
# 이제 mount가 가능하니 DB startup mount 상태로 변경
# controlfile을 이용해서 datafile, redo log file의 경로를 확인한다.
# 해당 경로에 datafile과 redo log file을 cp한다.
# alter database open으로 DB open
# 아쉬운 부분은 datafile, redo log file 경로 확인할 때 각각 확인하지 않고
# 그냥 다 같은 경로겠지라는 안일한 마인드로 갖다박아서 경로가 다 다른
# 경우에는 오류날 거임...
# parameter file 백업 시에 pfile spfile 동기화 안시키셨으면 오류날 거에요.
# 제가 만든 백업쉘로 백업본 만든 경우는 괜찮습니당.
# 0. DB shutdown된 상태인지 확인하기
sqlplus -s / as sysdba << _eof_ > ~/db_status.tmp
set head off
select status from v\$instance;
_eof_
grep OPEN ~/db_status.tmp > /dev/null
if [ $? -ne 0 ]
then
echo "DB shutdown 상태인걸 확인"
else
echo "DB OPEN 상태입니다. DB shutdown 후에 실행시켜주세요"
exit 1
fi
rm -rf ~/db_status.tmp
# 1. backup directory 경로 입력받기
echo -n "backupdir 경로를 절대경로로 정확히 입력 : "
read backup_dir
# 입력받은 경로가 유효한 지 확인
#if [ -d backup_dir ]
#then
# echo
#else
# echo "입력한 경로가 디렉터리가 아닙니다"
# exit 1
#fi
# 2. parameter file들을 db1 디렉터리에 옮기기
cp $backup_dir/*.ora ${ORACLE_HOME}/dbs
# 2. backup본의 pfile을 읽어서 controlfile의 경로 확인
control_dir=$(cat $backup_dir/init${ORACLE_SID}.ora | grep control_files=\' | awk -F"'" '{ split($2, arr, "/control"); print arr[1] }')
# 3. controlfile을 알아낸 경로에 복사
cp $backup_dir/*.ctl $control_dir
echo "controlfile restore 완료"
# 4. DB startup mount
echo
echo "DB startup mount 중..."
echo
sqlplus -s / as sysdba << _eof_
startup mount
_eof_
# 5. datafile, redo log file의 경로 확인
# datafile
sqlplus -s / as sysdba << _eof_ > ~/datafile.tmp
select name from v\$datafile where rownum=1;
_eof_
data_dir=$(cat ~/datafile.tmp | awk -F"/" '{ $NF=""; print $0 }' OFS="/")
rm -rf ~/datafile.tmp
# redo log file
sqlplus -s / as sysdba << _eof_ > ~/logfile.tmp
select member from v\$logfile where rownum=1;
_eof_
log_dir=$(cat ~/logfile.tmp | awk -F"/" '{ $NF=""; print $0 }' OFS="/")
rm -rf ~/logfile.tmp
# 6. 해당 경로에 datafile, redo log file cp
cp $backup_dir/*.dbf $data_dir
cp $backup_dir/redo* $log_dir
echo "datafile, redo log file restore 완료"
# 7. alter database open
echo "DB open 상태로..."
sqlplus -s / as sysdba << _eof_
alter database open;
_eof_
echo "full restore 완료"
exit 0
[datafile rename]
물리적으로 datafile 위치를 이동.
datafile online 중에 불가.
주로 디스크 노후화로 인한 교체 작업이나 디스크 장애일 경우 발생.
1. DB online 상태에서 작업
– tablespace, datafile 단위 offline 후 rename 가능
– offline이 불가능한 tablespace의 경우는 rename불가
2. DB offline 상태에서 작업
– mount 단계에서 진행
– system, undo, temp tablespace는 offline이 불가하므로 반드시 DB shutdown->mount 단계에서 진행가능
[실습 – 일반 tablespace rename(경로 변경)]
DB open상태에서 작업.
순서 : offline->mv->rename->online
1. 현 상태 확인/조회
select b.name as tablespace_name,
a.name as datafile_name,
a.checkpoint_change#,
a.status
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;
2. tablespace offline
alter tablespace users offline;
-- normal mode (정상적으로 DBWR가 동작하므로 online 시 복구 필요없음)
3. 물리적 파일 이동
$ mkdir -p /home/oracle/oradata/db1
$ cp /oracle12/app/oracle/oradata/db1/users01.dbf /home/oracle/oradata/db1
4. datafile rename
alter database rename file '/oracle12/app/oracle/oradata/db1/users01.dbf' to '/home/oracle/oradata/db1/users01.dbf';
-- 조회해보면 경로가 바뀌었다.
5. tablespace online
alter tablespace users online;
6. 기존 파일 삭제
$ rm /oracle12/app/oracle/oradata/db1/users01.dbf
[실습 – 시스템 영역 tablespace rename(경로 변경)]
offline이 불가능해서 DB mount단계에서 작업
순서 : shutdown immediate->cp(물리적 파일 이동)->startup mount->datafile rename->db open
0. 조회 쿼리
-- temp 뺀 datafile 조회 쿼리
select b.name as tablespace_name,
a.name as datafile_name,
a.checkpoint_change#,
a.status
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;
-- temp.dbf 조회 쿼리
select name from v$tempfile;
1. db shutdown immediate
2. datafile cp
$ cp /oracle12/app/oracle/oradata/db1/system01.dbf /home/oracle/oradata/db1
$ cp /oracle12/app/oracle/oradata/db1/sysaux01.dbf /home/oracle/oradata/db1
$ cp /oracle12/app/oracle/oradata/db1/undotbs01.dbf /home/oracle/oradata/db1
$ cp /oracle12/app/oracle/oradata/db1/temp01.dbf /home/oracle/oradata/db1
3. startup mount
4. datafile rename
alter database rename file '/oracle12/app/oracle/oradata/db1/system01.dbf'
to '/home/oracle/oradata/db1/system01.dbf';
alter database rename file '/oracle12/app/oracle/oradata/db1/sysaux01.dbf'
to '/home/oracle/oradata/db1/sysaux01.dbf';
alter database rename file '/oracle12/app/oracle/oradata/db1/undotbs01.dbf'
to '/home/oracle/oradata/db1/undotbs01.dbf';
alter database rename file '/oracle12/app/oracle/oradata/db1/temp01.dbf'
to '/home/oracle/oradata/db1/temp01.dbf';
5. db open
alter database open;
6. 기존 datafile 삭제
$ rm /oracle12/app/oracle/oradata/db1/*.dbf
[실습 – redo log file rename(경로 변경)]
순서 : shutdown immediate->file cp->startup mount->rename->db open
0. 조회
select a.group#,
a.member,
b.bytes/1024/1024 as "SIZE(MB)",
b.archived,
b.status
from v$logfile a, v$log b
where a.group#=b.group#
order by 1,2;
1. shutdown immediate
2. redo log file cp
$ cp /oracle12/app/oracle/oradata/db1/redo01.log /home/oracle/oradata/db1/
$ cp /oracle12/app/oracle/oradata/db1/redo02.log /home/oracle/oradata/db1/
$ cp /oracle12/app/oracle/oradata/db1/redo03.log /home/oracle/oradata/db1/
또는
$ cp /oracle12/app/oracle/oradata/db1/redo* /home/oracle/oradata/db1/
3. startup mount
4. redo log file rename
alter database rename file '/oracle12/app/oracle/oradata/db1/redo01.log' to '/home/oracle/oradata/db1/redo01.log';
alter database rename file '/oracle12/app/oracle/oradata/db1/redo02.log' to '/home/oracle/oradata/db1/redo02.log';
alter database rename file '/oracle12/app/oracle/oradata/db1/redo03.log' to '/home/oracle/oradata/db1/redo03.log';
5. alter database open;
6. 기존파일 삭제
[실습 – controlfile rename(경로 변경)]
순서 : controlfile rename->shutdown immediate->file cp->startup
0. 조회 쿼리
select * from v$controlfile;
1. controlfile rename
alter system set control_files = '/home/oracle/oradata/db1/control01.ctl', '/home/oracle/oradata/db1/control02.ctl' scope = spfile;
2. shutdown immediate
3. controlfile cp
$ cp /oracle12/app/oracle/oradata/db1/control* /home/oracle/oradata/db1
4. startup
5. 기존 파일 삭제
[offline full backup]
만들어뒀던 shell 조금만 수정하면 될 듯?|
수정할 필요도 없이 그냥 그대로 돌리면 되네 ㅋㅋ 역시 쉘 최고
[20241129 백업본으로 offline full restore 시]
parameter file -> controlfile의 경로 가짐.
controlfile -> datafile과 redo log file의 경로 가짐.
controlfile, datafile, redo log file 모두 /home 영역으로 restore
parameter file은 $ORACLE_HOME/dbs에 restore
[20241126 백업본으로 offline full restore 시]
controlfile, datafile, redo log file 모두 /oracle12 영역으로 restore
parameter file은 $ORACLE_HOME/dbs에 restore
[복구 순서]
parameter file restore -> controlfile 경로 확인 -> mount -> datafile, redo log file restore