[오라클 DB백업과 복구]23.10.18_RMAN증분백업,flashback

윤성해·2023년 10월 18일
0

오라클 백업과 복구

목록 보기
12/13
post-thumbnail

백업과 복구 총정리

1. 백업

  • 사용자 관리 백업
    • hot backup (open)
    • cold backup (shutdown)
  • RMAN 백업
    • hot backup (open)
    • cold backup (mount)

✔️ 백업 범위에 대한 용어 3가지?
1. whole backup : datafile, controlfile, redo log file
2. full backup : 모든 datafile, controlfile
3. partial backup : 특정 테이블 스페이스만, control file만

2. 복구

  • 사용자 관리 복구
    • 완전 복구 : 장애가 나기 전 마지막 commit 시점으로 복구
    • 불완전 복구 : 과거의 특정 시점으로 db를 되돌리는 것
      • time base 불완전 복구
      • cancel base 불완전 복구
  • RMAN 복구
    • 완전 복구 : 장애가 나기 전 마지막 commit 시점으로 복구
    • 불완전 복구 : 과거의 특정 시점으로 db를 되돌리는 것
      • time base 불완전 복구
      • cancel base 불완전 복구

💡 복구 tip! 알맨의 복구 어드바이저 활용
1. list failure
2. advise failure
3. repair failure
위 명령어가 가능하려면 rman 백업본이 있어야한다.

➡️ 평상시 dba가 해야할 일?
1. rman> report need backup;
2. rman> report obsolete;
3. rman> delete obsolete;

✔️ RMAN으로 증분 백업 하기

  1. whole 백업
  2. full backup
  3. partial backup
  4. 증분백업 : 백업의 속도를 높이고, 저장공간을 절약하기 위해 변경된 부분만 백업하는 알맨의 백업방법

증분 백업의 유형 3가지

1. incremental level 0 백업 ( = full backup)

$ cd
$ mkdir hotbackup
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> backup incremental level 0 database 
       format '/home/oracle/hotbackup/%U';

%U는 오라클이 알아서 백업셋 이름 생성해라

2. incremental level 1 백업

RMAN> backup incremental level 1 database 
       format '/home/oracle/hotbackup/%U';

incremental level 0 백업 이후에 변경된 것만 백업

3. incremental level 1 cumulative 백업

RMAN> backup incremental level 1 cumulative database 
       format '/home/oracle/hotbackup/%U';

✅ 나중에 복구를 빠르게 하려고 cumulative 백업을 받는다.

incremental 백업은? 저장공간 확보하면서 백업 빠르게하려고

RMAN> backup database 
RMAN> backup incremental level ....database...;

더 빠른 증분백업

증분백업을 하는 이유는 백업을 빠르게 하려고 인데, 더 빠르게 하고 싶다면 다음과 같이 수행하면 됩니다.
💡 "block change tracking 기능"
증분 백업을 빠르게 수행하기 위해서 마지막 백업이후에 변경된 블럭에 대한 정보를 기록하는 기능

실습

1. 변경된 블럭에 대한 정보를 적는 파일을 생성

SYS> alter database enable block change tracking
      using file '/home/oracle/block_tracking.txt';

2. os 에서 위의 파일이 생성되었는지 확인

$ ls -l block_tracking.txt

-rw-r----- 1 oracle dba 11600384 10월 18 10:18 block_tracking.txt

3. 위의 파일에 대한 정보를 보는 뷰를 검색

SYS> select status, filename, bytes/1024/1024 as MB
      from  v$block_change_tracking;

ENABLED	/home/oracle/block_tracking.txt	11.0625 

4. 변경된 블럭이 있는지 조회

SELECT file#, avg(datafile_blocks),
        avg(blocks_read),
        avg(blocks_read/datafile_blocks)
        * 100 AS PCT_READ_FOR_BACKUP,
        avg(blocks)
 FROM v$backup_datafile
 WHERE used_change_tracking = 'YES'
 AND incremental_level > 0
 GROUP BY file#;
  1. scott 에서 아래의 update 를 수행하고 commit 한다.
SCOTT> update  emp
        set sal = 9000;
   commit;

alter  system  checkpoint; 
  1. incremental level 1 백업 수행
