Oracle/etc

flashback

pbj1102 2022. 1. 26. 09:48
반응형

Flashback( default : 사용안함 )
- table 의 특정 부분만 찾아서 변경하는 방법
- 이기능은 Undo Data 의 정보를 이요함.
- 만약 Undo Segment를 다른 Transaction 에서 재사용하면 이기능으로 Flash back 할수 없음
- table 의 구조가 변경되어도 Flashback 할수 없음

- 9i에서 지원되는 Flashback Query + 10g지원하는 Flashback 기능을 통하여 특정 시점의 
특정 Segment 데이터까지도 Online 복구가 가능하게 되었음.


△ 9i : Flashback query

△ 10g : Flashback Database
              Flashback Drop
              Flashback Version Query
              Flashback Transaction Query
              Flashback Table


* 종류 
1) Row level Flashback : 특정 row 만 과거시점으로 되돌리기 기능, commit 된 데이터만 flashback 할수 있음.
2) table level Flashback : 특정 table 만 과거 시점으로 되돌리기 기능.
3) database level Flashback : 테이터베이스 전체를 특정 시점으로 되돌리는 기능, 불안전 복구와 유사함.






* 기존 복구 방식.
Redo, Archive Log 를 이용한 복구, 복구 후 재차 복구 불가능 (resetlogs)




* Flashback database 복구 방식.
1) Flashback Log를 이용한 복구, 필요에 따라 Redo log 사용, 복구 후 재차 복구 가능(Flashbackup 쿼리 재차 수행가능)

*Flashback Log File 이란 ?
- 오라클 Database 를 구성하는 Block(변경 전 Block)을 저장하는 로그 파일.
- 10g에서 새롭게 소개 됨 -> 데이터베이스 복구영역 (database recovery area) 에 생성됨

* 기존 Redo log 차이점.
- Redo log 의 경우 archive 기능이 있었음.
- Flashback log 의 경우 archive 기능이 따로 제공될 필요가 없음. 
(db_recovery_file_dest, db_recovery_file_dest_size)
물리적인 database 복구는 사용되지 못함.



* 주의점.
- mount 상태에서 작업  (flashback mode on , 테이블 레벨 복구시)
- dba 권한을 가지고 수행. (권한을 부여하면 구지 dba 권한이 필요치 않음)
- 불완전 복구 처럼 특정 시간으로 돌림 -> resetlogs 오픈 필요. (database level 복구시)
- drop useer / truncate table 장애시 -> flashback database 명령어 사용.



* Flashback 명령어를 수행할수 없는 경우
- 물리적 장애 -> 파일이 삭제된 경우
- system tablespace에 있던 테이블이 삭제되면 flashback table to before drop 안됨
- control file 재생성하면 flashback database 명령어 사용 못함
- tablespace drop 되면 flashback 명령어로 복구 안됨
- datafile shrunk 되면 flashback database 명령어로 복구 못함
- alter table 로 테이블 구조 변경시 version query 로 복구 안됨
- system tables와 통계정보는 flashback 명령어로 복구 안됨
- purge 된 테이블도 flashback 명령어로 복구 안됨
- 테이블과 별도로 삭제된 인덱스는 복구 안됨



---------------------------------------------------------------------
1. 아카이브 모드, 플래쉬백 모드 확인 쿼리
---------------------------------------------------------------------



SYS@ORCL AS SYSDBA> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/oradata/orcl
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3




SYS@ORCL AS SYSDBA> select flashback_on from v$database;

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




SYS@ORCL AS SYSDBA> alter database flashback on; << Flashback 모드 활성화

Database altered.

 
SYS@ORCL AS SYSDBA> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES









---------------------------------------------------------------------
2. Undo 확인
---------------------------------------------------------------------



SYS@ORCL AS SYSDBA> show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1




---------------------------------------------------------------------
3. Parameter 설정.
---------------------------------------------------------------------
/u01/app/oracle/product/11.2.0/dbs



db_recovery_file_dest : 파일 저장 경로
db_recovery_file_dest_size : 공간 크기 (기본값 2G)
db_flashback_retention_target : 분단위 파라미터. 지정한 시간안에 복구가능. 시간을 많이 주면 용량이 커짐


저장되는 파일들은

- flashback log file (.flb)
- archive redo log file
- RMAN backup file



DB_RECOVERY_FILE_DEST 크기 조회
select * from v$recovery_file_dest ;



DB_RECOVERY_FILE_DEST 사용량조회
select * from v$flash_recovery_area_usage ;



