백업 복구2 - p68

Flashback Query의 3가지 분류

1. Row level Flashback

2. Table Level Flashback

3. Database Level Flashback

 

 1. Row Level Flashback (기본값 : 사용함)

※ Table의 특정 부분만 찾아서 변경하는 방법

※ 이 기능은 Undo Data의 정보를 이용한다. 만약 Undo Segment를 다른 Transaction에서 재사용하면 이 기능으로 Flashback 할 수 없다.

※ table의 구조가 변경되어도 Flashback 할 수 없다.

 

Flashback Version Query (해당 데이터의 과거 변경 이력을 전부 찾아주는 쿼리)

SQL> select versions_startscn st_scn, versions_endscn endscn,
  2  versions_xid txid, versions_operation opt, 이름
  3  from 회원 versions between scn minvalue and maxvalue
  4  where tel=111;

 

   ST_SCN  ENDSCN         TXID             O 이름
---------- ---------- ---------------- - ----------
   1654659                   06001500F9030000 U 홍길동
   1654625    1654659     09001D0005040000 I 김유신

 

SCN을 시간으로 (Version Query를 시간으로 변경하여 보여주는 기능)

SCOTT> select scn_to_timestamp(1654625) from dual;

 

SCN_TO_TIMESTAMP(1654625)
--------------------------------
06-JUL-13 03.28.07.000000000 PM

 

Flashback Transaction Query (원래 데이터로 돌려주게 하는 기능, 업데이트 쿼리를 가르쳐 주는 기능)

이 기능은 본인이 UPDATE로 원래 데이터로 돌릴 수 있다면 필요성이 낮은 기능

  1  select undo_sql from flashback_transaction_query
  2  where table_name='회원'
  3  and commit_scn between 611043 and 611071
  4  order by start_timestamp desc

select undo_sql from flashback_transaction_query
                              *
ERROR at line 1:
ORA-01031: insufficient privileges     --------------------      권한 에러가 발생한다

 

SCOTT> conn / as sysdba
Connected.
SYS> grant select any transaction to scott;

Grant succeeded.

SYS> conn scott/tiger
Connected.                                                                        권한을 부여한다

 

  1  select undo_sql from flashback_transaction_query
  2  where table_name='회원'
  3  and commit_scn between 1654625 and 1654659                 -> 위에서 조회한 SCN 번호
  4  order by start_timestamp desc

이렇게 치면 업데이트를 시키게 해 주는 쿼리가 나오는데 복사해서 실행하면 된다.

나는 왜 안나오지... 안나와서 그냥 넘어간다.

 

 2. Table Level Flashback 백업과 복구2 p82 (기본값 : 사용함)

DML 에러가 발생했을 때 특정 테이블 전체를 되돌리는 Flashback 방법

※ Supplimental log 기능이 enable 되어 있어야 사용하능하다

※ 이 기능은 Undo Data의 정보를 이용한다. 만약 Undo Segment를 다른 Transaction에서 재사용하면 이 기능으로 Flashback 할 수 없다.

※ table의 구조가 변경되어도 Flashback 할 수 없다.

※ 테이블 전체의 내용이 변경 된다.

① 특정 테이블에 DML 에러가 발생했을 때 사용하는 방법 - Undo data 사용

② 특정 테이블이 drop table 되었을 때 사용하는 방법 - Recyclebin 사용

 

① 특정 테이블에 DML 에러가 발생했을 때 사용하는 방법

▼ 복구시점의 SCN을 알고 있을 경우 복구 방법

SCOTT> select * from ibgo;

    I_CODE I_NAME            QTY
---------- ---------- ----------
       100 새우              100
       101 문어               50
       102 오징어             20
       105 쭈꾸미             50

 

SCOTT> conn / as sysdba                            scott이 SCN을 확인하기 위해 권한을 부여함
Connected.

SYS> grant dba to scott;

Grant succeeded.

 

SCOTT> select current_scn from v$database;                                현재 SCN 조회하기

CURRENT_SCN
-----------
    1674124

 

SCOTT> update ibgo set i_name='왕새우' where i_name='새우';

1 row updated.

 

SCOTT> commit;

Commit complete.

 

SCOTT> select * from ibgo;

    I_CODE I_NAME            QTY
---------- ---------- ----------
       100 왕새우            100
       101 문어               50
       102 오징어             20
       105 쭈꾸미             50

