Backup/FlashBack

Flashback Data Archive, Flashback Database

잇꼬 2024. 1. 31. 17:17
728x90
반응형
SMALL

#) 데이터베이스 인스턴스에 설치되어 활성화된 옵션 및 기능의 정보 확인 

select * from v$option;


Flashback Table ★ 
Flashback Database ★
Flashback Data Archive ★  



■  Flashback Data Archive 
- 기록에 대한 데이터 저장소, DML 작업
- FBDA 백그라운드 프로세스를 사용하여 flashback data archive에 대한 활성화되어 있는 테이블의 데이터를 자동으로 추적하고 아카이브 한다.
=> 데이터를 저장하기 위해서는 별도의 공간이 필요하다.(tablespace 필요하다) 
=> alert_ora11g.log 계속적으로 확인해줘야 한다!

# fda 를  저장할 테이블스페이스 생성 
=> 공간 용량 관리 필수! ★, alert_ora11g로 공간관리 확인할 것!

create tablespace fda_tbs datafile '/u01/app/oracle/oradata/ora11g/fda_tbs01.dbf' size 10m autoextend on next 1m;



# flashback data archive 생성
=> 기록에 대한 데이터 저장소사용하겠다는 의미
=> 1년동안 10m 용량으로 fda1라는 이름의 저장소를 사용할거다!

create flashback archive fda1 tablespace fda_tbs quota 10m retention 1 year;


#) flashback archive 확인

select flashback_archive_name, create_time, status from dba_flashback_archive;


FLASHBACK_ARCHIVE_NAME
----------------------------------------
CREATE_TIME                                                                 STATUS
--------------------------------------------------------------------------- -------
FDA1
31-JAN-24 09.59.33.000000000 AM

#) 샘플 테이블 생성 

create table hr.emp_fda as select * from hr.employees;


Table created.

# fda 대상 테이블 활성화
#) 샘플테이블 추적할 수 있게 활성화 시키기

alter table hr.emp_fda flashback archive fda1;


#) flashback archive 활성화 되어있는 테이블 확인하기

select * from dba_flashback_archive_tables;


TABLE_NAME                     OWNER_NAME
------------------------------ ------------------------------
FLASHBACK_ARCHIVE_NAME                   ARCHIVE_TABLE_NAME
---------------------------------------- -----------------------------------------------------
STATUS
-------------
EMP_FDA                        HR
FDA1                                     SYS_FBA_HIST_89047
ENABLED

#1) 수정하기전 확인해보기

select employee_id, salary from hr.emp_fda where department_id = 20;


EMPLOYEE_ID     SALARY
----------- ----------
        201      14300
        202       6600

#2) 수정후 저장

update hr.emp_fda set salary = 3000 where department_id = 20;
commit;


Commit complete.

#3) 수정 후 확인

select employee_id, salary from hr.emp_fda where department_id = 20;

 

EMPLOYEE_ID     SALARY
----------- ----------
        201       3000
        202       3000

#) 시간 확인해보기
=> as of timestamp (systimestamp - interval '3' minute) : undo 에서 확인하는 것이 아니고 flashback archive 에서 확인

select employee_id, salary from hr.emp_fda as of timestamp (systimestamp - interval '3' minute);


EMPLOYEE_ID     SALARY
----------- ----------
        201      14300
        202       6600

#) 프로세스 확인

! ps -ef | grep fbda


oracle1   4279     1  0 09:59 ?        00:00:00 ora_fbda_ora11g
oracle1   4602  3948  0 10:13 pts/0    00:00:00 /bin/bash -c  ps -ef | grep fbda
oracle1   4604  4602  0 10:13 pts/0    00:00:00 grep fbda

#) 순수하게 하나만 보고 싶을 경우 
=> 뒤에 | grep -v grep

! ps -ef | grep fbda | grep -v grep


oracle1   4279     1  0 09:59 ?        00:00:00 ora_fbda_ora11g

#)  샘플테이블 삭제 후 저장

delete from hr.emp_fda;
commit;


Commit complete.

#) 삭제한 테이블 확인해보기

select count(*) from hr.emp_fda as of timestamp (systimestamp - interval '3' minute);



  COUNT(*)
----------
       107

#) 데이터 다시 로드 후 저장하기

insert into hr.emp_fda select * from hr.emp_fda as of timestamp (systimestamp - interval '5' minute);
commit;


select count(*) from hr.emp_fda;

 

# 해당 테이블의 기록을 비활성화하기

 alter table hr.emp_fda no flashback archive;


Table altered.

#) 확인

select * from dba_flashback_archive_tables;


no rows selected

#) flashback archive 확인

select * from dba_flashback_archive;


OWNER_NAME                     FLASHBACK_ARCHIVE_NAME                   FLASHBACK_ARCHIVE#
------------------------------ ---------------------------------------- ------------------
RETENTION_IN_DAYS CREATE_TIME
----------------- ---------------------------------------------------------------------------
LAST_PURGE_TIME                                                             STATUS
--------------------------------------------------------------------------- -------
SYS                            FDA1                                                      1
              365 31-JAN-24 09.59.33.000000000 AM