DB_RECOVERY_FILE_DEST 크기 변경
alter system set db_recovery_file_dest_size=크기 ;




SELECT object_type, message_type, message_level, reason, suggested_action 
FROM dba_outstanding_alerts ;






ex) 
---------------------------------------------------------------------
파라미터 파일 확인 및 수정
---------------------------------------------------------------------

vi /u01/app/oracle/product/11.2.0/dbs/initORCL.ora

*.db_flashback_retention_target=30  
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=5368709120



SYS@ORCL AS SYSDBA> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES





---------------------------------------------------------------------
#flashback log 확인
---------------------------------------------------------------------

[oracle@DBTEST flashback]$ pwd
/u01/app/oracle/flash_recovery_area/ORCL/flashback

[oracle@DBTEST flashback]$ ll -al
total 15584
drwxr-x--- 2 oracle oinstall     4096 Mar 25 11:45 .
drwxr-x--- 3 oracle oinstall     4096 Mar 25 11:45 ..
-rw-r----- 1 oracle oinstall 15949824 Mar 25 11:46 o1_mf_ch99lb41_.flb






---------------------------------------------------------------------
# DB_RECOVERY_FILE_DESC 크기 조회
---------------------------------------------------------------------

SYS@ORCL AS SYSDBA> select * from v$recovery_file_dest;

NAME                                SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------------------------------- ----------- ---------- ----------------- ---------------
/u01/app/oracle/flash_recovery_area  5368709120   15941632                 0               1







---------------------------------------------------------------------
# DB_RECOVERY_FILE_DEST 사용량 조회
---------------------------------------------------------------------

SYS@ORCL AS SYSDBA> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                          0                         0               0
REDO LOG                              0                         0               0
ARCHIVED LOG                          0                         0               0
BACKUP PIECE                          0                         0               0
IMAGE COPY                            0                         0               0
FLASHBACK LOG                        .3                         0               1
FOREIGN ARCHIVED LOG                  0                         0               0

7 rows selected.





---------------------------------------------------------------------
# DB_RECOVERY_FILE_DEST 크기 변경
---------------------------------------------------------------------

SYS@ORCL AS SYSDBA> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=4G;

System altered.

SYS@ORCL AS SYSDBA> 
SYS@ORCL AS SYSDBA> select * from v$recovery_file_dest;

NAME                                SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------------------------------- ----------- ---------- ----------------- ---------------
/u01/app/oracle/flash_recovery_area  4294967296   15941632                 0               1






---------------------------------------------------------------------
# Flashback Data Archive - 11g
---------------------------------------------------------------------

10g
DML 처리중 undo Data 를 사용해 다른 사용자가 undo segment 를 덮어 쓴다면 Flashback 기능을 사용 할 수 없음.


11g 이후
online redo log archiving 같이
undo segment 에 있는 commit된 내용을 특정 테이블 스페이스에 archaving 해서 영구적으로 저장하는 기능.
즉. Flashback Data Archive(FBDA)기능이 추가됨




*Flashback Data Archive(FBDA) 백그라운드 프로세스 원리
- Undo Segment 내용을 비정기적으로 특정 테이블 스페이스에 저장.
- 기본 disable
- undo segment 내용을 모두 기록하기전에는 Undo Segment 절대 재활용하지 않음.
특정시간(기본값 5분) 이 지나면 내려씀


1) DML (DB Buffer Cache 데이터 변경)
2) Undo Segment 
3) FBDA





*Flashback Data Archive(FBDA) 활성화 
1) Flashback history table 지정할 테이블스페이스 생성
2) Flashback data archive 관리할 관리자 계정 생성
3) 관리자 계정에 권한 할당
> grant resource ,connect to 계정
> grant flashback archive administer to 계정;
-> flashback archive administer 권한 : 
flashback data archive 를 관리하기 위한 권한
flashback history table 을 생성하고 관리 할 수 있음.
retention time 도 관리 가능.
4) 관리자 계정으로 로그인 후 Flashback history table 생성
> create flashback archive flashback_archive_이름 tablesapce 테이블페이스 명  retention 기간 day;
> 30 day 입력시 history table 에 저장되는 undo data 의 저장기간이 30일. (30일 지나면 삭제)


상태 조회
SELECT owner_name, flashback_archive_name, retention_in_days, status
FROM dba_flashback_archive ;


일반계정에서 flashback history table 을 사용하려면 권한이 필요.
> grant flashback archive on tablespace명칭 to 계정;

