■ user managed - backup

YoonSeo Park ·2024년 2월 3일

아카이브,노아카이브모드 모드

■ noarchive log mode

  • 기본적으로 데이터베이스는 noarchive log mode 로 생성됩니다.
  • redo log file이 순환 방식으로 사용된다.
  • log switch 발생하면 checkpoint 발생한 즉시 redo log file은 재사용할 수 있다.
  • redo log 가 겹쳐쓰여지면 마지막 전체 backup 에 대해서만 media recovery 를 할 수 있다.
    안전 복구 보다는 불안전한 복구 방식을 수행 할 경우가 많다.
  • 데이터베이스 정상적인 종료한 후 백업을 수행 해야 한다.
    shutdown (normal|transactional|immdiate)
  • backup 할 때마다 datafile,tmepfile,controlfile,redo log file(옵션)

■ archive log mode

  • log switch 발생하면 checkpoint가 발생하고 ARC background process 가 현재 redo log file 을
    물리적 다른 위치에 복사 한 후 redo log file은 재사용할 수 있다.
  • control file에 archive 된 redo log file의 정보를 기록한다.
  • 데이터베이스 정상적인 종료 한 후 백업을 수행할 수 있고 운영중에 백업을 수행 할 수 있다.
  • 일관성 없는 백업, online backup, hot backup, open backup을 수행할 수 있다.
  • 문제되는 파일을 현재 시점까지 복구 할 수 있다. redo log 정보가 있기 때문에 가능하다.

아카이브 모드 위치확인, 변경

▶ archive log file이 생성 되는 위치 설정

  • archive disk를 이중화 해놓았다.
  • mandatory
    : archive 작업이 성공적으로 완료되어야 online redo log file을 겹쳐 사용할 수 있다.
    공간이 부족할 경우 wait 한다.
alter system set log_archive_dest_1='location=/home/oracle/arch1 mandatory' scope=spfile;
  • optional
    : archive 작업이 성공적으로 완료 되지 않은 경우에도 online redolog file을 겹쳐사용할 수 있다. (기본값)
    공간이 부족하면 archivelog file이 생성 되지 않습니다.
alter system set log_archive_dest_2='location=/home/oracle/arch2 optional' scope=spfile;
  • archivelog file의 여유 공간을 항상 확인해줘야한다.
[oracle@oracle ~]$ df -h
/dev/mapper/ol-root   45G   24G   21G  54% /
  • archive log file이 생성 될때 이름 포맷을 설정
    %s : log sequence number
    %t : thread number (instance number)
    %r : resetlogs id 여러 데이터베이스에 걸쳐 아카이브 된 로그파일의 유일한 이름을 나타낸다.
alter system set log_archive_format='arch_%t_%s_%r.arc' scope=spfile;
  • 만약 archive log mode 상태에서 archive log file이 생성 되는 위치 설정을 같은곳에하거나 잘못설정하거나 archive log file이 생성 될때 이름 포맷을 설정을 잘못하면 db mount 단계까지도 start 안된다.
  • 해결방법
  1. db 정상종료
  2. pfile을 이용하여 archive log file 위치정보, 포맷설정 변경
  3. db open
  4. create spfile from pfile;
  5. db 재시작

▶ archive log mode 로 변경

● 1. db 정상 종료

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

● 2. mount 단계까지만 db start (control file까지만 열기)

SQL> startup mount
ORACLE instance started.

Total System Global Area  531476480 bytes
Fixed Size                  1365796 bytes
Variable Size             201328860 bytes
Database Buffers          322961408 bytes
Redo Buffers                5820416 bytes
Database mounted.

● 3. archive log mode로 변경

SQL> alter database archivelog;

Database altered.
  • noarchive log mode로 변경하고 싶으면
SQL> alter database noarchivelog;

● 4. db open

SQL> alter database open;

Database altered.

● 5. archive log mode 확인

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /home/oracle/arch2
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

  • redo log file 확인
select * from v$log;
  • archive log dest 정보 확인
select * from v$archive_dest;
-- 보통 3개 정도 본다
select destination, binding, status from v$archive_dest;
  • archive log 조회
select * from v$archived_log;

현재의 current한 redo 로그 파일을 아카이브(log_archive_dest에 지정된 위치로) 변경

alter system archive log current;
  • log_archived 확인
select sequence#, name from v$archived_log;

[oracle@oracle ~]$ ls /home/oracle/arch1 /home/oracle/arch2
/home/oracle/arch1:
arch_1_3_1157971653.arc

/home/oracle/arch2:
arch_1_3_1157971653.arc
  • ※ 주의사항
    만약에 db 운영중에 arc file이 유실 되었다는것을 알았다면 그 즉시 backup본을 만들어야한다. 만약 유실되었다는것을 모르고 만들지않고 db 종료하면, 완전복구를 못하므로 과거시점으로 restore해서 돌아가는 방법밖에 없다.
  • 아카이브 프로세스에 관한 세부 정보를