RMAN> backup incremental level 1 database 
       format '/home/oracle/hotbackup/%U';
  1. scott 에서 아래의 update 를 수행하고 commit 한다.
SCOTT> update emp
        set deptno = 20;
   
commit; 
alter  system  checkpoint; 
  1. incremental level 1 백업 수행
RMAN> backup incremental level 1 database 
       format '/home/oracle/hotbackup/%U';
  1. 변경된 블럭이 있는지 조회 (점심시간 문제)
SELECT file#, avg(datafile_blocks),
    avg(blocks_read),
    avg(blocks_read/datafile_blocks)
    * 100 AS PCT_READ_FOR_BACKUP,
    avg(blocks)
FROM v$backup_datafile
WHERE used_change_tracking = 'YES'
GROUP BY file#;

문제 다시 스캇 유저에서 emp 테이블의 월급을 전부 9000으로 변경하고 incremental level 1 백업 전후로 아래의 sql을 조회해서 변경된 블럭이 얼마나있는지 확인

  • 변경전 조회
SELECT file#, avg(datafile_blocks),
    avg(blocks_read),
    avg(blocks_read/datafile_blocks)
    * 100 AS PCT_READ_FOR_BACKUP,
    avg(blocks)
FROM v$backup_datafile
WHERE used_change_tracking = 'YES'
GROUP BY file#;

  • scott 에서 아래의 update 를 수행하고 commit 한다.
SCOTT> update emp
        set sal = 9000;

commit; 
alter  system  checkpoint; 
  • incremental level 1 백업 수행
RMAN> backup incremental level 1 database 
       format '/home/oracle/hotbackup/%U';
  • 다시 조회
SELECT file#, avg(datafile_blocks),
    avg(blocks_read),
    avg(blocks_read/datafile_blocks)
    * 100 AS PCT_READ_FOR_BACKUP,
    avg(blocks)
FROM v$backup_datafile
WHERE used_change_tracking = 'YES'
GROUP BY file#;

위 실습과 관련된 책 내용이 ws2 책의 p5-8~5-12 에 나옴

0   1   1   1   1  1c
월  화  수  목   금  토

1   1   1   1   1  1c
월  화  수  목   금  토

1   1   장애     
월  화   수   목   금   토

💡 수요일에 장애(파일깨짐)가 났다고 가정하면, 0 백업된거 가져오고 누적한게 1c, 그다음 1c 다음 장애난 전 월(1), 화(1)가져온다

➡️ 리눅스의 crontab을 이용하면 특정시간에 특정 쉘 스크립트가 수행되게 할 수 있다.

❓ ctwr

[orcl2:~]$ ps -f | grep ctwr
oracle    5950  5391  0 10:55 pts/1    00:00:00 grep ctwr

✔️ RMAN 백업 유형 2가지

  1. backup set : data file에서 data가 있는 블럭들만 찾아서 오라클 고유의 압축 기술을 이용해 백업한다. -> 저장공간이 절약되고 백업이 빠르다!
  2. image copy : data file을 os에서 copy 하듯이 백업하는것 -> 저장공간이 커지고 백업이 느리지만, 원본 데이터 파일을 그대로 백업하기 때문에 나중에 복구할 때 원본 data file을 그대로 복원하기가 편하다. (심각한 장애시)

⭐ 하나의 data file을 백업할 때

$ mkdir backup_copy 
RMAN> report schema;
RMAN> backup as copy datafile 
       '/u01/app/oracle/oradata/orcl2/system01.dbf'
       format '/home/oracle/backup_copy/system01.dbf';
or
RMAN> backup as copy datafile 4 -- 얘는 이미지카피
       format '/home/oracle/backup_copy/users01.dbf';

RMAN> list copy of dadtafile 4; -- image copy 한거 보여줘

-- RMAN> backup datafile 4; 얘는 backupset 유형!! 지금까지 우리 이렇게만 했었음  
-- RMAN> list backupset of datafile 4; -- backup set 한거 어딨는지 보여줘

✔️ 사용자관리 백업 할때는 begin, end 백업 날려야했었는데 알맨은 이렇게 하면 끝

⭐ 모든 data file들을 다 백업할 때