SCOTT> select current_scn from v$database;

CURRENT_SCN
-----------
    1674255                                                새우를 왕새우로 변경한 후 SCN

 

SCOTT> update ibgo set i_name='대왕문어' where i_name='문어';

1 row updated.

 

SCOTT> commit;

Commit complete.

 

SCOTT> select current_scn from v$database;

CURRENT_SCN
-----------
    1674279                                                문어를 대왕문어로 변경한 후 SCN

 

SCOTT> delete from ibgo;

4 rows deleted.

 

SCOTT> commit;

Commit complete.

 

SCOTT> select current_scn from v$database;

CURRENT_SCN
-----------
    1674306                                                모든 데이터를 삭제한 후 SCN

 

SCOTT> flashback table ibgo to scn '1674124';                     새우가 있던 table로 flashback
flashback table ibgo to scn '1674124'
                      *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

(이 기능을 사용하려면 테이블에 row movement라는 속성이 enable 되어 있어야 한다)

 

SCOTT> alter table ibgo enable row movement;

Table altered.

 

SCOTT> flashback table ibgo to scn '1674124';

Flashback complete.

 

SCOTT> select * from ibgo;

    I_CODE I_NAME            QTY
---------- ---------- ----------
       100 새우              100
       101 문어               50
       102 오징어             20
       105 쭈꾸미             50

복구시점의 SCN만 알면 쉽게 복구가 가능하지만, SCN을 알고 있는 경우가 많이 없기 때문에 별로 쓰이지는 않는 내용이었습니다.


row movement

어떤 테이블에서 row movement를 enable 하면 그 테이블과 연관된 View 기능을 사용할 수 없게 되는 경우가 발생한다

Flashback table을 사용하기 위해 row movement를 enable로 변경하였다면 반드시 해당 테이블과 연관된 view를 확인해야 한다 (10g 까지만, 11g는 예외)

명령어 : alter table ibgo enable row movement

 

SCOTT> set line 200;
SCOTT> col object_name for a10
SCOTT> col object_type for a10
SCOTT> col status for a8
SCOTT> select object_name,object_type,status from dba_objects where owner='SCOTT' and object_name like 'IBGO%';

OBJECT_NAM OBJECT_TYP STATUS
---------- ---------- --------
IBGO       TABLE      VALID                                        현재 상태조회

 

SCOTT> create index ibgo_iname_idx on ibgo (i_name);

Index created.

SCOTT> create view ibgo_v as select i_name,qty from ibgo;

View created.

(ibgo table에 index와 view생성)

 

SCOTT> col object_name for a15
SCOTT> select object_name,object_type,status from dba_objects where owner='SCOTT' and object_name like 'IBGO%';

OBJECT_NAME     OBJECT_TYP STATUS
--------------- ---------- --------
IBGO            TABLE      VALID
IBGO_INAME_IDX  INDEX      VALID
IBGO_V          VIEW       VALID                            현재 상태 조회

 

SCOTT> alter table ibgo disable row movement;

Table altered.

SCOTT> select object_name,object_type,status from dba_objects where owner='SCOTT' and object_name like 'IBGO%';

OBJECT_NAME     OBJECT_TYP STATUS
--------------- ---------- --------
IBGO            TABLE      VALID
IBGO_INAME_IDX  INDEX      VALID
IBGO_V          VIEW       INVALID

 

(10g 까지만 이렇게 되니 11g는 걱정않고 사용해도 됩니다)

 

 

 

▼ SCN은 모르지만 시간을 알고 있을 때 복구하는 방법 (백업과 복구2 p.88)

장애가 난 시간을 추측하여 Flashback 하는 방법

Flashback Version Query를 사용하여 변경사항을 조회해서 찾을 수 있기도 하지만

시간으로 간단히 해결해보자

 

SCOTT> flashback table ibgo to timestamp(systimestamp - interval '5' minute);

Flashback complete.

(지금으로부터 5분전으로 되돌리기)

 

SCOTT> flashback table ibgo to timestamp(systimestamp - interval '30' second);

Flashback complete.

(지금으로부터 30초전으로 되돌리기)

 

원하는 데이터를 찾을 때까지 반복할 수 있으나 이 방법도 Undo data를 이용하기 때문에 오래 전 데이터는 Flashback 할 수 없을 가능성도 많다

 

