행위

오라클 데이터 복구

DB CAFE

1 오라클 데이터 복구

2 FLASHBACK (TIMESTAMP 이용)

데이터를 실수로 삭제(truncate는 복구 불가) 할 경우 특정시간 또는 시점으로 되돌릴 수 있는 기능. 플래시백 기능을 통해 as of timestamp 구문을 사용하여 삭제 전의 데이터를 조회하여 복구 가능.

2.1 FLASHBACK 설정 조건

1. 자동 언두 관리 시스템을 사용(UNDO_MANAGEMENT 파라미터를 AUTO로 설정)

UNDO_MANAGEMENT = AUTO

2. 이전의 어느 시점까지의 언두(UNDO)정보를 보유하여 Flashback Query를 수행할것인지 UNDO_RETENTION 파라미터를 설정.

ALTER SYSTEM SET UNDO_RETENTION=1200

3.설정 확인 SQL

show paramter undo;

NAME                     TYPE
-----------------------------------------------
VALUE
------------------------
undo_management          string
auto
auto_retention           integer
1200
UNDOTBS1
SQL

※ 사용자 권한 Flashback 기능을 이용하기 위해서 DBMS_FLASHBACK 패키지에 대한 EXECUTE권한 필요.

▶ Flashback을 사용할 수 있는 조건 모두 복구 할 수 있는 것은 아님.

시스템의 설정, 버퍼의 크기에 따라 복구 할 수 있는 시간은 제한적 이다. (오라클 서버의 메모리 세팅.)

제약조건이 추가되거나 컬림이 추가 된 경우, DROP한 후 PURGE한 경우 복원할 수 없다.

▶ 테이블 scn 번호로 복구

flashback table emp_test to scn 1406603;
-- scn번호확인 : select current_scn from v$database;


  • 10 분전 데이터 조회
SELECT *
  FROM [TABLE 명] AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) -- 단위는 SECOND, MINUTE, HOUR, DAY
WHERE [조회조건]

또는

SELECT *
  FROM [TABLE 명] AS OF TIMESTAMP sysdate - 1/24/60*10
WHERE [조회조건]
  • 10 분전 데이터 조회 후 입력
INSERT INTO TB_XXX
SELECT *
  FROM [TABLE 명] AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) -- 단위는 SECOND, MINUTE, HOUR, DAY
WHERE [조회조건]

또는

INSERT INTO TB_XXX
SELECT *
  FROM [TABLE 명] 
    AS OF TIMESTAMP TO_TIMESTAMP('20200101 102030','YYYYMMDD HH24MISS') 
WHERE [조회조건]
  • 다른 테이블명으로 복구
FLASHBACK TABLE EMP.XTB_EVN
       TO BEFORE DROP
   RENAME TO EMP.XTB_EVN_COPY;
  • 이전테이블로 복구
FLASHBACK TABLE RTIS_DEV.XTB
             TO BEFORE DROP;

FLASHBACK TABLE "BIN$hAmsdSFUTtrgUwEAAH8yIQ==$0" 
             TO BEFORE DROP;


▶ 인덱스

ALTER INDEX "BIN$UofUBMjYnkDgUOABLqNFXg==$0"
      RENAME TO PK_TB_USER_INFO;

▶ 프로시저

SELECT *
  FROM DBA_SOURCE AS OF TIMESTAMP (SYSTIMESTAMP-INTERVAL '수치' 단위) -- 단위는 SECOND, MINUTE, HOUR, DAY
 WHERE NAME = '프로시저이름'

▶ EX)

SELECT  *  
FROM TEST_TABLE AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '20' MINUTE)  -- 단위는 SECOND, MINUTE, HOUR, DAY
WHERE COMPANY = 'SK'

테이블명과 조건을 입력하고 조회화면 20분 이전의 데이터가 조회된다.


2.2 휴지통(RECYCLEBIN) 조회/비우기

오라클 휴지통

2.3 데이터파일 복구

Complete Recovery – 백업 받지 않은 데이터파일 복구(1)

마지막 cold backup이나 hot backup 이후에 만들어진 테이블스페이스에 장애가 발생하는 경우인데 손상된 파일이 system 테이블스페이스에 속하지 않을 때의 복구 방법

