본문 바로가기
DevOps

[Oracle] 오라클 삭제 후 COMMIT 한 데이터 복구 명령어

by Jayson Jeong 2022. 9. 13.

오라클 9i Release 2부터 Flashback이라는 기능이 생겼는데, 일종의 과거데이터라고 생각하면 된다.

테이블 데이터의 과거기록을 조회할 수 있는 기능으로

데이터를 실수로 삭제할 경우 특정시간 또는 시점으로 되돌릴 수 있는 기능이다.

AS OF TIMESTAMP 구문을 사용하여 삭제 전의 데이터를 조회하여 복구할 수 있다.

 

1. TIMESTAMP 조회

SELECT * 
FROM [테이블명] AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE) //15분 전 테이블데이터 조회

ex)
SELECT *
FROM COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE CODE = '1234'

 

2. 조회한 데이터를 삽입 또는 수정

//삽입
INSERT INTO [테이블명]
(SELECT *
FROM [테이블명] AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL'15'MINUTE)) //15분 전 데이터

ex)
INSERT INTO COMPANY
(SELECT *
FROM COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL'30'MINUTE)) //30분 전 데이터
   

//수정
UPDATE [테이블명 A]
SET ([A컬럼], [A컬럼], ... ) 
	= (SELECT [B컬럼], [B컬럼], ... 
     FROM ([테이블명] AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL'15'MINUTE)) B)
WHERE [A컬럼] = [B컬럼]

ex)
UPDATE COMPANY A
SET (A.NAME, A.ADDRESS) = 
	(SELECT B.NAME, B.ADDRESS
     FROM (COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL'15'MINUTE)) B)
WHERE A.CODE = B.CODE

 

모든 테이블에서 데이터 찾는 쿼리문 생성

SELECT 'SELECT ''' || A.TABLE_NAME || ''', '''
       || A.COLUMN_NAME || ''', COUNT(*) FROM '
       || A.TABLE_NAME || ' WHERE '
       || A.COLUMN_NAME || ' LIKE ''%값%'' UNION '
FROM USER_TAB_COLUMNS A
LEFT OUTER JOIN (SELECT TABLE_NAME FROM USER_TABLES WHERE NUM_ROWS > 0) B
	ON A.TABLE_NAME = B.TABLE_NAME
WHERE A.DATA_TYPE = 'VARCHAR2';

 

ALL_TAB_COLUMS - 모든 테이블에서 원하는 컬럼명 찾기

SELECT TABLE_NAME, COLUMN_NAME 
FROM ALL_TAB_COLUMNS 
WHERE COLUMN_NAME LIKE '%컬렁명%'