31-JAN-24 09.59.33.000000000 AM

# fda retention 시간 변경 

alter flashback archive fda1 modify retention 2 year;


Flashback archive altered.

#) 시간 변경 확인

select * from dba_flashback_archive;



OWNER_NAME                     FLASHBACK_ARCHIVE_NAME                   FLASHBACK_ARCHIVE#
------------------------------ ---------------------------------------- ------------------
RETENTION_IN_DAYS CREATE_TIME
----------------- ---------------------------------------------------------------------------
LAST_PURGE_TIME                                                             STATUS
--------------------------------------------------------------------------- -------
SYS                            FDA1                                                      1
              730 31-JAN-24 09.59.33.000000000 AM
31-JAN-24 09.59.33.000000000 AM

#) flashback archive 용량 확인방법

select * from dba_flashback_archive_ts;



FLASHBACK_ARCHIVE_NAME                   FLASHBACK_ARCHIVE# TABLESPACE_NAME
---------------------------------------- ------------------ ------------------------------
QUOTA_IN_MB
----------------------------------------
FDA1                                                      1 FDA_TBS
10

#) fda quota 변경

=> 쿼리문 실행시 오류발생시 문장 확인하는 방법은? 오라클의 레퍼런스를 확인하는 방법이 제일 좋다

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-FLASHBACK-ARCHIVE.html#GUID-285814C9-06ED-4BDB-BB19-E2BA6505C850

alter flashback archive fda1 modify quota 20m;


alter flashback archive fda1 modify quota 20m
                                    *
ERROR at line 1:
ORA-55603: Invalid Flashback Archive command

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-FLASHBACK-ARCHIVE.html#GUID-285814C9-06ED-4BDB-BB19-E2BA6505C850

alter flashback archive fda1 modify tablespace fda_tbs quota 20m;


#) 용량 변경 확인

select * from dba_flashback_archive_ts;


# fda 데이터 지우기

alter flashback archive fda1 purge before timestamp(systimestamp -interval '1' day);


# fda 삭제

drop flashback archive fda1;


#) 확인

select * from dba_flashback_archive;

 


■ Flashback Database (=: 불안전한 복구이나, 백업을 이용하지 않음)
- 데이터베이스에 대해 되감기 버튼처럼 작동한다.(redo 정보를 활용, archive 정보)
- 이전 데이터로 되감기 하기 위해서 redo 정보, 아카이브 정보를 이용한다.
- archive log mode 에서만 수행된다.(archive log mode 에서만 가능)
- RVWR 백그라운드 프로세스에서  수행된다. 

archive log list


# flashback 할 수 있는 시간을 분단위로 설정

show parameter db_flashback_retention_target


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440 (하루)

#) 변경 후 확인

alter system set db_flashback_retention_target = 2880 scope=both;
show parameter db_flashback_retention_target



# flashback database 활성화
=> 불안전한 복구 방식, DB를 resetlogs로 열어야 함/백업본을 사용하지 않는것뿐 
=> 보편적으로는 clone DB로 활용할 것!

alter database flashback on;


# 활성화 확인

select flashback_on from v$database;



참고) truncate 잘못했을경우 -> backup본+time활용 -> cold backup/rman backup -> (용량이 크다면) clone DB 생성후 복구

#) 샘플 테이블생성 후 확인

create table hr.jan as select * from hr.employees;
select count(*) from hr.jan;

#) 확인

select * from v$flash_recovery_area_usage;

show parameter db_recovery_file_dest


#) 시간 확인하기

select systimestamp from dual;


#) 포인트 생성

create restore point before_hr_jan_trunc;



Restore point created.

#) 생성 확인

select * from v$restore_point;


#) 테이블 truncate 후 확인

truncate table hr.jan;
 select count(*) from hr.jan;


=> 면접질문) 1,000만건 data 삭제할때 어떤 명령어를 사용할 것인가? -> (정답)truncate

delete drop truncate
data 삭제
스토리지 그대로
data rollback 가능
user commit
table 전체, 공간, 객체 삭제
data rollback 불가
스토리지 삭제
auto commit
data만, index 삭제
스토리지 삭제(테이블 스키마 유지)
data rollback 불가능
auto commit


#) DB 내리기

shutdown immediate


#) mount까지 올리기

startup mount


#) 복구하기

flashback database to restore point before_hr_jan_trunc;


#) 읽기모드로 open 하기

alter database open read only;

 

#) data 확인해보기

select count(*) from hr.jan;



#) DB 내리기

shutdown immediate


#) DB mount 단계로 올리기

startup mount


#) resetlog로 open 하기

alter database open resetlogs;



#) redo 정보 확인

SELECT a.group#, b.sequence#, a.member, b.bytes/1024/1024 MB, b.archived, b.status, b.first_time, b.first_change#, b.next_change#
FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;

=> resetlog로 DB를 열었으니, 이전의 백업본은 의미가 없으니 백업본 다시 받기! 

728x90
반응형
LIST

'Backup > FlashBack' 카테고리의 다른 글

블록 손상(block corruption)  (1) 2024.01.31
Flashback Query, Flashback version query, Flashback Table  (1) 2024.01.31