테이블 생성시 'flashback archive 테이블스페이스명칭' 
> create table 테이블명 () FLASHBACK ARCHIVE 테이블스페이스명칭;


Flashback Data Archive 사용 테이블 삭제
> alter table 테이블명 no flashback archive;
> drop table 테이블명


Flashback history table 조회
> select * from dba_flashback_archive_tables;



ex)
----------------------------------------------------------
# flashback history table 저장할 TBS 선정
----------------------------------------------------------

SYS@ORCL AS SYSDBA> select tablespace_name, bytes/1024/1025 MB, file_name from dba_data_files;

TABLESPACE_NAME         MB FILE_NAME
--------------- ---------- ------------------------------------------------
RC_TBS01         9.9902439 /u01/app/oracle/oradata/orcl/rc_tbs.dbf
TBS_TEST         99.902439 /u01/app/oracle/oradata/orcl/TBS_TEST01.dbf       << flashback history table 저장할 TBS 
TBS_SCOTT_IDX   199.804878 /u01/app/oracle/oradata/orcl/scott_idx01.dbf
DATA01           99.902439 /u01/app/oracle/oradata/orcl/DATA01.dbf
TBS_TEST        4.99512195 /u01/app/oracle/oradata/orcl/TBS_TEST02.dbf
PBJ_TEMP         99.902439 /u01/app/oracle/oradata/orcl/pbj_temp01.dbf
TBS_RMAN         9.9902439 /u01/app/oracle/oradata/orcl/TBS_RAMN01.dbf
TBS_D           78.9229268 /u01/app/oracle/oradata/orcl/tbs_d_01.dbf
TBS_C            99.902439 /u01/app/oracle/oradata/orcl/tbs_c_01.dbf
UNDOTBS2        84.9170732 /u01/app/oracle/oradata/orcl/undotbs02_2.dbf
UNDOTBS2        84.9170732 /u01/app/oracle/oradata/orcl/undotbs02.dbf
TBS_B           49.9512195 /u01/app/oracle/oradata/orcl/tbs_b_01.dbf
TBS_A            99.902439 /u01/app/oracle/oradata/orcl/tbs_a_02.dbf
TBS_A            99.902439 /u01/app/oracle/oradata/orcl/tbs_a_01.dbf
USERS           364.643902 /u01/app/oracle/oradata/orcl/users01.dbf
UNDOTBS1         999.02439 /u01/app/oracle/oradata/orcl/undotbs01.dbf
SYSAUX          1498.53659 /u01/app/oracle/oradata/orcl/sysaux01.dbf
SYSTEM           999.02439 /u01/app/oracle/oradata/orcl/system01.dbf






----------------------------------------------------------
# flash data archive 관리할 계정 생성 및 권한 부여
----------------------------------------------------------

SYS@ORCL AS SYSDBA> create user fda
  2  identified by fda
  3  default tablespace TBS_TEST;

User created.

SYS@ORCL AS SYSDBA> grant resource, connect to fda;

Grant succeeded.

SYS@ORCL AS SYSDBA> grant flashback archive administer to fda;

Grant succeeded.





----------------------------------------------------------
# 관리계정( fda ) 에서 flashback history table 생성 및 flashback data archive 상태 조회
----------------------------------------------------------

SYS@ORCL AS SYSDBA> conn fda/fda
Connected.

FDA@ORCL > create flashback archive fda01 tablespace TBS_TEST retention 30 day;

Flashback archive created.



FDA@ORCL > select owner_name, flashback_archive_name, retention_in_days, status
       from dba_flashback_archive;

OWNER_NAME FLASHBACK_ RETENTION_IN_DAYS STATUS
---------- ---------- ----------------- ----------
FDA        FDA01                     30






----------------------------------------------------------
flashback history table 을 생성 및 조회
----------------------------------------------------------

*테이블 ftest1 생성 후 flashback datqa archive 를 fda01 로 사용하도록 설정.
FDA@ORCL > create table ftest1(no number, name varchar2(10)) flashback archive fda01;

Table created.


FDA@ORCL > select * from dba_flashback_archive_tables;

TABLE_NAME OWNER_NAME FLASHBACK_ ARCHIVE_TABLE_NAME   STATUS
---------- ---------- ---------- -------------------- ----------
FTEST1     FDA        FDA01      SYS_FBA_HIST_90174   ENABLED





----------------------------------------------------------
flashback history table drop
----------------------------------------------------------

* 삭제가 되지 않음. -> flashback archive 기능이 활성중임.

FDA@ORCL > drop table ftest1;
drop table ftest1
           *
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table