$ mkdir copy_full
RMANN> backup as copy database
        format '/home/oracle/copy_full/%U'

문제 ts23이라는 테이블 스페이스를 하나 생성하고, image copy본으로 백업받기

SYS> create tablespace ts23
      datafile '/u01/app/oracle/oradata/orcl2/ts200.dbf' size 5m;
RMAN> report schema;
RMAN> backup as copy datafile 
        '/u01/app/oracle/oradata/orcl2/ts200.dbf'
        format '/home/oracle/backup_copy/ts200.dbf';

✅ 파일명 잘못 지정함

RMAN> list copy of datafile 8;
or
RMAN> list copy of tablespace ts23;
List of Datafile Copies
=======================

Key     File S Completion Time     Ckp SCN    Ckp Time
------- ---- - ------------------- ---------- -------------------
3457    8    A 2023/10/18:11:22:26 1872319    2023/10/18:11:22:25
        Name: /home/oracle/backup_copy/ts200.dbf
        Tag: TAG20231018T112225        

✅ 잘 나옴!

📖 관련 책 내용


문제 users01.dbf 를 os에서 삭제후 startup force하고 알맨으로 복구

1. 지우기!

$ rm /u01/app/oracle/oradata/orcl2/users01.dbf

2. db 올려보기

startup force

3. 알맨 복구

RMAN> restore datafile 4;
RMAN> recover datafile 4;
media recovery complete, elapsed time: 00:00:00
Finished recover at 2023/10/18:11:32:26
RMAN> alter database open;
database opened

✔️ 백업 암호화

백업본이 유실이 되어 누군가가 그 백업본을 가지고 복구를 해서 우리회사의 data를 그대로 다 가져갈 수가 있다.

💡 백업본 암호화의 두가지 방법
1. 전자지갑을 사용한 투명한 암호화 : rman을 사용한 복구시에 전자지갑의 패스워드를 알아야 복구가 가능하다.
2. 패스워드를 사용한 암호화 : rman으로 복구할때마다 패스워드를 물어봅니다.

실습

전자지갑을 사용한 투명한 암호화 실습

1. 전자지갑을 생성한다.

    $ cd $ORACLE_HOME/network/admin
    $ vi sqlnet.ora
-- 아래 내용 붙여넣고 저장!
ENCRYPTION_WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
   (DIRECTORY=/u01/app/oracle/product/11.2.0/dbhome_1))) 

SYS> alter  system  set  encryption  key
      identified  by  oracle1234;   <----- 암호 

$ cd  $ORACLE_HOME
$ ls -l ewallet.p12
-rw-r--r-- 1 oracle dba 1573 10월 18 11:55 ewallet.p12

2. 전자지갑을 연다

SQL> alter system set encryption wallet open
       identified by oracle1234;
ERROR at line 1:
ORA-28354: wallet already open -- 이미 열려있다고 나옴       

3. Rman 에서 백업본을 암호화하겠다고 설정한다.

RMAN> configure encryption for database on;

4. 백업을 수행한다.

RMAN> backup datafile 5; 
Starting Control File and SPFILE Autobackup at 2023/10/18:11:57:35
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150545456_llylf0b0_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:11:57:37

ORA-28365: wallet is not open <- 전자지갑이 닫혀있으면 백업에 실패한다.

5. 전자지갑을 닫는다

SQL> alter system set encryption wallet close
       identified by oracle1234; 

6. 5번 파일을 os 에서 삭제한다.

SQL> select file_id, file_name  from dba_data_files;

$ rm  /u01/app/oracle/oradata/orcl2/example01.dbf


7. 전자지갑을 연다.

SQL>  alter system  set  encryption  wallet  open
      identified  by oracle1234;

8. 알맨에서 복원 작업을 한다.

SYS> alter tablespace example offline immediate;
RMAN> restore datafile  5;

9. 알맨에서 복구 작업을 한다.

RMAN> recover datafile  5; 

10. 전자지갑을 닫는다.

SQL> alter system  set encryption  wallet  close
       identified  by  oracle1234; 

11. 온라인시키기

SYS> alter tablespace example online;