② 특정 테이블이 drop table 되었을 때 사용하는 방법 - 휴지통(Recyclebin) 사용

10g 부터 휴지통 기능이 생겼다

※ 테이블이 삭제되어 휴지통으로 옮겨지게되면 해당 테이블스페이스에 그대로 용량을 차지하고 남아있게 되지만, 해당 테이블스페이스의 용량이 꽉 차고 다른 데이터가 insert 되면 휴지통에 해당하는 부분에 덮어 쓰게 되어 그 이후로 사라지게 된다. 이 점은 Autoextend 기능이 on 으로 되어 있어도 같다.

※ sys사용자의 table은 삭제해도 휴지통으로 들어가지 않고 purge 된다. But sys사용자가 다른 사용자의 테이블을 삭제하면 해당 사용자의 user_recyclebin에 지워진 테이블이 저장된다.

 

▼ drop table 복구하기

SCOTT> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
ASSM                           TABLE
BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE
BONUS                          TABLE
CLOBTEST                       TABLE
DEPT                           TABLE
DEPT2                          TABLE
DEPT20                         TABLE
EMP                            TABLE
GOGAK                          TABLE
IBGO                           TABLE
IBGO_V                         VIEW

JOB_TEST01                     TABLE
RTEST01                        TABLE
RTEST02                        TABLE
RTEST2                         TABLE
SALGRADE                       TABLE
SYS_TEMP_FBT                   TABLE
T1                             TABLE
TEST02                         TABLE
TEST3                          TABLE
TEST4                          TABLE
TT100                          TABLE

UTEST01                        TABLE
회원                           TABLE

24 rows selected.                                현재 사용자의 테이블 상황 확인

 

SCOTT> drop table ibgo;

Table dropped.

 

SCOTT> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
ASSM                           TABLE
BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE
BIN$4NYp0Gt+2kngQAB/AQA5BA==$0 TABLE                        ibgo 테이블이 휴지통으로 옮겨짐
BONUS                          TABLE
CLOBTEST                       TABLE
DEPT                           TABLE
DEPT2                          TABLE
DEPT20                         TABLE
EMP                            TABLE
GOGAK                          TABLE
IBGO_V                         VIEW

JOB_TEST01                     TABLE
RTEST01                        TABLE
RTEST02                        TABLE
RTEST2                         TABLE
SALGRADE                       TABLE
SYS_TEMP_FBT                   TABLE
T1                             TABLE
TEST02                         TABLE
TEST3                          TABLE
TEST4                          TABLE
TT100                          TABLE

UTEST01                        TABLE
회원                           TABLE

24 rows selected.

 

SCOTT> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
IBGO             BIN$4NYp0Gt+2kngQAB/AQA5BA==$0 TABLE        2013-07-06:19:20:41
TEST3            BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE        2013-07-06:09:05:07

휴지통 확인

 

SCOTT>  flashback table ibgo to before drop                                 - 테이블 복구
Flashback complete.

 

SCOTT> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
ASSM                           TABLE
BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE
BONUS                          TABLE
CLOBTEST                       TABLE
DEPT                           TABLE
DEPT2                          TABLE
DEPT20                         TABLE
EMP                            TABLE
GOGAK                          TABLE
IBGO                           TABLE
IBGO_V                         VIEW

JOB_TEST01                     TABLE
RTEST01                        TABLE
RTEST02                        TABLE
RTEST2                         TABLE
SALGRADE                       TABLE
SYS_TEMP_FBT                   TABLE
T1                             TABLE
TEST02                         TABLE
TEST3                          TABLE
TEST4                          TABLE
TT100                          TABLE

UTEST01                        TABLE
회원                           TABLE

24 rows selected.

 

SCOTT> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST3            BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE        2013-07-06:09:05:07

 

ibgo 테이블이 복구되었고 휴지통에서 사라졌다

 

휴지통 비우는 방법

SCOTT> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST3            BIN$4MyQZhMJCajgQAB/AQAnRA==$0 TABLE        2013-07-06:09:05:07

SCOTT> purge table test3;                test3 테이블만 휴지통에서 삭제

Table purged.

 

SCOTT> show recyclebin;

아무것도 없다.

 

SCOTT> purge recyclebin;                휴지통 전체를 비우는 방법

Recyclebin Purged.

 

SCOTT> drop table 회원 purge;            휴지통에 넣지 않고 완전히 삭제하는 방법