select * from v$archive_processes;
SQL> ! ps -ef | grep arc
oracle    7843     1  0 19:26 ?        00:00:00 ora_arc0_ora11g
oracle    7846     1  0 19:26 ?        00:00:00 ora_arc1_ora11g
oracle    7848     1  0 19:26 ?        00:00:00 ora_arc2_ora11g
oracle    7850     1  0 19:26 ?        00:00:00 ora_arc3_ora11g
oracle   13351 23064  0 20:51 pts/0    00:00:00 /bin/bash -c  ps -ef | grep arc
oracle   13353 13351  0 20:51 pts/0    00:00:00 grep arc

▶ 아카이브 조회

  • 아카이브 로그의 저장 위치1 조회
select * from v$parameter where name = 'log_archive_dest_1';
  • 아카이브 로그의 저장 위치1 조회
select * from v$parameter where name = 'log_archive_dest_2';
  • 아카이브 로그 파일의 형식 조회
select * from v$parameter where name = 'log_archive_format';

백업 (cold backup, hot backup)

  • 필수 백업
  1. datfile
  2. controlfile

■ 일관성 있는 백업 (cold backup) 시나리오

● 1. 백업 대상 확인

  • cold backup 대상 data file,temp file,control file, redolog file
select * from v$log;
select name, checkpoint_change#, status from v$datafile;
select tablespace_name, logging from dba_tablespaces;

select name from v$tempfile;
select name from v$controlfile;
select member from v$logfile;

● 2. 백업 쉘 쿼리문 작성
데이터파일, 컨트롤파일 필수, 다른것은 옵션

  • 쿼리문 작성
select 'cp -av '||name||' /home/oracle/backup/arch/cold_20240112/' from v$datafile
union all
select 'cp -av '||name||' /home/oracle/backup/arch/cold_20240112/' from v$tempfile
union all
select 'cp -av '||name||' /home/oracle/backup/arch/cold_20240112/' from v$controlfile
union all
select 'cp -av '||member||' /home/oracle/backup/arch/cold_20240112/' from v$logfile;
cp -av /u01/app/oracle/oradata/ora11g/system01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/sysaux01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/users01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/example01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/undotbs01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/temp_new01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/control01.ctl /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo03.log /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo02.log /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo01.log /home/oracle/backup/arch/cold_20240112/

● 3. 초기 파라미터 파일 백업

create pfile ='/home/oracle/backup/arch/cold_20240112/initora11g_20240112.ora' from spfile;

● 4. 백업 디렉토리 생성

SQL> ! mkdir -p /home/oracle/backup/arch/cold_20240112/
[oracle@oracle ~]$ ls /home/oracle/backup/arch/cold_20240112/
initora11g_20240112.ora

● 5. db 정상종료

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !

● 6. 새로운 디렉토리에 백업쉘 실행

[oracle@oracle ~]$ cd /home/oracle/backup/arch/cold_20240112/
[oracle@oracle cold_20240112]$ ls
initora11g_20240112.ora
[oracle@oracle cold_20240112]$ vi backup.sh
-- 입력
cp -av /u01/app/oracle/oradata/ora11g/system01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/sysaux01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/users01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/example01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/undotbs01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/temp_new01.dbf /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/control01.ctl /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo03.log /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo02.log /home/oracle/backup/arch/cold_20240112/
cp -av /u01/app/oracle/oradata/ora11g/redo01.log /home/oracle/backup/arch/cold_20240112/
[oracle@oracle cold_20240112]$ sh backup.sh > backup.log
[oracle@oracle cold_20240112]$ ls
backup.log     initora11g_20240112.ora  sysaux01.dbf    users01.dbf
backup.sh      redo01.log               system01.dbf
control01.ctl  redo02.log               temp_new01.dbf
example01.dbf  redo03.log               undotbs01.dbf

■ 일관성 없는 백업 (online backup, hotbackup, open backup)

● 1. 백업 대상 확인

● 2. 백업 쉘 쿼리문 작성

  • datafile의 백업 상태
select a.file#, a.name, a.checkpoint_change#,
        b.status, b.change#, b.time
from v$datafile a, v$backup b
where a.file#=b.file#;

file# name									checkpoint_change#	status	change#
-------------------------------------------------------------------------------
1	/u01/app/oracle/oradata/ora11g/system01.dbf		1547960	NOT ACTIVE	0	
2	/u01/app/oracle/oradata/ora11g/sysaux01.dbf		1547960	NOT ACTIVE	0	
4	/u01/app/oracle/oradata/ora11g/users01.dbf		1547960	NOT ACTIVE	0	
5	/u01/app/oracle/oradata/ora11g/example01.dbf	1547960	NOT ACTIVE	0	
6	/u01/app/oracle/oradata/ora11g/undotbs01.dbf	1547960	NOT ACTIVE	0	
  • 백업 쉘 쿼리문 작성
select 'cp -av '||name||' /home/oracle/backup/arch/hot_20240112/' from v$datafile
union all
select 'cp -av '||name||' /home/oracle/backup/arch/hot_20240112/' from v$tempfile;
----------------------------------
cp -av /u01/app/oracle/oradata/ora11g/system01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/sysaux01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/users01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/example01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/undotbs01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/temp_new01.dbf /home/oracle/backup/arch/hot_20240112/

● 3. 백업 디렉토리 생성후, 백업 쉘파일 만들기