점심시간 문제 다시 전자 지갑을 열고 data file 4번 파일을 알맨으로 백업합니다. 그리고 전자지갑을 닫기! os에서 users01.dbf를 삭제하고 rman으로 복구하기

2. 전자지갑을 연다

SQL> alter system set encryption wallet open
       identified by oracle1234;     

3. Rman 에서 백업본을 암호화하겠다고 설정한다.

RMAN> configure encryption for database on;

4. 백업을 수행한다.

RMAN> backup datafile 4; 
Starting Control File and SPFILE Autobackup at 2023/10/18:12:13:33
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150546414_llymby5n_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:12:13:35

ORA-28365: wallet is not open <- 전자지갑이 닫혀있으면 백업에 실패한다.

5. 전자지갑을 닫는다

SQL> alter system set encryption wallet close
       identified by oracle1234; 

6. 4번 파일을 os 에서 삭제한다.

SQL> select file_id, file_name  from dba_data_files;

$ rm  /u01/app/oracle/oradata/orcl2/users01.dbf

7. 전자지갑을 연다.

SQL>  alter system  set  encryption  wallet  open
      identified  by oracle1234;

8. 알맨에서 복원 작업을 한다.

SYS> alter tablespace users offline immediate;
RMAN> restore datafile  4;

9. 알맨에서 복구 작업을 한다.

RMAN> recover datafile  4; 

10. 전자지갑을 닫는다.

SQL> alter system  set encryption  wallet  close
       identified  by  oracle1234; 

11. 온라인시키기

SYS> alter tablespace users online;
select tablespace_name

패스워드를 이용한 암호화 실습

  1. RMAN 에서 5번 백업본을 지운다.
SYS> select file_id, file_name from dba_data_files;
5  /u01/app/oracle/oradata/orcl2/example01.dbf

RMAN> delete backup of datafile 5;
  1. 패스워드를 이용한 암호화가 되도록 RMAN 을 구성한다.
RMAN> set encryption on identified by oracle1234 only;
executing command: SET encryption
  1. 5번 파일을 다시 백업 받는다.
RMAN> backup  datafile  5;
Starting Control File and SPFILE Autobackup at 2023/10/18:13:46:37
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150551997_llyrsfrd_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:13:46:38
  1. 5번 파일을 OS 에서 삭제하고 shutdonw abort 한다.(순서상관없음)
shutdonw abor
$ rm /u01/app/oracle/oradata/orcl2/example01.dbf
  • 복원/복구 작업 수행
  1. startup -> 안올라옴 마운트상태로 됨
  2. 전자 지갑을 연다. <--- 패스워드를 알아야한다.
SQL>  alter system  set  encryption  wallet  open
      identified  by oracle1234;
  1. RMAN> set decryption identified by oracle1234; <-- decryption 할때도 패스워드를 알아야 한다.
  2. RMAN> restore datafile 5;
  3. RMAN> recover datafile 5;
  4. db 올리기
RMAN> alter database open; -- 완전복구라서 resetlogs 안써도 됨
database opened

문제 ts709 라는 tablespace (size10m)를 만들고, 패스워드를 지정해서 알맨으로 백업하고 ts709.dbf를 os에서 삭제한후 복구하기

1. tablespace 생성하기

create tablespace ts709
      datafile '/u01/app/oracle/oradata/orcl2/ts709.dbf' size 10m;
SYS> select file_id, file_name from dba_data_files;   
9  /u01/app/oracle/oradata/orcl2/ts709.dbf

2. 패스워드를 이용한 암호화가 되도록 RMAN 을 구성한다.

RMAN> set encryption on identified by oracle1234 only;

3. RMAN으로 ts709 백업

RMAN> backup tablespace ts709;

4. 5번 파일을 OS 에서 삭제하고 shutdonw abort 한다.(순서상관없음)

shutdonw abort
$ rm /u01/app/oracle/oradata/orcl2/ts709.dbf

5. 디비 올리기

SYS> startup 

6. 전자 지갑을 연다. 내려갔다 올라오면 닫혀있음

SQL>  alter system  set  encryption  wallet  open
      identified  by oracle1234;
RMAN> set decryption identified by oracle1234; 

7. 복원/복구

RMAN> restore tablespace ts709;
RMAN> recover tablespace ts709;

