# 요약
  << 시나리오 4 >> 백업 받지않은 테이블스페이스에 데이터파일 손상
<< 시나리오 5 >> 기존 위치가 아닌 새로운 위치로 복원 작업 수행
<< 시나리오 6 >> 테이블스페이스에 속한 여러 데이터 파일들 중에 특정한 파일이 손상
<< 시나리오 7 >> System Data File 손상
<< 시나리오 8 >> 모든 데이터 파일 손상 : 백업, 리두, 아카이브 다 있다
<< Cold Backup, Close Backup, Offline Backup, 일관성 백업 >>
<< Hot Backup, Open Backup, Online Backup, 일관성없는 백업 >>
<< 시나리오 9  >> 아카이브 파일이 다른 위치에 있을 경우 복구




 

 

 
  # 테이블스페이스 마지막 체크포인트 정보
SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME               STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ---------------------- ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                 SYSTEM             2262003
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                 ONLINE             2262003
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                  ONLINE             2262003
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                ONLINE             2262003
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                ONLINE             2262003


# 백업 정보
SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
  FILE# NAME                                          CHECKPOINT_CHANGE# STATUS     CHANGE# TIME
------- --------------------------------------------- ------------------ ------------------ -------------------
      1 /u01/app/oracle/oradata/ora11g/system01.dbf              2262003 NOT ACTIVE 2203301 2024-01-12 14:07:23
      2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf              2262003 NOT ACTIVE 2203301 2024-01-12 14:07:23
      4 /u01/app/oracle/oradata/ora11g/users01.dbf               2262003 NOT ACTIVE 2203301 2024-01-12 14:07:23
      5 /u01/app/oracle/oradata/ora11g/example01.dbf             2262003 NOT ACTIVE 2203301 2024-01-12 14:07:23
      6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf             2262003 NOT ACTIVE 2203301 2024-01-12 14:07:23


SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ---------- ------------ ---------
         1          1          7 YES       INACTIVE               2248298 12-JAN-24       2262003 15-JAN-24
         2          1          8 NO        CURRENT                2262003 15-JAN-24    2.8147E+14
         3          1          6 YES       INACTIVE               2227527 12-JAN-24       2248298 12-JAN-24


SELECT sequence#, name, first_change#, first_time, next_change#, next_time
FROM v$archived_log;
 SEQUENCE# NAME                                               FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- -------------------------------------------------- ------------- ----------- ------------ ---------
        3  /home/oracle/arch1/arch_1_3_1157971650.arc               2075466 24/01/12      2082030 24/01/12
        3  /home/oracle/arch2/arch_1_3_1157971650.arc             2075466 24/01/12      2082030 24/01/12
        4  /home/oracle/arch1/arch_1_4_1157971650.arc             2082030 24/01/12      2205455 24/01/12
        4  /home/oracle/arch2/arch_1_4_1157971650.arc             2082030 24/01/12      2205455 24/01/12
        5  /home/oracle/arch1/arch_1_5_1157971650.arc             2205455 24/01/12      2227527 24/01/12
        5  /home/oracle/arch2/arch_1_5_1157971650.arc             2205455 24/01/12      2227527 24/01/12
...
백업파일시점 seq$4


[oracle@oracle arch]$ ls /home/oracle/arch*
/home/oracle/arch1:
arch_1_2_1157971650.arc  arch_1_3_1157971650.arc  arch_1_4_1157971650.arc  arch_1_5_1157971650.arc  arch_1_6_1157971650.arc  arch_1_7_1157971650.arc

/home/oracle/arch2:
arch_1_2_1157971650.arc  arch_1_3_1157971650.arc  arch_1_4_1157971650.arc  arch_1_5_1157971650.arc  arch_1_6_1157971650.arc  arch_1_7_1157971650.arc

 

<< 시나리오 4 >> 백업 받지않은 테이블스페이스에 데이터파일 손상
 
CREATE TABLESPACE data01 DATAFILE '/u01/app/oracle/oradata/ora11g/data01.dbf' SIZE 5M;


# 테이블스페이스 마지막 체크포인트 정보
SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME               STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ---------------------- ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                 SYSTEM             2262003
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                 ONLINE             2262003
         3 /u01/app/oracle/oradata/ora11g/data01.dbf          DATA01                 ONLINE             2272201
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                  ONLINE             2262003
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                ONLINE             2262003
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                ONLINE             2262003


# 백업 정보
SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
 FILE# NAME                                          CHECKPOINT_CHANGE# STATUS      CHANGE# TIME
------ --------------------------------------------- ------------------ ---------- -------- -------------------
     1 /u01/app/oracle/oradata/ora11g/system01.dbf              2262003 NOT ACTIVE  2203301 2024-01-12 14:07:23
     2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf              2262003 NOT ACTIVE  2203301 2024-01-12 14:07:23
     3 /u01/app/oracle/oradata/ora11g/data01.dbf                2272201 NOT ACTIVE        0
     4 /u01/app/oracle/oradata/ora11g/users01.dbf               2262003 NOT ACTIVE  2203301 2024-01-12 14:07:23
     5 /u01/app/oracle/oradata/ora11g/example01.dbf             2262003 NOT ACTIVE  2203301 2024-01-12 14:07:23
     6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf             2262003 NOT ACTIVE  2203301 2024-01-12 14:07:23



CREATE TABLE hr.dept_temp TABLESPACE data01 AS SELECT * FROM hr.departments;

SQL> SELECT COUNT(*) FROM hr.dept_temp;
  COUNT(*)
----------
        27


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1          7 YES       INACTIVE               2248298 12-JAN-24        2262003 15-JAN-24
         2          1          8 NO        CURRENT                2262003 15-JAN-24     2.8147E+14
         3          1          6 YES       INACTIVE               2227527 12-JAN-24        2248298 12-JAN-24

sep#8


ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE;

SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         10 YES       INACTIVE               2272695 15-JAN-24        2272702 15-JAN-24
         2          1         11 NO        CURRENT                2272702 15-JAN-24     2.8147E+14
         3          1          9 YES       INACTIVE               2272687 15-JAN-24        2272695 15-JAN-24


SELECT sequence#, name, first_change#, first_time, next_change#, next_time
FROM v$archived_log;
 SEQUENCE# NAME                                               FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- -------------------------------------------------- ------------- ----------- ------------ ---------
...
         8 /home/oracle/arch1/arch_1_8_1157971650.arc               2262003 24/01/15         2272687 24/01/15
         8 /home/oracle/arch2/arch_1_8_1157971650.arc               2262003 24/01/15         2272687 24/01/15
         9 /home/oracle/arch1/arch_1_9_1157971650.arc               2272687 24/01/15         2272695 24/01/15
         9 /home/oracle/arch2/arch_1_9_1157971650.arc               2272687 24/01/15         2272695 24/01/15
        10 /home/oracle/arch1/arch_1_10_1157971650.arc              2272695 24/01/15         2272702 24/01/15
        10 /home/oracle/arch2/arch_1_10_1157971650.arc              2272695 24/01/15         2272702 24/01/15
...

SELECT f.tablespace_name, f.file_name
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'DEPT_TEMP'
AND e.owner = 'HR';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /u01/app/oracle/oradata/ora11g/data01.dbf



# 장애 발생
SQL> ! rm /u01/app/oracle/oradata/ora11g/data01.dbf



SQL> SHUTDOWN IMMEDIATE
ORA-03113: end-of-file on communication channel
Process ID: 20003
Session ID: 187 Serial number: 13

SQL> conn / as sysdba

SQL> STARTUP
Database mounted.
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/u01/app/oracle/oradata/ora11g/data01.dbf'

>> 1개만 노출되기에 꼭 v$recover_file 를 확인하자


SQL> SELECT * FROM v$recover_file;
     FILE# ONLINE  ONLINE_ ERROR                                                      CHANGE# TIME
---------- ------- ------- ------------------------------------------------------- ---------- ---------
         3 ONLINE  ONLINE  FILE NOT FOUND                                                   0


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /u01/app/oracle/oradata/ora11g/data01.dbf          ONLINE
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


SQL> ALTER DATABASE DATAFILE 3 OFFLINE;


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /u01/app/oracle/oradata/ora11g/data01.dbf          RECOVER
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


SQL> ALTER DATABASE OPEN;


다른 tbs 오류 없는지 체크
SQL> SELECT COUNT(*) FROM hr.employees;

  COUNT(*)
----------
       106


백업정보 체크
SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
  FILE# NAME                                         CHECKPOINT_CHANGE# STATUS      CHANGE# TIME
------- -------------------------------------------- ------------------ ---------- -------- -------------------
      1 /u01/app/oracle/oradata/ora11g/system01.dbf             2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
      2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf             2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
      4 /u01/app/oracle/oradata/ora11g/users01.dbf              2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
      5 /u01/app/oracle/oradata/ora11g/example01.dbf            2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
      6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf            2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23

>> 오프라인으로 되어있어 보이지 않고 백업도 없다.

** 테이블스페이스 생성 당시, 테이블 생성 당시 redo log 실시간으로 체크하자



# 복구작업 수행해야할 기존 디렉터리에 데이터파일 재생성
ALTER DATABASE CREATE DATAFILE '/u01/app/oracle/oradata/ora11g/data01.dbf';

참고) 
# 기존 위치가 아닌 새로운 위치에 데이터파일 재생성할 경우
ALTER DATABASE CREATE DATAFILE '/u01/app/oracle/oradata/ora11g/data01.dbf' AS '/home/oracle/data01.dbf';
기존 to 새위치

생성된 파일 확인
SQL> ! ls -l /u01/app/oracle/oradata/ora11g/data01.dbf
-rw-r-----. 1 oracle oinstall 5251072 Jan 15 10:29 /u01/app/oracle/oradata/ora11g/data01.dbf

5251072 5M로 자동생성 -> 딕셔너리+컨트롤파일의 정보로 재생성하기 때문에 사이즈도 그대로 생성됨, 단 내용이 없다.


!! 아카이브, 리두 체크 >> 없다? DROP. 복구 불가

깡통파일에 리두 적용
SQL> RECOVER TABLESPACE data01;
ORA-00279: change 2272200 generated at 01/15/2024 10:04:06 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_8_1157971650.arc
ORA-00280: change 2272200 for thread 1 is in sequence #8

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO

ORA-00279: change 2272687 generated at 01/15/2024 10:09:01 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_9_1157971650.arc
ORA-00280: change 2272687 for thread 1 is in sequence #9

Log applied.
Media recovery complete.


SQL> ALTER TABLESPACE data01 ONLINE;


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /u01/app/oracle/oradata/ora11g/data01.dbf          ONLINE
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


SQL> SELECT COUNT(*) FROM hr.dept_temp;
  COUNT(*)
----------
        27

 

<< 시나리오 5 >> 기존 위치가 아닌 새로운 위치로 복원 작업 수행
 
SQL> CREATE TABLE hr.emp_temp TABLESPACE data01 AS SELECT * FROM hr.employees;

SQL> SELECT COUNT(*) FROM hr.emp_temp;
  COUNT(*)
----------
       106


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         10 YES       INACTIVE               2272695 15-JAN-24        2272702 15-JAN-24
         2          1         11 YES       INACTIVE               2272702 15-JAN-24        2293412 15-JAN-24
         3          1         12 NO        CURRENT                2293412 15-JAN-24     2.8147E+14


SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
FILE# NAME                                          CHECKPOINT_CHANGE# STATUS      CHANGE# TIME
----- --------------------------------------------- ------------------ ---------- -------- -------------------
    1 /u01/app/oracle/oradata/ora11g/system01.dbf              2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
    2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf              2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
    3 /u01/app/oracle/oradata/ora11g/data01.dbf                2294255 NOT ACTIVE                  0
    4 /u01/app/oracle/oradata/ora11g/users01.dbf               2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
    5 /u01/app/oracle/oradata/ora11g/example01.dbf             2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23
    6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf             2293413 NOT ACTIVE  2203301 2024-01-12 14:07:23



# data01 tablespace를 hot backup 받자

테이블스페이스 레벨로 백업
SQL> ALTER TABLESPACE data01 BEGIN BACKUP;


SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
FILE# NAME                                            CHECKPOINT_CHANGE# STATUS     CHANGE# TIME
----- ----------------------------------------------- ------------------ ---------- ------- -------------------
    1 /u01/app/oracle/oradata/ora11g/system01.dbf                2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    3 /u01/app/oracle/oradata/ora11g/data01.dbf                  2295964 ACTIVE     2295964 2024-01-15 11:06:50
    4 /u01/app/oracle/oradata/ora11g/users01.dbf                 2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    5 /u01/app/oracle/oradata/ora11g/example01.dbf               2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf               2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23


[oracle@oracle ~]$ cd /home/oracle/backup/arch/hot_20240112

SQL> ! cp -av /u01/app/oracle/oradata/ora11g/data01.dbf /home/oracle/backup/arch/hot_20240112

SQL> ! ls /home/oracle/backup/arch/hot_20240112
backup.log    backup.sh     control01.ctl   data01.dbf     example01.dbf  
sysaux01.dbf  system01.dbf  temp_new01.dbf  undotbs01.dbf  users01.dbf


SQL> ALTER TABLESPACE data01 END BACKUP;

>> begin ~ end backup 빠르게 진행하자. redo log 쌓임 방지


SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
FILE# NAME                                            CHECKPOINT_CHANGE# STATUS     CHANGE# TIME
----- ----------------------------------------------- ------------------ ---------- ------- -------------------
    1 /u01/app/oracle/oradata/ora11g/system01.dbf                2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    3 /u01/app/oracle/oradata/ora11g/data01.dbf                  2295964 NOT ACTIVE 2295964 2024-01-15 11:06:50
    4 /u01/app/oracle/oradata/ora11g/users01.dbf                 2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    5 /u01/app/oracle/oradata/ora11g/example01.dbf               2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23
    6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf               2293413 NOT ACTIVE 2203301 2024-01-12 14:07:23


SQL> SELECT * FROM v$log;

    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         10 YES       INACTIVE               2272695 15-JAN-24        2272702 15-JAN-24
         2          1         11 YES       INACTIVE               2272702 15-JAN-24        2293412 15-JAN-24
         3          1         12 NO        CURRENT                2293412 15-JAN-24     2.8147E+14

seq#12



SQL> CREATE TABLE hr.loc_temp TABLESPACE data01 AS SELECT * FROM hr.locations;

SQL> SELECT COUNT(*) FROM hr.loc_temp;
  COUNT(*)
----------
        23

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE# ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         13 YES       INACTIVE               2296184 15-JAN-24        2296187 15-JAN-24
         2          1         14 YES       INACTIVE               2296187 15-JAN-24        2296193 15-JAN-24
         3          1         15 NO        CURRENT                2296193 15-JAN-24     2.8147E+14


SELECT sequence#, name, first_change#, first_time, next_change#, next_time
FROM v$archived_log;
 SEQUENCE# NAME                                               FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- -------------------------------------------------- ------------- ----------- ------------ ---------
...
        11 /home/oracle/arch1/arch_1_11_1157971650.arc              2272702 24/01/15         2293412 24/01/15
        11 /home/oracle/arch2/arch_1_11_1157971650.arc              2272702 24/01/15         2293412 24/01/15
        12 /home/oracle/arch1/arch_1_12_1157971650.arc              2293412 24/01/15         2296184 24/01/15
        12 /home/oracle/arch2/arch_1_12_1157971650.arc              2293412 24/01/15         2296184 24/01/15
        13 /home/oracle/arch1/arch_1_13_1157971650.arc              2296184 24/01/15         2296187 24/01/15
        13 /home/oracle/arch2/arch_1_13_1157971650.arc              2296184 24/01/15         2296187 24/01/15
...


SELECT f.tablespace_name, f.file_name
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'LOC_TEMP'
AND e.owner = 'HR';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /u01/app/oracle/oradata/ora11g/data01.dbf



# 장애 발생
SQL> ! rm /u01/app/oracle/oradata/ora11g/data01.dbf



즉시 offline
SQL> ALTER TABLESPACE data01 OFFLINE IMMEDIATE;


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /u01/app/oracle/oradata/ora11g/data01.dbf          RECOVER
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


1. 백업파일을 새로운 위치에 Restore
SQL> ! cp -av /home/oracle/backup/arch/hot_20240112/data01.dbf /home/oracle
‘/home/oracle/backup/arch/hot_20240112/data01.dbf’ -> ‘/home/oracle/data01.dbf’


2. control file에 위치 변경 작업
ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/ora11g/data01.dbf' TO '/home/oracle/data01.dbf';


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /home/oracle/data01.dbf                            RECOVER
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


3. 복구 작업
SQL> RECOVER TABLESPACE data01;
ORA-00279: change 2295964 generated at 01/15/2024 11:06:50 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_12_1157971650.arc
ORA-00280: change 2295964 for thread 1 is in sequence #12

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO
Log applied.
Media recovery complete.


4. 테이블스페이스를 online
SQL> ALTER TABLESPACE data01 ONLINE;


SQL> SELECT file#, name, status FROM v$datafile;
     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
         3 /home/oracle/data01.dbf                            ONLINE
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       ONLINE


SQL> SELECT COUNT(*) FROM hr.loc_temp;
  COUNT(*)
----------
        23


SELECT f.tablespace_name, f.file_name
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'LOC_TEMP'
AND e.owner = 'HR';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /home/oracle/data01.dbf

 