Table dropped.

 

 

 

 

 



 

 

 

'Oracle > 백업과 복구' 카테고리의 다른 글

Drop 된 Table 복구하기  (0) 2013.07.22
by 짱구를꼭말려 2013. 8. 8. 12:18

예제 : 1. create table space test -> create table guest tablespace test -> insert into guest -> rm test datafile -> drop table guest

 

temp 폴더에서 사용하던 오라클을 temp2 폴더로 임시로 지정하여 guest 테이블이 나오는지 본다.

 

[oracle@server122 temp2]$ cp -av /data/temp/control01.ctl ./
`/data/temp/control01.ctl' -> `./control01.ctl'
[oracle@server122 temp2]$ cp -av /data/temp/redo* ./
`/data/temp/redo01_a.rdo' -> `./redo01_a.rdo'
`/data/temp/redo01_b.rdo' -> `./redo01_b.rdo'
`/data/temp/redo01_c.rdo' -> `./redo01_c.rdo'
`/data/temp/redo02_a.rdo' -> `./redo02_a.rdo'
`/data/temp/redo02_b.rdo' -> `./redo02_b.rdo'
`/data/temp/redo02_c.rdo' -> `./redo02_c.rdo'
[oracle@server122 temp2]$ cp -av /data/backup/close/*.dbf ./
`/data/backup/close/example01.dbf' -> `./example01.dbf'
`/data/backup/close/sysaux01.dbf' -> `./sysaux01.dbf'
`/data/backup/close/system01.dbf' -> `./system01.dbf'
`/data/backup/close/temp01.dbf' -> `./temp01.dbf'
`/data/backup/close/temp_web01.dbf' -> `./temp_web01.dbf'
`/data/backup/close/test01.dbf' -> `./test01.dbf'
`/data/backup/close/ts_web01.dbf' -> `./ts_web01.dbf'
`/data/backup/close/ts_web_idx01.dbf' -> `./ts_web_idx01.dbf'
`/data/backup/close/undotbs01.dbf' -> `./undotbs01.dbf'
`/data/backup/close/users01.dbf' -> `./users01.dbf'

백업된 datafile과 현재 사용하던 control file & redo log file 을 temp2 로 폴더로 복사한다.

백업된 Control file 을 쓰면 어떻게 될까?_?


[oracle@server122 temp2]$ cd ~
[oracle@server122 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Jul 4 17:40:35 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to an idle instance.

SYS> startup mount
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1344616 bytes
Variable Size             272632728 bytes
Database Buffers          142606336 bytes
Redo Buffers                6086656 bytes
Database mounted.
SYS> @df

TS_NAME    FILE_NAME                                             MB STATUS
---------- -------------------------------------------------- ----- -------
SYSTEM     /data/temp2/system01.dbf                            2010 SYSTEM
SYSAUX     /data/temp2/sysaux01.dbf                             520 ONLINE
UNDOTBS1   /data/temp2/undotbs01.dbf                             90 ONLINE
USERS      /data/temp2/users01.dbf                                5 ONLINE
EXAMPLE    /data/temp2/example01.dbf                            346 ONLINE
TS_WEBHARD /data/temp/ts_web01.dbf                              100 OFFLINE
TS_WEB_IDX /data/temp/ts_web_idx01.dbf                           10 OFFLINE
TEST       /data/temp/test01.dbf                                  0 ONLINE
TS_NEW     /data/temp/ts_new.dbf                                 10 RECOVER

9 rows selected.

SYS> !
[oracle@server122 ~]$ vi /app/oracle/product/11g/dbs/inittestdb.ora
[oracle@server122 ~]$ exit
exit

SYS> alter database create datafile '/data/temp/test01.dbf'
  2  as '/data/temp2/test01.dbf';

Database altered.

test01.dbf 파일이 지워졌으니 대체품을 새로 만든다.

 

SYS> @df

TS_NAME    FILE_NAME                                             MB STATUS
---------- -------------------------------------------------- ----- -------
SYSTEM     /data/temp2/system01.dbf                            2010 SYSTEM
SYSAUX     /data/temp2/sysaux01.dbf                             520 ONLINE
UNDOTBS1   /data/temp2/undotbs01.dbf                             90 ONLINE
USERS      /data/temp2/users01.dbf                                5 ONLINE
EXAMPLE    /data/temp2/example01.dbf                            346 ONLINE
TS_WEBHARD /data/temp/ts_web01.dbf                              100 OFFLINE
TS_WEB_IDX /data/temp/ts_web_idx01.dbf                           10 OFFLINE
TEST       /data/temp2/test01.dbf                                 5 ONLINE
TS_NEW     /data/temp/ts_new.dbf                                 10 RECOVER

9 rows selected.

temp2 로 모두 변경 완료

SYS> @log

GROUP# MEMBER                                          MB SEQ# STATUS   ARC
------ --------------------------------------------- ---- ---- -------- -----
     1 /data/temp/redo01_a.rdo                         10    1 CURRENT  NO
     1 /data/temp/redo01_b.rdo                         10    1 CURRENT  NO
     1 /data/temp/redo01_c.rdo                         10    1 CURRENT  NO
     2 /data/temp/redo02_a.rdo                         10    0 UNUSED   YES
     2 /data/temp/redo02_b.rdo                         10    0 UNUSED   YES
     2 /data/temp/redo02_c.rdo                         10    0 UNUSED   YES

6 rows selected.

SYS> alter database rename file '/data/temp/redo01_a.rdo'
  2  to '/data/temp2/redo01_a.rdo';

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo01_b.rdo'
  2* to '/data/temp2/redo01_b.rdo'
SYS> /

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo01_c.rdo'
  2* to '/data/temp2/redo01_c.rdo'
SYS> /

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo02_c.rdo'
  2* to '/data/temp2/redo02_c.rdo'
SYS> /

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo02_b.rdo'
  2* to '/data/temp2/redo02_b.rdo'
SYS> /

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo02_a.rdo'
  2* to '/data/temp2/redo02_a.rdo'
SYS> /

Database altered.

SYS> ed
Wrote file afiedt.buf

  1  alter database rename file '/data/temp/redo02_a.rdo'
  2* to '/data/temp2/redo02_a.rdo'
SYS> @log

GROUP# MEMBER                                          MB SEQ# STATUS   ARC
------ --------------------------------------------- ---- ---- -------- -----
     1 /data/temp2/redo01_a.rdo                        10    1 CURRENT  NO
     1 /data/temp2/redo01_b.rdo                        10    1 CURRENT  NO
     1 /data/temp2/redo01_c.rdo                        10    1 CURRENT  NO
     2 /data/temp2/redo02_a.rdo                        10    0 UNUSED   YES
     2 /data/temp2/redo02_b.rdo                        10    0 UNUSED   YES
     2 /data/temp2/redo02_c.rdo                        10    0 UNUSED   YES

6 rows selected.

temp2 로 리두 파일들도 변경 완료

SYS> @df

TS_NAME    FILE_NAME                                             MB STATUS
---------- -------------------------------------------------- ----- --------
SYSTEM     /data/temp2/system01.dbf                            2010 SYSTEM
SYSAUX     /data/temp2/sysaux01.dbf                             520 ONLINE
UNDOTBS1   /data/temp2/undotbs01.dbf                             90 ONLINE
USERS      /data/temp2/users01.dbf                                5 ONLINE
EXAMPLE    /data/temp2/example01.dbf                            346 ONLINE
TS_WEBHARD /data/temp/ts_web01.dbf                              100 OFFLINE
TS_WEB_IDX /data/temp/ts_web_idx01.dbf                           10 OFFLINE
TEST       /data/temp2/test01.dbf                                 5 ONLINE
TS_NEW     /data/temp/ts_new.dbf                                 10 RECOVER

9 rows selected.

SYS> recover database time until '2013-07-04:16:44:00' ; (미리 알고 있는 시간으로 복구)(시간모를땐 어케하지?ㅠㅠ)
ORA-00905: missing keyword


SYS> recover database until time '2013-07-04:16:44:00';
ORA-00279: change 1271471 generated at 07/04/2013 12:37:04 needed for thread 1
ORA-00289: suggestion : /data/arc1/1_1_819894588.arc
ORA-00280: change 1271471 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

Log applied.
Media recovery complete.
SYS> alter database open resetlogs;

Database altered.

SYS> select * from guest;

        NO
----------
         3
         6
         7
         9

'Oracle > 백업과 복구' 카테고리의 다른 글

Flashback Query  (411) 2013.08.08
by 짱구를꼭말려 2013. 7. 22. 11:17
| 1 |