8. db 올리기

RMAN> alter database open; 
database opened

관련 책 내용 p.4-19

전자지갑 설정 해제

💡 다시 설정을 해제하고 알맨을 받겠습니다!

RMAN> set encryption on identified by oracle1234 only;
RMAN> show all;
CONFIGURE ENCRYPTION FOR DATABASE ON;
RMAN> CONFIGURE ENCRYPTION FOR DATABASE OFF;
RMAN> delete backup of tablespace example;
RMAN> delete backup of tablespace ts709;
  • 다시 백업 걸기
RMAN> backup tablespace example;
Starting Control File and SPFILE Autobackup at 2023/10/18:14:08:03
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150553283_llyt1mp8_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:14:08:04
RMAN> backup tablespace ts709;
Starting Control File and SPFILE Autobackup at 2023/10/18:14:08:08
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150553289_llyt1sgj_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:14:08:10
  • 전자지갑 사용 설정도 지운다.
-- 1. sqlnet.ora를 삭제
$ cd $ORACLE_HOME/network/admin
$ rm sqlnet.ora
>
-- 2. ewallet.p12를 ew로 이름 변경
$ cd $ORACLE_HOME
$ mv ewallet.p12 ew
-- 3. startup force
  • rman에서 백업
RMNA> backup database;
Starting Control File and SPFILE Autobackup at 2023/10/18:14:14:21
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_18/o1_mf_s_1150553662_llytfg9h_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/18:14:14:23

flashback 복구 기술 총정리

(worlshop2의 10장)
💡 flashback과 recover의 차이?
: recover 보다 flashback이 더 복구가 빠르다. 왜 더 빠르냐면, recover는 백업 받았던 파일들을 복원하고 복구하는 작업의 시간이 만만치 않게 오래 걸립니다. 그런데 flashback은 테이프를 뒤로 되감은 것 처럼 지금까지 해왔던 작업을 반대로 수행하는 기능!


✅ 예) 오늘 9:00에 유저를 drop 했는데 오전 9시 전으로 db를 되돌릴 때 가장 적당한 복구방법은?
1. 불완전복구
2. flashback database <- 답은 얘 !
✅ 위처럼 user나 table이 drop되었다면 flashback으로 가능하지만 file이 깨진것은 안된다.

✔️ flashback 기술들

                                 복구할때 사용하는 data
 1. flashback  database             flashback  db log
 2. flashback  drop                  휴지통
 3. flashback  table                 undo  data
 4. flashback  Query                 undo  data
 5. flashback  version Query         undo  data
 6. flashback  Transaction Query     undo  data
 7. flashback  Archive (Total recall) 
 별도의 테이블스페이스 완전하게 되돌리는 기능 

1. flashback table

💡 특정 테이블을 과거로 되돌리는 기능

  • flashback tavle로 복구는 어느 시점까지 가능한가?
SYS> show parameter undo_retention;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900 -- 900초! 15분

문제 한시간 전으로 테이블을 되돌릴 수 있도록 undo_retention를 설정 (3600초)

SYS> @para
NAME                           ISSYS_MOD
------------------------------ ---------
undo_retention                 IMMEDIATE

SYS> alter system set undo_retention=3600 ;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     3600

❓ 확실히 1시간이 보장되는것인가?
: 확인하려면 undo tablespace 의 retention이 guarantee로 되어있는지 확인하기

SYS> show parameter undo_tablespace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

SYS> select tablespace_name, retention
       from dba_tablespaces;


NOGUARANTEE 는 확실히 1시간 보장 못한다. 1시간 전으로 되돌릴수도 있고, 아닐수도 있다 라는 뜻! undo tablespace를 사용하는 다른 트랜잭션이 많지 않다면 1시간을 보장할 수 있지만, 만약 많다면 보장하지 못한다!

GUARANTEE 변경하기

무조건 한시간을 보장하게 하려면 다음과 같이 하면 된다

alter tablespace undotbs1 retention guarantee;
SYS> select tablespace_name, retention
       from dba_tablespaces;
UNDOTBS1                       GUARANTEE -- 바뀌었다 !