[oracle@oracle ~]$ cd backup/arch
[oracle@oracle arch]$ mkdir hot_20240112
[oracle@oracle arch]$ cd hot_20240112/
[oracle@oracle hot_20240112]$ vi backup.sh
---
cp -av /u01/app/oracle/oradata/ora11g/system01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/sysaux01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/users01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/example01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/undotbs01.dbf /home/oracle/backup/arch/hot_20240112/
cp -av /u01/app/oracle/oradata/ora11g/temp_new01.dbf /home/oracle/backup/arch/hot_20240112/

● 4. checkpoint의 수위를 맞쳐주고 시작하는것이 좋다. (5번을 실행해서 굳이 할필요는 없다.)

  • checkpoint 변경
alter system checkpoint;
  • 확인
select a.file#, a.name, a.checkpoint_change#,
        b.status, b.change#, b.time
from v$datafile a, v$backup b
where a.file#=b.file#;

● 5. online backup 수행한다고 begin

  • full checkpoint 발생
alter database begin backup;
  • 확인
file# name									checkpoint_change#	status	change#	time
------------------------------------------------------------------------------------
1	/u01/app/oracle/oradata/ora11g/system01.dbf		1549712	ACTIVE	1549712	24/01/11
2	/u01/app/oracle/oradata/ora11g/sysaux01.dbf		1549712	ACTIVE	1549712	24/01/11
4	/u01/app/oracle/oradata/ora11g/users01.dbf		1549712	ACTIVE	1549712	24/01/11
5	/u01/app/oracle/oradata/ora11g/example01.dbf	1549712	ACTIVE	1549712	24/01/11
6	/u01/app/oracle/oradata/ora11g/undotbs01.dbf	1549712	ACTIVE	1549712	24/01/11

● 6. 백업쉘파일 실행 (datafile 백업)

[oracle@oracle hot_20240112]$ sh backup.sh > backup.log
[oracle@oracle hot_20240112]$ ls
backup.log  example01.dbf  system01.dbf    undotbs01.dbf
backup.sh   sysaux01.dbf   temp_new01.dbf  users01.dbf

● 7. online backup 끝낸다고 end

alter database end backup;
  • 확인
select a.file#, a.name, a.checkpoint_change#,
        b.status, b.change#, b.time
from v$datafile a, v$backup b
where a.file#=b.file#;


file# name									checkpoint_change#	status	change#	time
------------------------------------------------------------------------------------
/u01/app/oracle/oradata/ora11g/system01.dbf		1549712	NOT ACTIVE	1549712	24/01/11
/u01/app/oracle/oradata/ora11g/sysaux01.dbf		1549712	NOT ACTIVE	1549712	24/01/11
/u01/app/oracle/oradata/ora11g/users01.dbf		1549712	NOT ACTIVE	1549712	24/01/11
/u01/app/oracle/oradata/ora11g/example01.dbf	1549712	NOT ACTIVE	1549712	24/01/11
/u01/app/oracle/oradata/ora11g/undotbs01.dbf	1549712	NOT ACTIVE	1549712	24/01/11

● 8. online 중에 controlfile backup

alter database backup controlfile to '/home/oracle/backup/arch/hot_20240112/control01.ctl';
  • 확인
[oracle@oracle hot_20240112]$ ls
backup.log  control01.ctl  sysaux01.dbf  temp_new01.dbf  users01.dbf
backup.sh   example01.dbf  system01.dbf  undotbs01.dbf
[oracle@oracle hot_20240112]$ pwd
/home/oracle/backup/arch/hot_20240112

● 9. archive log current로 변경
: online backup 동안 기록 못한 아카이브 파일 기록

alter system archive log current;

백업 대상 확인할것

  • 테이블스페이스의 마지막 체크포인트 정보
select a.file#, b.name tbs_name, a.name file_name,
        a.status, a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;
  • 백업된 datafile 확인
select a.file#, a.name, a.checkpoint_change#,
        b.status, b.change#, to_char(b.time,'yyyy/mm/dd hh24:mi:ss')
from v$datafile a, v$backup b
where a.file#=b.file#;
  • tempfile 확인
select * from database_properties;
select * from v$tempfile;
  • redolog file 확인
select * from v$log;
  • 아카이브 로그 확인
archive log list
select destination, binding, status from v$archive_dest;

select sequence#, name, first_change#, next_change#, next_time
from v$archived_log;
  • 아카이브 파일 확인
SQL> ! ls /home/oracle/arch1 /home/oracle/arch2
/home/oracle/arch1:
arch_1_3_1157971653.arc  arch_1_5_1157971653.arc  arch_1_7_1157971653.arc
arch_1_4_1157971653.arc  arch_1_6_1157971653.arc

/home/oracle/arch2:
arch_1_3_1157971653.arc  arch_1_5_1157971653.arc  arch_1_7_1157971653.arc
arch_1_4_1157971653.arc  arch_1_6_1157971653.arc
profile
DB 공부를 하고 있는 사람입니다. 글을 읽어주셔서 감사하고 더 좋은 글을 쓰기 위해 노력하겠습니다 :)

0개의 댓글