<< 시나리오 6 >> 테이블스페이스에 속한 여러 데이터 파일들 중에 특정한 파일이 손상
  SQL> SELECT tablespace_name, file_name FROM dba_data_files;
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /home/oracle/data01.dbf
UNDOTBS                        /u01/app/oracle/oradata/ora11g/undotbs01.dbf
USERS                          /u01/app/oracle/oradata/ora11g/users01.dbf
SYSAUX                         /u01/app/oracle/oradata/ora11g/sysaux01.dbf
SYSTEM                         /u01/app/oracle/oradata/ora11g/system01.dbf
EXAMPLE                        /u01/app/oracle/oradata/ora11g/example01.dbf


# 테이블 스페이스 데이터파일 추가
SQL> ALTER TABLESPACE data01 ADD DATAFILE '/u01/app/oracle/oradata/ora11g/data02.dbf' SIZE 10M;


SQL> SELECT tablespace_name, file_name FROM dba_data_files;
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /home/oracle/data01.dbf
UNDOTBS                        /u01/app/oracle/oradata/ora11g/undotbs01.dbf
USERS                          /u01/app/oracle/oradata/ora11g/users01.dbf
SYSAUX                         /u01/app/oracle/oradata/ora11g/sysaux01.dbf
SYSTEM                         /u01/app/oracle/oradata/ora11g/system01.dbf
DATA01                         /u01/app/oracle/oradata/ora11g/data02.dbf
EXAMPLE                        /u01/app/oracle/oradata/ora11g/example01.dbf


SELECT f.tablespace_name, f.file_name
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'LOC_TEMP'
AND e.owner = 'HR';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /home/oracle/data01.dbf


SQL> CREATE TABLE hr.emp_2024 TABLESPACE data01 AS SELECT * FROM hr.employees;


SELECT f.tablespace_name, f.file_name
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'EMP_2024'
AND e.owner = 'HR';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
DATA01                         /home/oracle/data01.dbf


SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
... 대용량으로 만들기
SQL> INSERT INTO hr.emp_2024 SELECT * FROM hr.emp_2024;
ORA-01653: unable to extend table HR.EMP_2024 by 128 in tablespace DATA01

SQL> COMMIT;


SQL> SELECT bytes FROM dba_segments WHERE segment_name = 'EMP_2024' AND owner = 'HR';
     BYTES
----------
  12582912


SELECT f.tablespace_name, f.file_name, count(*)
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'EMP_2024'
AND e.owner = 'HR'
GROUP BY f.tablespace_name, f.file_name;
TABLESPACE_NAME                FILE_NAME                                            COUNT(*) <- extents 개수
------------------------------ -------------------------------------------------- ----------
DATA01                         /u01/app/oracle/oradata/ora11g/data02.dbf                  11
DATA01                         /home/oracle/data01.dbf                                    16

SELECT *
FROM dba_extents
WHERE segment_name = 'EMP_2024'
AND owner = 'HR';



SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS                CHANGE# TIME
---------- -------------------------------------------------- ------------------ ------------------ ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         3 /home/oracle/data01.dbf                                       2296814 NOT ACTIVE            2295964 2024-01-15 11:06:50
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         7 /u01/app/oracle/oradata/ora11g/data02.dbf                     2298445 NOT ACTIVE                  0


# Online Backup
SQL> ALTER TABLESPACE data01 BEGIN BACKUP;


SQL> ! cp -av /u01/app/oracle/oradata/ora11g/data02.dbf /home/oracle/backup/arch/hot_20240112/data02.dbf

SQL> ! ls /home/oracle/backup/arch/hot_20240112
backup.log  backup.sh  control01.ctl  data01.dbf  data02.dbf  
example01.dbf  sysaux01.dbf  system01.dbf  temp_new01.dbf  undotbs01.dbf  users01.dbf


SQL> ALTER TABLESPACE data01 END BACKUP;


SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS                CHANGE# TIME
---------- -------------------------------------------------- ------------------ ------------------ ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         3 /home/oracle/data01.dbf                                       2299433 NOT ACTIVE            2299433 2024-01-15 12:13:29
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  2296193 NOT ACTIVE            2203301 2024-01-12 14:07:23
         7 /u01/app/oracle/oradata/ora11g/data02.dbf                     2299433 NOT ACTIVE            2299433 2024-01-15 12:13:29


SQL> SELECT * FROM v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         13   52428800        512          1 YES       INACTIVE               2296184 15-JAN-24        2296187 15-JAN-24
         2          1         14   52428800        512          1 YES       INACTIVE               2296187 15-JAN-24        2296193 15-JAN-24
         3          1         15   52428800        512          1 NO        CURRENT                2296193 15-JAN-24     2.8147E+14

seq#15


SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> ALTER SYSTEM SWITCH LOGFILE;


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------------- ------------- ----------- ------------ ---------
         1          1         16   52428800        512          1 YES       INACTIVE               2299923 15-JAN-24        2299926 15-JAN-24
         2          1         17   52428800        512          1 YES       INACTIVE               2299926 15-JAN-24        2299929 15-JAN-24
         3          1         18   52428800        512          1 NO        CURRENT                2299929 15-JAN-24     2.8147E+14

SELECT sequence#, name, first_change#, first_time, next_change#, next_time
FROM v$archived_log;
 SEQUENCE# NAME                                               FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- -------------------------------------------------- ------------- ----------- ------------ ---------
...
        15 /home/oracle/arch1/arch_1_15_1157971650.arc              2296193 15-JAN-24        2299923 15-JAN-24
        15 /home/oracle/arch2/arch_1_15_1157971650.arc              2296193 15-JAN-24        2299923 15-JAN-24
...



SQL> CREATE TABLE hr.dept_2024 TABLESPACE data01 AS SELECT * FROM hr.departments;