1시간 무조건 보장하는 것 ! 그런데 undo tablespace의 공간이 부족한 상태에서 다른 대용량 테이블을 지우는 delete문장을 실행하면 그 delete 문장이 실행할 수 있다.

문제 다시 1시간 보장 못하게 변경하기

SYS> alter tablespace undotbs1 retention noguarantee;
SYS> select tablespace_name, retention
       from dba_tablespaces;

flashback table 실습

  1. 현재 scn 번호를 확인한다.
    ➡️ scn ? system change number 의 약자(commit할 때 생성되는 번호)
SYS> select current_scn from v$database;
CURRENT_SCN
-----------
    1983694
  1. 현재 시간도 확인한다.
select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
18-OCT-23 03.10.13.582095 PM +09:00
  1. emp 테이블을 모두 delete 하고 commit 한다.
SCOTT>
delete from emp;
commit; 
  1. 데이타가 지워지기 전 시점으로 flashback 을 수행한다.
SCOTT> 
alter table emp enable row movement;
select table_name, row_movement
  from user_tables
  where table_name='EMP';
TABLE_NAME                     ROW_MOVE
------------------------------ --------
EMP                            ENABLED   -- ENABLED로 바꿔야함

-- 18-OCT-23 03.10.13.582095 PM +09:00
flashback table emp to timestamp to_timestamp('2023/10/18:15:10:13','RRRR/MM/DD:HH24:MI:SS');
Flashback complete.

SCOTT> select * from emp;
SCOTT> commit; -- select 확인되면 commit 꼭 해주기!

실습 dept 테이블을 delete 하고 salgrade 테이블도 delete 하고 commit 하시오 !
scn번호로 복구하기

1. scn 번호 확인

SYS> select  current_scn  from  v$database; 

CURRENT_SCN
-----------
    1983980

2. SCOTT에서 테이블 지우기

SCOTT> delete from dept;
SCOTT> delete from  salgrade; 
SCOTT> commit;  

3. scn 을 이용해서 dept 테이블과 salgrade 테이블이 delete 되기전으로 복구하시오 !

alter table dept enable row movement;
alter table salgrade enable row movement;

flashback table dept to scn 1983980;
flashback table salgrade to scn 1983980;

4. 확인하기

SCOTT @ orcl2 > select count(*) from dept;
  COUNT(*)
----------
         4

SCOTT @ orcl2 > select count(*) from salgrade;
  COUNT(*)
----------
         5

❓ 1983980의 시간을 확인하기

select scn_to_timestamp(1983980) from dual;
SCN_TO_TIMESTAMP(1983980)
---------------------------------------------------------------------------
18-OCT-23 03.16.54.000000000 PM

❓ 시간으로 scn 확인하기!

select timestamp_to_scn('18-OCT-23 03.16.54') from dual;
TIMESTAMP_TO_SCN('18-OCT-2303.16.54')
-------------------------------------
                              1845101

문제 sh계정으로 접속해서 sales 테이블을 모두 delete 하고 commit후에 flashback table로 복구하시오!

  1. 현재 scn 번호를 확인한다.
SYS> select current_scn from v$database;
CURRENT_SCN
-----------
    1984244
  1. 현재 시간도 확인한다.
select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
18-OCT-23 03.23.50.005881 PM +09:00
  1. sh의 sales 테이블을 모두 delete 하고 commit 한다.
SH>
delete from sales;
commit; 
  1. 데이터가 지워지기 전 시점으로 flashback 을 수행한다.
SH>
alter table sales enable row movement;
select table_name, row_movement
  from user_tables
  where table_name='SALES';
TABLE_NAME                     ROW_MOVE
------------------------------ --------
SALES                            ENABLED  

-- 18-OCT-23 03.23.50.005881 PM +09:00
flashback table sales to timestamp to_timestamp('2023/10/18:15:23:50','RRRR/MM/DD:HH24:MI:SS');
Flashback complete.

SCOTT> select * from emp;
SCOTT> commit; -- select 확인되면 commit 꼭 해주기!
alter tablespace temp add tempfile 위치 size

✏️ 데이터가 지워진 sales 테이블을 복구하는 방법
1. sales 테이블과 관련된 mview를 drop 시키고 다시 flashback 합니다.

select * 
 from dba_mviews 
 where owner='SH';

