[drop table 복구]
flashback table로 drop 이전으로 복구 가능(빠른 복구 가능).
table drop 시 실제로는 저장 공간을 반환하지 않고 이름만 rename이 됨.
recyclebin에 drop된 table정보 가지고 있음.
오래되거나 큰 테이블의 경우 복구 불가능할 수 있음.
purge 옵션으로 drop 시 복구 불가능 -> truncate처럼 database level 복구 필요.
system 소유 테이블은 drop 시 recyclebin에 저장되지 않아서 table level 복구 불가.
table level 복구 시 DDL 실행 시점 이전으로는 복구가 불가하다. = 구조 변경 시 이전 snapshot을 지워서 조회 불가.
[실습 – drop 복구(flashback table)]
1. table create 및 insert
-- 1) system 소유 table
create table system.drop_test1(no number);
insert into system.drop_test1 values(1);
commit;
-- 2) scott 소유(일반계정) table
create table scott.drop_test2(no number);
create table scott.drop_test3(no number);
insert into scott.drop_test2 values(1);
insert into scott.drop_test3 values(1);
commit;
2. table drop
drop table system.drop_test1;
drop table scott.drop_test2;
drop table scott.drop_test3 purge;
3. recyclebin 조회
select *
from dba_recyclebin;
-- scott.drop_test2 만 남아있고 나머지는 안 남아있다.
-- purge 옵션 사용한 drop은 recyclebin에 저장되지 않는다.
-- system 소유의 테이블은 drop되어도 recyclebin에 저장되지 않는다.
-- 그래서 업무적으로 사용하는 테이블은 system 소유로 만들지 않음.
4. flashback 복구
flashback table SCOTT."BIN$KGnm3q7jF+ngY4B8EKzbQw==$0" to before drop;
-- recyclebin에 저장된 drop_test2의 바뀐 이름으로. 그리고 소유자 꼭 명시해야 됨.
-- 특수기호가 포함되어 있어서 꼭 double quote로 전달해줘야 됨.
-- 만약 그 사이에 drop_test2라는 같은 이름을 가진 테이블이 새로 생겨서 같은 이름으로 복구할 수 없다면
flashback table SCOTT."BIN$KGnm3q7jF+ngY4B8EKzbQw==$0" to before drop rename to drop_test22;
-- 이런 식으로 하면 다른 이름으로 flashback 시킬 수 있다.
5. 조회
select * from scott.drop_test2;
[flashback database level 복구]
table level로 복구가 불가능할 경우 복구 방식.
database 전체를 장애 발생 이전 시점으로 되돌려 데이터를 복구하는 방식
DB online 중에 불가(mount 단계에서 복구 진행 – data file을 이전 걸로 돌리는 게 목표기 때문에)
truncate, DDL 발생시점 이전, drop purge, schema 삭제 시 복구.
현실적으로는 불가. online중인 DB의 모든 데이터를 과거로 돌리기 어려움.
1. 시점 확인
select sysdate from dual;
2. 장애 발생
select * from scott.delivery;
truncate table scott.delivery;
3. 복구 시도(online 중)
select *
from SCOTT.DELIVERY
as of timestamp to_date('2024/12/04 12:51:46', 'YYYY/MM/DD HH24:MI:SS');
-- ORA-01466: unable to read data - table definition has changed
-- DDL이전 시점으로 돌아갈 수 없음. recyclebin에도 남지 않는다.
4. database level 복구 진행(mount 단계에서 진행)
shutdown immediate
startup mount
flashback database to timestamp(to_timestamp('2024/12/04 12:51:46', 'YYYY/MM/DD HH24:MI:SS'));
alter database open;
-- ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
-- redo 의 정보를 지워야한다는 메시지 => 시점 맞춰진다.
alter database open resetlogs;
-- 정상
5. 조회
select * from scott.delivery;
-- 잘 나옴.
[실습 – schema 삭제 복구]
유저 삭제 시 해당 유저 소유의 객체(schema)가 존재하는 경우 삭제 불가. -> cascade 옵션을 통해 동시 삭제 가능.
schema 삭제 시 table level 단위 복구 불가
1. itwill 유저 생성
select *
from dba_users;
create user itwill identified by oracle quota unlimited on users;
grant create session to itwill;
grant dba to itwill;
-- 이렇게 하긴 했는데 이럴 필요없음. dba권한을 주면 create session도 같이 따라옴. 그래서 grant dba만 해주면 grant create session은 안 해줘도 됨.
-- 강사님 방법
alter user itwill default tablespace users; -- tablespace 지정. default = USERS
alter user itwill temporary tablespace temp; -- temp tablespace 지정. default = TEMP
alter user itwill quota unlimited on users; -- quota 부여. 안해주면 insert가 안됨.
grant create session, create table to itwill; -- session, table 생성 권한.
2. itwill 유저로 접속 후 테스트 테이블 생성(test1, test2)
create table test1(no number);
create table test2(no number);
insert into test1 values(1);
insert into test2 values(2);
commit;
select * from test1;
select * from test2;
3. 시점 확인
select sysdate from dual; -- 2024/12/04 14:47:23
4. 장애 발생 상황 가정(itwill 삭제)
drop user itwill cascade;
-- itwill 소유의 schema가 있기 때문에 cascade 필요.
select * from itwill.test1;
select * from itwill.test2;
5. table level 복구 시도
select *
from dba_recyclebin;
-- 아무것도 없음
6. database level 복구 시도
shutdown immediate
startup mount
flashback database to timestamp(to_timestamp('2024/12/04 14:47:23', 'YYYY/MM/DD HH24:MI:SS'));
alter database open resetlogs;
7. 데이터 확인
select * from itwill.test1;
select * from itwill.test2;
[실습 – undo 수정]
undotbs1만 남고 /home/oracle/oradata/db1/undotbs01.dbf 하나만 존재하도록 만들기.
autoextend on 설정, 사이즈 100m
1. undo 현황 확인
select *
from dba_data_files
where tablespace_name like 'UNDO%';
2. undotbs3 만들기
create undo tablespace undotbs3 datafile '/home/oracle/oradata/db1/undotbs3.dbf' size 300m;
3. undotbs3를 default로 만들기
alter system set undo_tablespace=undotbs3 scope=both;
4. undotbs1 삭제
drop tablespace undotbs1;
select *
from dba_data_files
where tablespace_name like 'UNDO%';
$ rm /home/oracle/oradata/db1/undotbs0*
5. undotbs1 만들기 & default 설정 & autoextend on
create undo tablespace undotbs1 datafile '/home/oracle/oradata/db1/undotbs01.dbf' size 100m;
alter system set undo_tablespace=undotbs1 scope=both;
alter database datafile '/home/oracle/oradata/db1/undotbs01.dbf' autoextend on;
select *
from dba_data_files
where tablespace_name like 'UNDO%';
6. undotbs3 삭제
drop tablespace undotbs3;
$ rm /home/oracle/oradata/db1/undotbs3.dbf
7. 확인 & cold_backup 해놓기
select *
from dba_data_files
where tablespace_name like 'UNDO%';
$ sh cold_backup.sh