Oracle 38일차

[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

Leave a Comment