FDA@ORCL > alter table ftest1 no flashback archive;

Table altered.

FDA@ORCL > 
FDA@ORCL > 
FDA@ORCL > select * from dba_flashback_archive_tables;

no rows selected

FDA@ORCL > drop table ftest1;

Table dropped.














---------------------------------------------------------------------
##  row level flashback   ##
- 테이블의 데이터 update 시 복구.

1) 데이터 생성
2) 잘못된 update
3) Flashback version query 이용한 scn 확인
4) scn 을 통한 시간 확인
5) transaction query 를 통해 복구 update 문 도출
6) 복구
---------------------------------------------------------------------

CREATE TABLE tb (
    user_id VARCHAR2(20)  NOT NULL,
    user_nm VARCHAR2(20)  NOT NULL,
    email   VARCHAR2(100) NOT NULL,
    CONSTRAINT pk_tb_id PRIMARY KEY (user_id)
);



INSERT INTO tb (user_id, user_nm, email) VALUES ('test01', 'user01', 'test1');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test02', 'user02', 'test2');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test03', 'user03', 'test3');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test04', 'user04', 'test4');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test05', 'user05', 'test5');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test06', 'user06', 'test6');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test07', 'user07', 'test7');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test08', 'user08', 'test8');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test09', 'user09', 'test9');
INSERT INTO tb (user_id, user_nm, email) VALUES ('test10', 'user10', 'test10');

 
FDA@ORCL > update tb set user_nm='PBJ02' WHERE USER_ID='test02';

1 row updated.

FDA@ORCL > update tb set user_nm='PBJ03' WHERE USER_ID='test03';

1 row updated.

FDA@ORCL > COMMIT;

Commit complete.





Flashback version query 



* 제일 아래가 오래된 것. -> 맨 위가 최근.

FDA@ORCL > select versions_startscn startscn, versions_endscn endscn,
  2     versions_xid, versions_operation operation, user_id
  3    from tb versions between scn minvalue and maxvalue
  4   where email='test5';

  STARTSCN     ENDSCN VERSIONS_XID     O USER_ID
---------- ---------- ---------------- - --------------------
14695595906832            05000800BE190000 U test05
14695595802673 14695595906832  04001900B6120000 I test05


Flashback version query 사용. U : update, I = Insert
--------------------------------------------------------------
select versions_startscn startscn, versions_endscn endscn,
versions_xid, versions_operation operation, user_id
from tb_user versions between scn minvalue and maxvalue
where email='test2@beany.co.kr';
--------------------------------------------------------------- 






*scn 을 시간으로 확인.
select scn_to_timestamp(14695595802673) from dual;




FDA@ORCL > select scn_to_timestamp(14695595802673) from dual;

SCN_TO_TIMESTAMP(14695595386595)
---------------------------------------------------------------------------
2016/03/25 16:49:06





*변경사항을 취소 시켜 이전 값으로 돌리기 ( 권한필요 > grant select any transaction to 유저;)

TRANSACTION QUERY 
---------------------------------------------------------
SELECT undo_sql 
FROM flashback_transaction_query
WHERE table_name='TB'
AND commit_scn between  14695595802673 and 14695595906832
ORDER BY start_timestamp desc ;
---------------------------------------------------------


update 문이 보여야하는데... 보이지 않는다... 멀까.









## 해당 옵션은 flashback 기능이 꺼져도 undo 에 데이터가 있다면 복구가 가능하다.

실질적으로 운영중 개발자의 실수로 인해 데이터가 drop, delete 의 경우 timestamp 를 이용하여

데이터 복구를 많이 한다. 
---------------------------------------------------------------------
##  Table level Flashback   ##  
Truncate 장애 복구
scott.ft 테이블의 데이터 truncate 시 복구.
---------------------------------------------------------------------
1) timestamp 이용
1-1) 테이블 생성 및 데이터 입력
1-2) 시점 확인 
1-3) truncate
1-4) shutdown -> mount
1-5) open resetlogs
1-6) flashback 을 이용한 특정 시점 장애복구

2) scn 이용
2-1) 테이블 생성 및 데이터 입력
2-2) scn 확인
2-3) update 
2-4) flashback 을 이용한 scn 시점으로 복구.

3) drop 된 테이블 복구. ( recyclebin : 휴지통 )










----------------------------------------------------------------------------------------
 timestamp 이용 
----------------------------------------------------------------------------------------