CAL_MONTH_SALES_MV
FWEEK_PSCAT_SALES_MV

SH> drop materiaized view CAL_MONTH_SALES_MV ;
SH> drop materiaized view FWEEK_PSCAT_SALES_MV ;

위 수행 후에 flashback 하고 다시 MV 만들어야 하는데 그래서 하기전에 생성 스크립트를 확보해놓아야 한다.
2. sales.csv를 카페에서 내려받아서 sqldeveloper 로 임폴트 합니다.
3. sales.dmp를 import 합니다. -> 이거 했음

[orcl2:~]$ ls -l sales.dmp
-rw-r--r-- 1 oracle oinstall 35840000 10월  6 16:03 sales.dmp
imp sh/sh tables=sales file=sales.dmp ignore=y
  1. time base 불완전 복구

2. flashback database

💡 db전체를 과거로 되돌린다.

  • flashback database 기능을 활성화 시킨다.
  1. flashback database 기능이 활성화 되어져있는지 확인
SYS> select  flashback_on  from  v$database; 

 FLASHBACK_ON
------------------
   NO
  1. shutdown immediate 를 하고 mount 로 올린다.
  2. flashback database 기능을 활성화 시킨다.
SQL> alter database flashback on;
  1. db 를 open 시키고 flashback 기능이 활성화 되어졌는지
    확인한다.
SQL> alter database open;

SQL> select flashback_on
      from v$database;

   FLASHBACK_ON
   ------------------
YES    <-------- flashback db 로그가 생기기 시작한다. 
  • 유져를 drop 하고 유져가 drop 되기 전 시점으로 flashback db 수행

1.SCN 번호 확인

select  current_scn  from v$database;
CURRENT_SCN
-----------
2051361
  1. 현재 시간 확인
select  systimestamp from  dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
18-OCT-23 04.25.04.813906 PM +09:00
  1. user drop하기
drop user scott cascade; 
  1. shutdown immediate
  2. startup mount
  3. flashback 하기(2가지 방법)
flashback database to scn 2051361;
flashback database to timestamp to_timestamp('2023/10/18:16:25:04', 'RRRR/MM/DD:HH24:MI:SS');
  1. alter database open resetlogs;
  2. scott 으로 접속이 잘되는지 확인한다.

문제 rman으로 fullbackup 수행

RMAN> backup database;

오늘의 마지막 문제 sh 계정을 drop하고 flashback database로 sh계정을 복구하기

✔️ 혹시 복구 못했을 때를 대비해서 sh계정을 유저레벨로 export 받기

$ exp sh/sh owner=sh file=sh.dmp;

1. flashback database 기능이 활성화 되어져있는지 확인

SYS> select  flashback_on  from  v$database; 

 FLASHBACK_ON
------------------
   NO

2. shutdown immediate 를 하고 mount 로 올린다.
3. flashback database 기능을 활성화 시킨다.

SQL> alter database flashback on;

4. db 를 open 시키고 flashback 기능이 활성화 되어졌는지 확인한다.

SQL> alter database open;

SQL> select flashback_on
      from v$database;

   FLASHBACK_ON
   ------------------
YES    <-------- flashback db 로그가 생기기 시작한다. 
  • 유져를 drop 하고 유져가 drop 되기 전 시점으로 flashback db 수행

1.SCN 번호 확인

select  current_scn  from v$database;
CURRENT_SCN
-----------
2052559

2. 현재 시간 확인

select  systimestamp from  dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
18-OCT-23 04.48.57.162659 PM +09:00

3. sh user drop하기

drop user sh cascade; 

4. shutdown immediate
5. startup mount
6. flashback 하기(2가지 방법)

flashback database to scn 2052559;
flashback database to timestamp to_timestamp('2023/10/18:16:48:57', 'RRRR/MM/DD:HH24:MI:SS');

7. alter database open resetlogs;
8. sh 으로 접속이 잘되는지 확인한다.

SYS @ orcl2 > conn sh/sh
Connected.
SH @ orcl2 > select count(*) from sales;

  COUNT(*)
----------
    918843

9. rman으로 fullbackup 수행

RMAN> backup database;
profile
Slow and steady wins the race.

0개의 댓글