SELECT f.tablespace_name, f.file_name, count(*)
FROM dba_extents e, dba_data_files f
WHERE f.file_id = e.file_id
AND e.segment_name = 'DEPT_2024'
AND e.owner = 'HR'
GROUP BY f.tablespace_name, f.file_name;
TABLESPACE_NAME                FILE_NAME                                            COUNT(*)
------------------------------ -------------------------------------------------- ----------
DATA01                         /u01/app/oracle/oradata/ora11g/data02.dbf                   1




# 장애 발생 - 파일을 잘못지웠다
SQL> ! rm /u01/app/oracle/oradata/ora11g/data02.dbf

SQL> ! ls /u01/app/oracle/oradata/ora11g/data02.dbf
ls: cannot access /u01/app/oracle/oradata/ora11g/data02.dbf: No such file or directory


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2299929
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2299929
         3 /home/oracle/data01.dbf                            DATA01                         ONLINE             2299929
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2299929
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2299929
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2299929
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         ONLINE             2299929



# 테이블스페이스에 속한 데이터파일을offline으로 수행하되 가능한 데이터파일은 체크포인트 발생하고 
가능하지 않은 데이터파일은 그냥 offline으로 수행
SQL> ALTER TABLESPACE data01 OFFLINE TEMPORARY;


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2299929
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2299929
         3 /home/oracle/data01.dbf                            DATA01                         OFFLINE            2307654
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2299929
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2299929
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2299929
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         OFFLINE            2307654


# Restore
SQL> ! cp -av /home/oracle/backup/arch/hot_20240112/data02.dbf /u01/app/oracle/oradata/ora11g/data02.dbf


# Recovery
SQL> RECOVER TABLESPACE data01;
ORA-00279: change 2299433 generated at 01/15/2024 12:13:29 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_15_1157971650.arc
ORA-00280: change 2299433 for thread 1 is in sequence #15

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO
Log applied.
Media recovery complete.


# Online
SQL> ALTER TABLESPACE data01 ONLINE;


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2299929
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2299929
         3 /home/oracle/data01.dbf                            DATA01                         ONLINE             2308053
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2299929
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2299929
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2299929
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         ONLINE             2308053


SQL> SELECT COUNT(*) FROM hr.dept_2024;
  COUNT(*)
----------
        27

 

<< 시나리오 7 >> System Data File 손상
  SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS                CHANGE# TIME
---------- -------------------------------------------------- ------------------ ------------------ ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   2299929 NOT ACTIVE            2203301 2024-01-12 14:07:23
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   2299929 NOT ACTIVE            2203301 2024-01-12 14:07:23
         3 /home/oracle/data01.dbf                                       2308053 NOT ACTIVE            2299433 2024-01-15 12:13:29
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    2299929 NOT ACTIVE            2203301 2024-01-12 14:07:23
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  2299929 NOT ACTIVE            2203301 2024-01-12 14:07:23
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  2299929 NOT ACTIVE            2203301 2024-01-12 14:07:23
         7 /u01/app/oracle/oradata/ora11g/data02.dbf                     2308053 NOT ACTIVE            2299433 2024-01-15 12:13:29


SQL> ! ls /home/oracle/backup/arch/hot_20240112
backup.log  backup.sh  control01.ctl  data01.dbf  data02.dbf  
example01.dbf  sysaux01.dbf  system01.dbf  temp_new01.dbf  undotbs01.dbf  users01.dbf


# 장애 발생
SQL> ! rm /u01/app/oracle/oradata/ora11g/system01.dbf


모르고 DB내림
SQL> SHUTDOWN IMMEDIATE

SQL> STARTUP
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/ora11g/system01.dbf'


SQL> SELECT * FROM v$recover_file;
     FILE# ONLINE  ONLINE_ ERROR                                                                CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ---------
         1 ONLINE  ONLINE  FILE NOT FOUND                                                             0


# Restore
SQL> ! cp -av /home/oracle/backup/arch/hot_20240112/system01.dbf /u01/app/oracle/oradata/ora11g/


# Recovery
SQL> RECOVER TABLESPACE SYSTEM;
ORA-00279: change 2203301 generated at 01/12/2024 14:07:23 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_4_1157971650.arc
ORA-00280: change 2203301 for thread 1 is in sequence #4

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO

ORA-00279: change 2205455 generated at 01/12/2024 14:28:07 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_5_1157971650.arc
ORA-00280: change 2205455 for thread 1 is in sequence #5
... 하나라도 없으면 복구 불가
ORA-00279: change 2296193 generated at 01/15/2024 11:14:22 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_15_1157971650.arc
ORA-00280: change 2296193 for thread 1 is in sequence #15

Log applied.
Media recovery complete.


# Open
SQL> ALTER DATABASE OPEN;


SQL> SELECT * FROM v$recover_file;

no rows selected


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2308961
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2308961
         3 /home/oracle/data01.dbf                            DATA01                         ONLINE             2308961
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2308961
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2308961
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2308961
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         ONLINE             2308961

 

<< 시나리오 8 >> 모든 데이터 파일 손상 : 백업, 리두, 아카이브 다 있다
  # 장애 발생