TEST라는 테이블스페이스를 만들었는데 이 테이블스페이스에 포함된 데이터파일에 장애가 발생 했다고 가정(물론 이 파일은 백업이 되어 있지 않습니다.)

1.DB가 종료되어 있다면 MOUNT 단계까지 실행하여 백업 전에 손상된 데이터 파일이나 데이터파일이 포함된 테이블스페이스를 offline으로 변경. 그러나 만약 데이터베이스가 오픈 되어 있는 상태라면 데이터파일 이나 테이블스페이스만 offline으로 변경

SQL>alter database datafile ‘c:\oracle\oradata\wink\test01.dbf’ offline

Or

SQL>alter tablespace TEST offline;

2. v$recover_file을 조회해서 복구 상태 확인

SQL>select * from v$recover_file;

3.장애 파일을 다시 생성

SQL>alter database create datafile ‘c:\oracle\oradata\wink\test01.dbf’
       as ‘c:\oracle\oradata\wink\test01.dbf’

4.recover 명령으로 파일을 복구

SQL>recover tablespace TEST;

5.테이블스페이스를 온라인으로…

alter tablespace test online;

3 데이터파일 위치 변경(디스크 full 장애시 신규 디스크로 이동..)

1.신규 디스크로 데이터파일 이동(현재 DB가 죽어있는 상태..)

mv /data1/TS_XXX_D01.dbf /data2/TS_XXX_D01.dbf

2.오라클 접속 후 데이터파일 변경

-- 1.접속 
sqlplus / as sysdba;
-- 2.mount 상태로 시작 
startup mount;
-- 3. datafile 변경 
alter database rename file '/data1/TS_MIG_D01.dbf' to '/data2/TS_XXX_D01.dbf';
-- 4.DB open
alter database open;
  • 현재 데이터파일 상태 확인
SELECT STATUS,NAME,BYTES/1024/1024 MB 
  FROM V$DATAFILE;

4 데이터파일 위치 변경(온라인 상태에서 변경)

1.온라인 상 변경 하는 방법

-- 1.offline 변경 
alter database datafile ‘/data1/ACCMIG/ACCMIG/TS_MIG_I01.dbf’ offline;
-- 2.rename 
alter database rename file '/data1/ACCMIG/ACCMIG/TS_MIG_I01.dbf' to '/data2/ACCMIG/ACCMIG/TS_MIG_I01.dbf';
-- 3.online 변경
alter database datafile ‘/data1/ACCMIG/ACCMIG/TS_MIG_I01.dbf’ online;

5 리두(REDO) 로그 파일 이동

redo log file은 offline이 안되서 반드시 사용 안하게 만드려면 DB를 mount상태로 두고 작업해야 함


1.서버 종료후 mount로 시작

SQL> select status from v$instance;
SQL> shutdown immediate;
SQL> startup mount;

2.이동할 디렉토리 생성

SQL> !mkdir /app/oracle/disk4
SQL> !mkdir /app/oracle/disk5

3.리두로그 파일 복사(이동)

-- 로그파일 정보 
SQL> select member from v$logfile;
-- 신규디스큿에 복사 
SQL> !cp /app/oracle/oradata/orcl/redo01.log /app/oracle/disk4/redo01_a.log
SQL> !cp /app/oracle/oradata/orcl/redo02.log /app/oracle/disk4/redo02_a.log
SQL> !cp /app/oracle/oradata/orcl/redo03.log /app/oracle/disk4/redo03_a.log
-- 리두로그파일 rename 
SQL> alter database rename
    file '/app/oracle/oradata/orcl/redo01.log'
    to '/app/oracle/disk4/redo01_a.log';

SQL> alter database rename
    file '/app/oracle/oradata/orcl/redo02.log'
    to '/app/oracle/disk4/redo02_a.log'

SQL> alter database rename
    file '/app/oracle/oradata/orcl/redo03.log'
    to '/app/oracle/disk4/redo03_a.log';

-- 필요시 그룹(b) 추가 
SQL> alter database add logfile member
    '/app/oracle/disk5/redo01_b.log' to group 1,
    '/app/oracle/disk5/redo02_b.log' to group 2,
    '/app/oracle/disk5/redo03_b.log' to group 3;
-- 확인 
SQL> select member from v$logfile;