✔️ 백업 범위에 대한 용어 3가지?
1.whole backup
: datafile, controlfile, redo log file
2.full backup
: 모든 datafile, controlfile
3.partial backup
: 특정 테이블 스페이스만, control file만
💡 복구 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;
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#;
- 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';
- scott 에서 아래의 update 를 수행하고 commit 한다.
SCOTT> update emp set deptno = 20; 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#;
문제
다시 스캇 유저에서 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
을 이용하면 특정시간에 특정 쉘 스크립트가 수행되게 할 수 있다.
[orcl2:~]$ ps -f | grep ctwr
oracle 5950 5391 0 10:55 pts/1 00:00:00 grep ctwr
backup set
: data file에서 data가 있는 블럭들만 찾아서 오라클 고유의 압축 기술을 이용해 백업한다. -> 저장공간이 절약되고 백업이 빠르다!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
패스워드를 이용한 암호화 실습
- 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;
- 패스워드를 이용한 암호화가 되도록 RMAN 을 구성한다.
RMAN> set encryption on identified by oracle1234 only; executing command: SET encryption
- 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
- 5번 파일을 OS 에서 삭제하고 shutdonw abort 한다.(순서상관없음)
shutdonw abor $ rm /u01/app/oracle/oradata/orcl2/example01.dbf
- 복원/복구 작업 수행
- startup -> 안올라옴 마운트상태로 됨
- 전자 지갑을 연다. <--- 패스워드를 알아야한다.
SQL> alter system set encryption wallet open identified by oracle1234;
- RMAN> set decryption identified by oracle1234; <-- decryption 할때도 패스워드를 알아야 한다.
- RMAN> restore datafile 5;
- RMAN> recover datafile 5;
- 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
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
(worlshop2의 10장)
💡 flashback과 recover의 차이?
: recover 보다 flashback이 더 복구가 빠르다. 왜 더 빠르냐면, recover는 백업 받았던 파일들을 복원하고 복구하는 작업의 시간이 만만치 않게 오래 걸립니다. 그런데 flashback은 테이프를 뒤로 되감은 것 처럼 지금까지 해왔던 작업을 반대로 수행하는 기능!
✅ 예) 오늘 9:00에 유저를 drop 했는데 오전 9시 전으로 db를 되돌릴 때 가장 적당한 복구방법은?
1. 불완전복구
2. flashback database <- 답은 얘 !
✅ 위처럼 user나 table이 drop되었다면 flashback으로 가능하지만 file이 깨진것은 안된다.
복구할때 사용하는 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)
별도의 테이블스페이스 완전하게 되돌리는 기능
💡 특정 테이블을 과거로 되돌리는 기능
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시간을 보장할 수 있지만, 만약 많다면 보장하지 못한다!
무조건 한시간을 보장하게 하려면 다음과 같이 하면 된다
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 실습
- 현재 scn 번호를 확인한다.
➡️scn
? system change number 의 약자(commit할 때 생성되는 번호)SYS> select current_scn from v$database; CURRENT_SCN ----------- 1983694
- 현재 시간도 확인한다.
select systimestamp from dual; SYSTIMESTAMP --------------------------------------------------------------------------- 18-OCT-23 03.10.13.582095 PM +09:00
- emp 테이블을 모두 delete 하고 commit 한다.
SCOTT> delete from emp; commit;
- 데이타가 지워지기 전 시점으로 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로 복구하시오!
- 현재 scn 번호를 확인한다.
SYS> select current_scn from v$database; CURRENT_SCN ----------- 1984244
- 현재 시간도 확인한다.
select systimestamp from dual; SYSTIMESTAMP --------------------------------------------------------------------------- 18-OCT-23 03.23.50.005881 PM +09:00
- sh의 sales 테이블을 모두 delete 하고 commit 한다.
SH> delete from sales; commit;
- 데이터가 지워지기 전 시점으로 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
💡 db전체를 과거로 되돌린다.
- flashback database 기능을 활성화 시킨다.
- flashback database 기능이 활성화 되어져있는지 확인
SYS> select flashback_on from v$database; FLASHBACK_ON ------------------ NO
- shutdown immediate 를 하고 mount 로 올린다.
- flashback database 기능을 활성화 시킨다.
SQL> alter database flashback on;
- 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
- 현재 시간 확인
select systimestamp from dual; SYSTIMESTAMP --------------------------------------------------------------------------- 18-OCT-23 04.25.04.813906 PM +09:00
- user drop하기
drop user scott cascade;
- shutdown immediate
- startup mount
- 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');
- alter database open resetlogs;
- 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;