SQL> ! rm /u01/app/oracle/oradata/ora11g/*.dbf


SQL> ALTER SYSTEM CHECKPOINT;
ORA-03113: end-of-file on communication channel
Process ID: 26199
Session ID: 9 Serial number: 3

SQL> conn / as sysdba
Connected to an idle instance.

SQL> STARTUP
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/ora11g/system01.dbf'

SQL> SELECT status FROM v$instance;

STATUS
------------
MOUNTED     -> v$~ control file에 정보가 있구나


SQL> SELECT * FROM v$recover_file;
     FILE# ONLINE  ONLINE_ ERROR                                                                CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ---------
         1 ONLINE  ONLINE  FILE NOT FOUND                                                             0
         2 ONLINE  ONLINE  FILE NOT FOUND                                                             0
         4 ONLINE  ONLINE  FILE NOT FOUND                                                             0
         5 ONLINE  ONLINE  FILE NOT FOUND                                                             0
         6 ONLINE  ONLINE  FILE NOT FOUND                                                             0
         7 ONLINE  ONLINE  FILE NOT FOUND                                                             0


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2308961
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2308961
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2308961
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2308961
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2308961
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         ONLINE             2308961
         3 /home/oracle/data01.dbf                            DATA01                         ONLINE             2308961


# 백업파일 체크
SQL> ! ls /home/oracle/backup/arch/hot_20240112
backup.log  backup.sh  control01.ctl  data01.dbf  data02.dbf  
example01.dbf  sysaux01.dbf  system01.dbf  temp_new01.dbf  undotbs01.dbf  users01.dbf


# Restore
SQL> ! cp -av /home/oracle/backup/arch/hot_20240112/*.dbf /u01/app/oracle/oradata/ora11g/


SQL> ! ls /u01/app/oracle/oradata/ora11g/
control01.ctl  data01.dbf  data02.dbf  example01.dbf  redo01.log  
redo02.log  redo03.log  sysaux01.dbf  system01.dbf  temp_new01.dbf  undotbs01.dbf  users01.dbf


# Recovery
SQL> RECOVER DATABASE;
ORA-00279: change 2203301 generated at 01/12/2024 14:07:23 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_4_1157971650.arc
ORA-00280: change 2203301 for thread 1 is in sequence #4

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO

ORA-00279: change 2205455 generated at 01/12/2024 14:28:07 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_5_1157971650.arc
ORA-00280: change 2205455 for thread 1 is in sequence #5
...
ORA-00279: change 2296193 generated at 01/15/2024 11:14:22 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_15_1157971650.arc
ORA-00280: change 2296193 for thread 1 is in sequence #15

Log applied.
Media recovery complete.


# Open
SQL> ALTER DATABASE OPEN;


SQL> SELECT * FROM v$recover_file;

no rows selected


SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME                       STATUS  CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------------------ ------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM                         SYSTEM             2329654
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX                         ONLINE             2329654
         3 /home/oracle/data01.dbf                            DATA01                         ONLINE             2329654
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS                          ONLINE             2329654
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE                        ONLINE             2329654
         6 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS                        ONLINE             2329654
         7 /u01/app/oracle/oradata/ora11g/data02.dbf          DATA01                         ONLINE             2329654


SQL> DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;

>> 스토리지의 구조가 변경되었으니 백업하자



============================================================================================

OS 고장 - VM - OS copy 본으로 변경

============================================================================================


<< Cold Backup, Close Backup, Offline Backup, 일관성 백업 >>
  SELECT a.file#, a.name file_name, b.name tbs_name, a.status, a.checkpoint_change#
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts#;
     FILE# FILE_NAME                                          TBS_NAME   STATUS      CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ---------- ----------- ------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM     SYSTEM                 1147046
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf        SYSAUX     ONLINE                 1147046
         3 /u01/app/oracle/oradata/ora11g/undotbs01.dbf       UNDOTBS    ONLINE                 1147046
         4 /u01/app/oracle/oradata/ora11g/users01.dbf         USERS      ONLINE                 1147046
         5 /u01/app/oracle/oradata/ora11g/example01.dbf       EXAMPLE    ONLINE                 1147046


SQL> SELECT name,status FROM v$controlfile;
NAME                                               
-------------------------------------------------- 
/u01/app/oracle/oradata/ora11g/control01.ctl


SQL> SELECT name,status,enabled FROM v$tempfile;
NAME                                               STATUS      ENABLED
-------------------------------------------------- ----------- -----------
/u01/app/oracle/oradata/ora11g/temp01.dbf          ONLINE      READ WRITE


SELECT a.group#, a.member, b.bytes/1024/1024 mb, b.archived, b.status
FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1,2;
    GROUP# MEMBER                                                     MB ARCHIVED  STATUS
---------- -------------------------------------------------- ---------- --------- -----------
         1 /u01/app/oracle/oradata/ora11g/redo01.log                  50 YES       INACTIVE
         2 /u01/app/oracle/oradata/ora11g/redo02.log                  50 YES       INACTIVE
         3 /u01/app/oracle/oradata/ora11g/redo03.log                  50 NO        CURRENT


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         48   52428800        512          1 YES       INACTIVE          1145387 15-JAN-24        1145390 15-JAN-24
         2          1         49   52428800        512          1 YES       INACTIVE          1145390 15-JAN-24        1146954 15-JAN-24
         3          1         50   52428800        512          1 NO        CURRENT           1146954 15-JAN-24     2.8147E+14

seq#50

SQL> SHUTDOWN IMMEDIATE

sh 사용하자

SQL> ! mkdir -p /home/oracle/backup/arch/cold_20240115

SQL> ! ls /home/oracle/backup/arch

SQL> ! cp -av /u01/app/oracle/oradata/ora11g/*.* /home/oracle/backup/arch/cold_20240115


SQL> ! ls /home/oracle/backup/arch/cold_20240115
control01.ctl  example01.dbf  redo01.log  redo02.log  redo03.log  
sysaux01.dbf  system01.dbf  temp01.dbf  undotbs01.dbf  users01.dbf


SQL> STARTUP


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         48   52428800        512          1 YES       INACTIVE          1145387 15-JAN-24        1145390 15-JAN-24
         2          1         49   52428800        512          1 YES       INACTIVE          1145390 15-JAN-24        1146954 15-JAN-24
         3          1         50   52428800        512          1 NO        CURRENT           1146954 15-JAN-24     2.8147E+14


SQL> CREATE PFILE ='/home/oracle/backup/arch/cold_20240115/initora11g_20240115.ora' FROM SPFILE;



# 정책상 필요없는 과거 백업본 지우는 작업
SQL> ! rm -r /home/oracle/backup/arch/cold_20240112


# 아카이브 파일 삭제 : 백업파일 seq#50 기준 이전자료
! ls /home/oracle/arch*



<< Hot Backup, Open Backup, Online Backup, 일관성없는 백업 >>
  SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS         CHANGE# TIME
---------- -------------------------------------------------- ------------------ ----------- ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   1147690 NOT ACTIVE           0
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   1147690 NOT ACTIVE           0
         3 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  1147690 NOT ACTIVE           0
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    1147690 NOT ACTIVE           0
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  1147690 NOT ACTIVE           0

SQL> SELECT * FROM v$tempfile;
     FILE# CREATION_CHANGE# CREATION_        TS#     RFILE# STATUS      ENABLED          BYTES     BLOCKS CREATE_BYTES BLOCK_SIZE NAME
---------- ---------------- --------- ---------- ---------- ----------- ----------- ---------- ---------- ------------ ---------- --------------------------------------------------
         1           635086 07-DEC-23          3          1 ONLINE      READ WRITE    20971520       2560     20971520       8192 /u01/app/oracle/oradata/ora11g/temp01.dbf

SQL> SELECT * FROM v$controlfile;
STATUS      NAME                                               IS_RECOVERY_DEST_FILE  BLOCK_SIZE FILE_SIZE_BLKS
----------- -------------------------------------------------- ---------------------- ---------- --------------
            /u01/app/oracle/oradata/ora11g/control01.ctl       NO                          16384            594


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         48   52428800        512          1 YES       INACTIVE          1145387 15-JAN-24        1145390 15-JAN-24
         2          1         49   52428800        512          1 YES       INACTIVE          1145390 15-JAN-24        1146954 15-JAN-24
         3          1         50   52428800        512          1 NO        CURRENT           1146954 15-JAN-24     2.8147E+14

seq#50


SQL> ALTER SYSTEM CHECKPOINT;



SELECT 'cp -av '||name||' /home/oracle/backup/arch/hot_20240115' FROM v$datafile
UNION ALL
SELECT 'cp -av '||name||' /home/oracle/backup/arch/hot_20240115' FROM v$tempfile;


SQL> ALTER DATABASE BEGIN BACKUP;

SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS         CHANGE# TIME
---------- -------------------------------------------------- ------------------ ----------- ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   1147766 ACTIVE         1147766 2024-01-15 04:27:12
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   1147766 ACTIVE         1147766 2024-01-15 04:27:12
         3 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  1147766 ACTIVE         1147766 2024-01-15 04:27:12
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    1147766 ACTIVE         1147766 2024-01-15 04:27:12
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  1147766 ACTIVE         1147766 2024-01-15 04:27:12


SQL> ! mkdir -p /home/oracle/backup/arch/hot_20240115

# cp Data File, Temp File
! cp -av /u01/app/oracle/oradata/ora11g/system01.dbf /home/oracle/backup/arch/hot_20240115/
! cp -av /u01/app/oracle/oradata/ora11g/sysaux01.dbf /home/oracle/backup/arch/hot_20240115/
! cp -av /u01/app/oracle/oradata/ora11g/undotbs01.dbf /home/oracle/backup/arch/hot_20240115/
! cp -av /u01/app/oracle/oradata/ora11g/users01.dbf /home/oracle/backup/arch/hot_20240115/
! cp -av /u01/app/oracle/oradata/ora11g/example01.dbf /home/oracle/backup/arch/hot_20240115/
! cp -av /u01/app/oracle/oradata/ora11g/temp01.dbf /home/oracle/backup/arch/hot_20240115/


SQL> ALTER DATABASE END BACKUP;

SELECT a.file#, a.name, a.checkpoint_change#, b.status, b.change#, to_char(b.time,'yyyy-mm-dd hh24:mi:ss') time
FROM v$datafile a, v$backup b
WHERE a.file# = b.file#;
     FILE# NAME                                               CHECKPOINT_CHANGE# STATUS         CHANGE# TIME
---------- -------------------------------------------------- ------------------ ----------- ---------- -------------------
         1 /u01/app/oracle/oradata/ora11g/system01.dbf                   1147766 NOT ACTIVE     1147766 2024-01-15 04:27:12
         2 /u01/app/oracle/oradata/ora11g/sysaux01.dbf                   1147766 NOT ACTIVE     1147766 2024-01-15 04:27:12
         3 /u01/app/oracle/oradata/ora11g/undotbs01.dbf                  1147766 NOT ACTIVE     1147766 2024-01-15 04:27:12
         4 /u01/app/oracle/oradata/ora11g/users01.dbf                    1147766 NOT ACTIVE     1147766 2024-01-15 04:27:12
         5 /u01/app/oracle/oradata/ora11g/example01.dbf                  1147766 NOT ACTIVE     1147766 2024-01-15 04:27:12


# Control File Backup
SQL> ALTER DATABASE BACKUP CONTROLFILE TO '/home/oracle/backup/arch/hot_20240115/control01.ctl';


SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         48   52428800        512          1 YES       INACTIVE          1145387 15-JAN-24        1145390 15-JAN-24
         2          1         49   52428800        512          1 YES       INACTIVE          1145390 15-JAN-24        1146954 15-JAN-24
         3          1         50   52428800        512          1 NO        CURRENT           1146954 15-JAN-24     2.8147E+14


SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;


SQL> SELECT sequence#,name,first_change#,first_time,next_change#,next_time FROM v$archived_log;
 SEQUENCE# NAME                                               FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- -------------------------------------------------- ------------- ----------- ------------ ---------
        49 /home/oracle/arch1/arch_1_49_1154915502.arc              1145390 15-JAN-24        1146954 15-JAN-24
        49 /home/oracle/arch2/arch_1_49_1154915502.arc              1145390 15-JAN-24        1146954 15-JAN-24
        50 /home/oracle/arch1/arch_1_50_1154915502.arc              1146954 15-JAN-24        1147942 15-JAN-24
        50 /home/oracle/arch2/arch_1_50_1154915502.arc              1146954 15-JAN-24        1147942 15-JAN-24


# 리두에 대한 과거 정보를 확인 : 누적 히스토리
SELECT * FROM v$log_history;
     RECID      STAMP    THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ---------- ---------- ------------- ----------- ------------ ----------------- ---------
        49 1158293812          1         49       1145390 15-JAN-24        1146954            635002 07-DEC-23
        50 1158294760          1         50       1146954 15-JAN-24        1147942            635002 07-DEC-23
        51 1158294835          1         51       1147942 15-JAN-24        1148070            635002 07-DEC-23
        52 1158294836          1         52       1148070 15-JAN-24        1148089            635002 07-DEC-23
        53 1158294839          1         53       1148089 15-JAN-24        1148093            635002 07-DEC-23
...

 

<< 시나리오 9  >> 아카이브 파일이 다른 위치에 있을 경우 복구
  SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         51   52428800        512          1 NO        CURRENT           1147942 15-JAN-24     2.8147E+14
         2          1         49   52428800        512          1 YES       INACTIVE          1145390 15-JAN-24        1146954 15-JAN-24
         3          1         50   52428800        512          1 YES       ACTIVE            1146954 15-JAN-24        1147942 15-JAN-24


SQL> CREATE TABLE hr.new_2024 AS SELECT * FROM hr.employees;

SQL> ALTER SYSTEM SWITCH LOGFILE;

SQL> CREATE TABLE hr.old_2024 AS SELECT * FROM hr.employees;

SQL> ALTER SYSTEM SWITCH LOGFILE;

SQL> ALTER SYSTEM SWITCH LOGFILE;

SQL> SELECT * FROM v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS      FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ----------- ------------- ----------- ------------ ---------
         1          1         54   52428800        512          1 NO        CURRENT           1148093 15-JAN-24     2.8147E+14
         2          1         52   52428800        512          1 YES       INACTIVE          1148070 15-JAN-24        1148089 15-JAN-24
         3          1         53   52428800        512          1 NO        ACTIVE            1148089 15-JAN-24        1148093 15-JAN-24

SQL> SELECT * FROM v$archived_log;
>> 49~53 생성

SQL> SHUTDOWN IMMEDIATE


SQL> ! ls /home/oracle/arch*
/home/oracle/arch1:
arch_1_49_1154915502.arc  arch_1_50_1154915502.arc  arch_1_51_1154915502.arc  arch_1_52_1154915502.arc  arch_1_53_1154915502.arc

/home/oracle/arch2:
arch_1_49_1154915502.arc  arch_1_50_1154915502.arc  arch_1_51_1154915502.arc  arch_1_52_1154915502.arc  arch_1_53_1154915502.arc


SQL> ! mkdir -p /home/oracle/archive_file

# 아카이브 파일 위치 변경
SQL> ! mv /home/oracle/arch2/*.* /home/oracle/archive_file/

# 아카이브 파일 삭제
SQL> ! rm /home/oracle/arch1/*.*


SQL> ! ls /home/oracle/arch*
/home/oracle/arch1:

/home/oracle/arch2:

/home/oracle/archive_file:
arch_1_49_1154915502.arc  arch_1_50_1154915502.arc  arch_1_51_1154915502.arc  arch_1_52_1154915502.arc  arch_1_53_1154915502.arc



# 장애 유발
! rm /u01/app/oracle/oradata/ora11g/example01.dbf


SQL> STARTUP
Database mounted.
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/u01/app/oracle/oradata/ora11g/example01.dbf'

> 에러


SQL> SELECT * FROM v$recover_file;
     FILE# ONLINE  ONLINE_ ERROR                                                                CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ---------
         5 ONLINE  ONLINE  FILE NOT FOUND                                                             0


>시스템파일이 아니니 바로 오프라인
SQL> ALTER DATABASE DATAFILE 5 OFFLINE;


SQL> ALTER DATABASE OPEN;


# Hot Backup Restore
! cp -av /home/oracle/backup/arch/hot_20240115/example01.dbf /u01/app/oracle/oradata/ora11g/


# Recovery
SQL> RECOVER TABLESPACE example;
ORA-00279: change 1147766 generated at 01/15/2024 04:27:12 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_50_1154915502.arc
ORA-00280: change 1147766 for thread 1 is in sequence #50

Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO

ORA-00308: cannot open archived log '/home/oracle/arch2/arch_1_50_1154915502.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

ORA-00308: cannot open archived log '/home/oracle/arch2/arch_1_50_1154915502.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

> 자동으로 기존 위치에서 파일을 찾을 수 없어 에러


# 다시 Recovery
SQL> recover tablespace example;
ORA-00279: change 1147766 generated at 01/15/2024 04:27:12 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_50_1154915502.arc
ORA-00280: change 1147766 for thread 1 is in sequence #50

Specify log: {=suggested | filename | AUTO | CANCEL}
/home/oracle/archive_file/arch_1_50_1154915502.arc

ORA-00279: change 1147942 generated at 01/15/2024 04:32:40 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch2/arch_1_51_1154915502.arc
ORA-00280: change 1147942 for thread 1 is in sequence #51

Specify log: {=suggested | filename | AUTO | CANCEL}
/home/oracle/archive_file/arch_1_51_1154915502.arc

Log applied.
Media recovery complete.

> 다른 위치에 있는 아카이브 파일을 직접 파일 하나씩 순서대로 붙여 넣기


SQL> ALTER TABLESPACE example ONLINE;


SQL> SELECT COUNT(*) FROM hr.new_2024;
  COUNT(*)
----------
       107






지난 콜드백업 : 아카이브 파일 무관하게 과거로 돌아갈수있다
    > 불안전한 복구에 대한 대비
지난 hot백업파일 : 아카이브파일을 지웠다면 이미 필요없다

hot백업은 cancel base recovery 불가.