[ORACLE] 백업&복구시나리오 (Control, redo, archivelog유실)

반응형

1. 백업 전 SCN

### controlfile SCN
select checkpoint_change# from v$database;      

CHECKPOINT_CHANGE#
------------------
          28450658

### Data file SCN
select name,checkpoint_change# from v$datafile; 

NAME                                                                                                 CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
/DBMS/ORACLE/oradata/ORCL19C/system01.dbf                                                                      28450658
/DBMS/ORACLE/oradata/ORCL19C/sysaux01.dbf                                                                      28450658
/DBMS/ORACLE/oradata/ORCL19C/undotbs01.dbf                                                                     28450658
/DBMS/ORACLE/oradata/ORCL19C/users01.dbf                                                                       28450658
/DBMS/ORACLE/oradata/ORCL19C/ts_test01.dbf                                                                     28450658

 

2. 테이블 생성 & 데이터 삽입

### 유저생성
create user back_test identified by "oracle" default tablespace TS_TEST;
grant connect, resource to back_test;
ALTER USER back_test  QUOTA UNLIMITED ON TS_TEST ;

### . 테이블 생성
CREATE TABLE back_test.test_backup (
    id         NUMBER PRIMARY KEY,
    name       VARCHAR2(100),
    created_at DATE
)tablespace TS_TEST;

###  데이터 삽입 
BEGIN
   FOR i IN 1 .. 100 LOOP
      INSERT INTO back_test.test_backup (
         id, name, created_at
      ) VALUES (
         i,
         'User_' || TO_CHAR(i),
         SYSDATE - MOD(i, 365)
      );
   END LOOP;
   COMMIT;
END;

select count(*) from back_test.TEST_BACKUP;
  COUNT(*)
----------
       100


3. begin backup + 데이터 insert

### Control file SCN
SQL> select checkpoint_change# from v$database;      

CHECKPOINT_CHANGE#
------------------
          28450658 -> 그대로임 

### Data file SCN
SQL> select name,checkpoint_change# from v$datafile; 

NAME                                                                                                 CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
/DBMS/ORACLE/oradata/ORCL19C/system01.dbf                                                                      28473487
/DBMS/ORACLE/oradata/ORCL19C/sysaux01.dbf                                                                      28473487
/DBMS/ORACLE/oradata/ORCL19C/undotbs01.dbf                                                                     28473487
/DBMS/ORACLE/oradata/ORCL19C/users01.dbf                                                                       28473487
/DBMS/ORACLE/oradata/ORCL19C/ts_test01.dbf                                                                     28473487

-> datafile수준에서의 SCN고정됨

전체 데이터베이스 수준의 checkpoint (global checkpoint)는 아님
대신 각 데이터파일 수준의 checkpoint가 발생합니다.


### Table Row Count
SQL> select count(*) from back_test.TEST_BACKUP;

  COUNT(*)
----------
       300 -> 200개 더 넣음

 ### Swtich log
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;


-rw-r-----.  1 oracle dba     1024  5월 22 09:34 1_1645_1156688778.dbf
-rw-r-----.  1 oracle dba 25789952  5월 22 09:34 1_1644_1156688778.dbf
-rw-r-----.  1 oracle dba     6144  5월 22 09:34 1_1646_1156688778.dbf


### CheckPoint 발생
select checkpoint_change# from v$database;      

CHECKPOINT_CHANGE#
------------------
          28473805



SQL> ALTER SYSTEM CHECKPOINT;   -> 체크포인트 까지 시켜서 data buffer까지 비움

System altered.


SQL>  select checkpoint_change# from v$database;  

CHECKPOINT_CHANGE#
------------------
          28473846


4. 추가로 data insert + endbackup

### DATA FILE COPY
cp -R oradata oradata_bak

### 100건 insert 
select count(*) from back_test.TEST_BACKUP;

  COUNT(*)
----------
400

###  end backup
alter database end backup;

### switch log
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

### 100건 더 insert
SQL> select count(*) from back_test.TEST_BACKUP;

  COUNT(*)
----------
       500


 

5. Controlfile backup

ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/DBMS/ORACLE/work/con_bak.sql' REUSE NORESETLOGS;

 

 

 


장애 발생 ( ontrolfile 유실, redolog 파일 유실, Archive 일부유실)


 

1. copy 했던 datafile 로 복구 

mv oradata_bak oradata


2. 컨트롤 파일 재생성

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORCL19C" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/DBMS/ORACLE/oradata/ORCL19C/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/DBMS/ORACLE/oradata/ORCL19C/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/DBMS/ORACLE/oradata/ORCL19C/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/DBMS/ORACLE/oradata/ORCL19C/system01.dbf',
  '/DBMS/ORACLE/oradata/ORCL19C/sysaux01.dbf',
  '/DBMS/ORACLE/oradata/ORCL19C/undotbs01.dbf',
  '/DBMS/ORACLE/oradata/ORCL19C/users01.dbf',
  '/DBMS/ORACLE/oradata/ORCL19C/ts_test01.dbf'
CHARACTER SET AL32UTF8;


SELECT status, database_status, instance_name 
  2  FROM v$instance;

STATUS       DATABASE_STATUS   INSTANCE_NAME
------------ ----------------- ----------------
MOUNTED      ACTIVE            ORCL19C

-> 생성하니 바로 MOUNT로 올라감, 


Oracle 버전CREATE CONTROLFILE 실행 후,

11g 이하 NOMOUNT 상태 유지 수동으로 ALTER DATABASE MOUNT 필요
12c~19c 자동으로 MOUNT 상태로 진입 기본 동작처럼 보임

 

 

3.Recover

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01195: online backup of file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/DBMS/ORACLE/oradata/ORCL19C/system01.dbf'

RECOVER DATABASE USING BACKUP CONTROLFILE;


SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: change 28473487 generated at 05/22/2025 09:29:23 needed for thread 1
ORA-00289: suggestion : /DBMS/ORACLE/oraarch/1_1644_1156688778.dbf
ORA-00280: change 28473487 for thread 1 is in sequence #1644


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto

ORA-00308: cannot open archived log '/DBMS/ORACLE/oraarch/1_1644_1156688778.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory


4. 아카이브 최소한 어디까지 있어야 복구 되는지 확인

RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: change 28474037 generated at 05/22/2025 09:42:36 needed for thread 1
ORA-00289: suggestion : /DBMS/ORACLE/oraarch/1_1650_1156688778.dbf
ORA-00280: change 28474037 for thread 1 is in sequence #1650


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL> alter database open resetlogs;

Database altered.


1_1644_1156688778.dbf -> begin이후 체크포인트가 찍힌 최소한의 아카이브로 DB가 기동됨


5. Table count

select count(*) from back_test.TEST_BACKUP;

  COUNT(*)
----------
       400

 

※결론

-. Tibero는 endbackup 이후 Ahivelog까지 필요한데, 오라클은 
begin이후에 최소한의 Archivelog(체크포인트가 찍혀진) 있으면 거기까지 복구가 된다. 

 

 

 

 

 

 

 

 

 

 

 

 

반응형