데이터베이스를 Oracle이나 Tibero를 이용하던 중 데이터를 실수로 삭제했다면 어떻게 해야할까?
물론 제일 좋은 방법은 실수를 하지 않는 것이지만, 정말 조심하다가도 할 수 있는게 실수이기 때문에 이런 경우에는 빠르게 해결책을 찾는 것이 중요할 것이다.
우선 다행스럽게도 오라클이나 티베로에서는 생각보다 매우 쉽게 복구가 가능하다
물론 이마저도 비교적 짧은 시간안에 생각을 해야하며 시간이 지날수록 복구가 어려워진다.
우선 데이터를 복구하기 위해서는 UNDO 로그의 옵션이 켜져있어야 한다.
해당 옵션을 보기 위해서는
SQL > SHOW PARAMETER UNDO;
명령어를 입력하면 되며, 오라클/티베로 각각 아래의 결과가 나올 것이다.
- 오라클
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 1800
undo_tablespace string UNDOTBS1
-티베로
NAME TYPE VALUE
---------------------------- -------- ----------------------------------------
UNDO_RETENTION INT32 1200
UNDO_TABLESPACE STRING UNDO
눈 여겨 봐야할 것은, UNDO_MANAGEMENT 파라미터와 UNDO_RETENTION 파라미터이다.
각각의 파라미터는
UNDO_MANAGEMENT : UNDO 로그 사용 유무
UNDO_RETENTION : 어느 시점까지의 UNDO 정보를 보유할 것인지 설정(초)
의 역할을 하며, 티베로에는 MANAGEMENT 파라미터가 없어 자세한건 공부를 해봐야 할 것 같다.
또한 파라미터를 수정하는 방법은 DDL문과 같이
ALTER SYSTEM SET 파라미터명=변경값;
ex) ALTER SYSTEM SET UNDO_RETENTION=1200
으로 사용하면 된다.
사용 방법은
쿼리 뒤에 AS OF TIMESTAMP를 사용하면 되는데
간략한 예시들로
-- UNDO_TEST라는 테이블의 10분 전 데이터를 모두 출력
SELECT * FROM UNDO_TEST AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE);
-- UNDO_TEST라는 테이블의 10분 전 데이터의 로우 수를 모두 출력
SELECT COUNT(*) FROM UNDO_TEST AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE);
-- UNDO_TEST라는 테이블의 2023년 06월 02일 오후 4시 52분 데이터의 로우 수를 출력
SELECT COUNT(*) FROM UNDO_TEST AS OF TIMESTAMP(TO_TIMESTAMP('202306021652'));
이런 식으로 사용하면 된다
무엇보다 해당 UNDO로그는 얼마나 지속되고 제거될지 업체나 DB마다 설정이 다를 수 있기 때문에 데이터를 바로 백업시킨 후 백업에 대한 프로세스를 생각하는 것이 좋다
즉 무엇보다 빠른 발견과 빠른 백업이 가장 중요한 요소인 것 같다.
백업은
CREATE TABLE 테이블명 AS
SELECT * FROM UNDO_TEST AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE);
이런식으로 백업을 한 후 필요한 데이터만 원본 테이블에 INSERT하는 등 여러가지 방법을 통해서 복구하면 될 것 같다.
'DBA > Oracle' 카테고리의 다른 글
[오라클] 테이블스페이스 RESIZE (2) | 2025.01.03 |
---|---|
오라클 JDBC URL 작성 방법(SID/Service name) (0) | 2023.11.14 |