CREATE TABLE tb_user (
    user_id VARCHAR2(20)  NOT NULL,
    user_nm VARCHAR2(20)  NOT NULL,
    email   VARCHAR2(100) NOT NULL,
    CONSTRAINT pk_user_id PRIMARY KEY (user_id)
);



 INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test01', 'user01', 'test1@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test02', 'user02', 'test2@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test03', 'user03', 'test3@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test04', 'user04', 'test4@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test05', 'user05', 'test5@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test06', 'user06', 'test6@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test07', 'user07', 'test7@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test08', 'user08', 'test8@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test09', 'user09', 'test9@beany.co.kr');
INSERT INTO tb_user (user_id, user_nm, email) VALUES ('test10', 'user10', 'test10@beany.co.kr');

 

SCOTT@ORCL > DELETE FROM tb_user WHERE user_id IN ('test02', 'test08', 'test10');

3 rows deleted.

SCOTT@ORCL > 
SCOTT@ORCL > commit;

Commit complete.

SCOTT@ORCL > 
SCOTT@ORCL > 
SCOTT@ORCL > 
SCOTT@ORCL > select * from tb_user;

USER_ID  USER_NM  EMAIL
-------- -------- -------------------------
test01   user01   test1@beany.co.kr
test03   user03   test3@beany.co.kr
test04   user04   test4@beany.co.kr
test05   user05   test5@beany.co.kr
test06   user06   test6@beany.co.kr
test07   user07   test7@beany.co.kr
test09   user09   test9@beany.co.kr

7 rows selected.





@@@ << 중요 많이 사용함

create table [복구된 테이블]

select * from [복구할 테이블] OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '3' MINUTE);

 -- 3분전 데이터로 

 -- MINUTE 대신 DAY 가능

 


----------------------------------------------------------------------------------------
3분전 데이터 확인. 
----------------------------------------------------------------------------------------


SELECT *FROM  tb_user AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '3' MINUTE);

USER_ID  USER_NM  EMAIL
-------- -------- -------------------------
test01   user01   test1@beany.co.kr
test02   user02   test2@beany.co.kr
test03   user03   test3@beany.co.kr
test04   user04   test4@beany.co.kr
test05   user05   test5@beany.co.kr
test06   user06   test6@beany.co.kr
test07   user07   test7@beany.co.kr
test08   user08   test8@beany.co.kr
test09   user09   test9@beany.co.kr
test10   user10   test10@beany.co.kr

10 rows selected





----------------------------------------------------------------------------------------
3분전 데이터 복구 
----------------------------------------------------------------------------------------

OF TIMESTAMP(TO_TIMESTAMP('20180726 140000','YYYYMMDD HH24MISS'))

SCOTT@ORCL > FLASHBACK TABLE tb_user TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '3' MINUTE);
FLASHBACK TABLE tb_user TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '3' MINUTE)
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled


=>  ROW MOVEMENT 비활성화 되어 있기 때문.



FDA@ORCL > alter table tb_user enable row movement;

Table altered.



FDA@ORCL > FLASHBACK TABLE tb_user TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '3' MINUTE);

Flashback complete.


FDA@ORCL > select * from tb_user;

USER_ID              USER_NM              EMAIL
-------------------- -------------------- ----------------------------------------------------------------------------------------------------
test01               user01               test1@beany.co.kr
test03               user03               test3@beany.co.kr
test04               user04               test4@beany.co.kr
test05               user05               test5@beany.co.kr
test06               user06               test6@beany.co.kr
test07               user07               test7@beany.co.kr
test09               user09               test9@beany.co.kr
test08               user08               test8@beany.co.kr
test10               user10               test10@beany.co.kr
test02               user02               test2@beany.co.kr

10 rows selected.

FDA@ORCL > commit;

Commit complete.

















----------------------------------------------------------------------------------------
# 2) scn 이용
----------------------------------------------------------------------------------------


FDA@ORCL > create table test01 (no number);

Table created.



FDA@ORCL > insert into test01 values (1);

1 row created.

FDA@ORCL > insert into test01 values (2);

1 row created.

FDA@ORCL > 
FDA@ORCL > commit;

Commit complete.

FDA@ORCL > select * from test01;

        NO
----------
         1
         2


FDA@ORCL > select current_scn from v$database;

CURRENT_SCN
-----------
14695595383525



FDA@ORCL > update test01 set no=123;

2 rows updated.

FDA@ORCL > select * from test01;

        NO
----------
       123
       123


FDA@ORCL > commit;

Commit complete.




FDA@ORCL > flashback table test01 to scn '14695595383525';
flashback table test01 to scn '14695595383525'
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled


FDA@ORCL > alter table test01 enable row movement;

Table altered.

FDA@ORCL >  flashback table test01 to scn '14695595383525';
 flashback table test01 to scn '14695595383525'
                 *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-25153: Temporary Tablespace is Empty
=> 템포러리 테이블스페이스가 빔...
확인 결과 불완전 복구로 인해.. 템포러리 .dbf 파일 다 지움...
이참에 tempgroup 제거 및 기본 템포러리 지정.

 ALTER TABLESPACE temp2 TABLESPACE GROUP '';
  ALTER TABLESPACE temp3 TABLESPACE GROUP '';
 ALTER TABLESPACE temp4 TABLESPACE GROUP '';
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP




FDA@ORCL > select * from test01;

        NO
----------
         1
         2










----------------------------------------------------------------------------------------
3) drop 된 테이블 복구. ( recyclebin : 휴지통 )
----------------------------------------------------------------------------------------





FDA@ORCL > select * from test01;

        NO
----------
         1
         2

FDA@ORCL > drop table test01 purge;

Table dropped.




FDA@ORCL > create table test02(no number);

Table created.

FDA@ORCL > drop table test02;

Table dropped.



ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FTEST1           BIN$Ltm7QXKcSjTgUAAK2XE+TQ==$0 TABLE        2016-03-25:14:21:12
TEST02           BIN$LtqwI+oBXnTgUAAK2XFAoA==$0 TABLE        2016-03-25:15:29:41



FDA@ORCL > select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$Ltm7QXKcSjTgUAAK2XE+TQ==$0 TABLE
BIN$LtqwI+oBXnTgUAAK2XFAoA==$0 TABLE




* 휴지통에서 삭제.
FDA@ORCL > purge table FTEST1;

Table purged.


FDA@ORCL > show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST02           BIN$LtqwI+oBXnTgUAAK2XFAoA==$0 TABLE        2016-03-25:15:29:41




* 휴지통에서 복구
FDA@ORCL > flashback table test02 to before drop;

Flashback complete.




FDA@ORCL > select * from test02;

no rows selected



휴지통 비우기.
FDA@ORCL > purge recyclebin;

Recyclebin purged.

FDA@ORCL > show recyclebin;
FDA@ORCL > 





recyclebin 비활성화
FDA@ORCL > alter session set recyclebin=off;

Session altered.




recyclebin 활성화
FDA@ORCL > alter session set recyclebin=on;

Session altered.






----------------------------------------------------------
##    database level flashback 복구    ##
----------------------------------------------------------
- truncate table 장애 복구
- 특점 시점 으로 데이터베이스 전체 를 되돌림 (reset)

- parameter 파일 수정 (db_flashback_retention_target 설정)
- mount 단계에서  flashback on 설정



방법
시간 (sysdate) : mount 상태



# 1)  timestamp 이용 ( mount)

SYS@ORCL AS SYSDBA> create table scott.ft (no number);

Table created.

SYS@ORCL AS SYSDBA> insert into scott.ft values (1);

1 row created.

SYS@ORCL AS SYSDBA> insert into scott.ft values (2);

1 row created.

SYS@ORCL AS SYSDBA> commit;

Commit complete.

SYS@ORCL AS SYSDBA> select * from scott.ft;

        NO
----------
         1
         2









SYS@ORCL AS SYSDBA>  select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') as time from dual;

TIME
-------------------
2016-03-25 10:53:32









SYS@ORCL AS SYSDBA> truncate table scott.ft;

Table truncated.

SYS@ORCL AS SYSDBA> select * from scott.ft;

no rows selected








SYS@ORCL AS SYSDBA> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


SYS@ORCL AS SYSDBA> startup mount
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area 3290345472 bytes
Fixed Size                  2217832 bytes
Variable Size            3154118808 bytes
Database Buffers          117440512 bytes
Redo Buffers               16568320 bytes
Database mounted.






SYS@ORCL AS SYSDBA> flashback database to timestamp timestamp '2016-03-25 10:53:32';

Flashback complete.






SYS@ORCL AS SYSDBA> alter database open resetlogs;

Database altered.



SYS@ORCL AS SYSDBA> select * from scott.ft;

        NO
----------
         1
         2




반응형

'Oracle > etc' 카테고리의 다른 글

Redefinition  (0) 2022.01.26
ogg(Oracle Golden Gate)  (0) 2022.01.26
db_link  (0) 2022.01.26
compress  (0) 2022.01.26
Reorg  (0) 2022.01.26