#) 데이터베이스 인스턴스에 설치되어 활성화된 옵션 및 기능의 정보 확인
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 변경
=> 쿼리문 실행시 오류발생시 문장 확인하는 방법은? 오라클의 레퍼런스를 확인하는 방법이 제일 좋다
alter flashback archive fda1 modify quota 20m;
alter flashback archive fda1 modify quota 20m
*
ERROR at line 1:
ORA-55603: Invalid Flashback Archive command
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를 열었으니, 이전의 백업본은 의미가 없으니 백업본 다시 받기!
'Backup > FlashBack' 카테고리의 다른 글
블록 손상(block corruption) (1) | 2024.01.31 |
---|---|
Flashback Query, Flashback version query, Flashback Table (1) | 2024.01.31 |