hyeonga_code

Database_53_SQL 테이블 삭제, 휴지통_DROP TABLE, RECYCLE BIN 본문

Oracle Database

Database_53_SQL 테이블 삭제, 휴지통_DROP TABLE, RECYCLE BIN

hyeonga 2023. 8. 9. 05:59
반응형

-- DROP TABLE
    /*
    DROP TABLE table [PURGE];
    */
    -- 테이블의 모든 데이터와 구조를 삭제하는 명령입니다.
    -- 테이블과 연관된 인덱스도 모두 삭제됩니다.
    -- 테이블과 연관된 뷰와 동의어는 사용불가 상태로 유지됩니다.
    -- 해당 테이블을 소유하고 있거나 높은 레벨의 권한이 있는 경우 테이블 제거가 가능합니다.
    -- 자동으로 커밋되므로 ROLLBACK은 불가합니다.
        -- PURGE 옵션을 사용하지 않은 경우 FLASHBACK이 가능합니다.
        -- PURGE : 휴지통에 저장되지 않습니다.

-- RECYCLE BIN_휴지통
    -- 삭제된 테이블에 대한 휴지통이 제공됩니다.
        -- FLASHBACK 명령문으로 삭제된 테이블을 휴지통으로부터 복원이 가능합니다.
        -- 실수로 잘못 삭제한 테이블을 쉽고 빠르게 복원할 수 있습니다.
        -- 휴지통에 보관되는 테이터의 용량은 사용하지 않는 공간으로 취급됩니다.
        -- 제약 없이 파일이 지워지지 않습니다.
        -- BIN$~로 시작하는 이름으로 RENAME 하여 보관하는 형식입니다.
        -- 실제로 비어있는 공간부터 사용하며 더 이상 공간이 없는 경우 가장 오래된 휴지통의 데이터 공간부터 덮어 씌우며 사용하게 됩니다.
    -- 고려사항
        -- DROP TABLE 명령문 작성 시 PURGE 옵션을 사용하는 경우 테이블은 휴지통에 저장되지 않습니다.
        -- 사용자는 휴지통 객체가 존재한다면 언제라도 해당 테이블을 복원할 수 있습니다.


-- 테이블이 존재하는지 확인합니다.
SELECT * FROM dept80;



-- 테이블을 삭제합니다.
DROP TABLE dept80;
    /*
    Table DEPT80이(가) 삭제되었습니다.
        -- 테이블 목록에 존재하지 않습니다.
        -- 휴지통 안에 있는 것을 확인할 수 있습니다.
    */

-- 휴지통에 들어있는 데이터를 확인합니다.
SHOW RECYCLEBIN;


    
-- 휴지통에 버려진 테이블을 복구합니다.
FLASHBACK TABLE dept80 TO BEFORE DROP;
    /*
    Flashback을(를) 성공했습니다.
    */

-- 테이블이 존재하는지 확인합니다.
SELECT * FROM dept80;



-- 휴지통에 있는 데이터를 출력합니다.
SHOW RECYCLEBIN;    
    -- 조회되는 데이터가 없습니다.


-- 대용량 데이터로 해보기

-- 대용량 테이블 생성
DROP TABLE bigemp purge
/
CREATE TABLE bigemp AS SELECT * FROM empl_demo
/
ALTER TABLE bigemp MODIFY (employee_id NUMBER)
/
DECLARE
n NUMBER;
BEGIN
FOR n IN 1..12
LOOP
INSERT INTO bigemp SELECT * FROM bigemp;
END LOOP;
COMMIT;
END; 
/
SELECT MIN(employee_id), MAX(employee_id), COUNT(*) FROM bigemp
/

/*
명령의 1 행에서 시작하는 중 오류 발생 -
DROP TABLE bigemp purge
오류 보고 -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

Table BIGEMP이(가) 생성되었습니다.

Table BIGEMP이(가) 변경되었습니다.

PL/SQL 프로시저가 성공적으로 완료되었습니다.

MIN(EMPLOYEE_ID) MAX(EMPLOYEE_ID)   COUNT(*)
---------------- ---------------- ----------
             100              206     438272
*/

-- 테이블 삭제
DROP TABLE bigemp;
    /*
    Table BIGEMP이(가) 삭제되었습니다.
    */

-- 휴지통 확인
SHOW RECYCLEBIN;
    /*
    ORIGINAL     NAME RECYCLEBIN NAME                   OBJECT TYPE      DROP TIME           
    --------------------------------------------------------------------------------------------------------------------------- 
    BIGEMP        BIN$DoQVMjIUQiKoN1XyA2yCjg==$0    TABLE                  2023-08-03:11:13:36 
    */

-- 테이블 복구
FLASHBACK TABLE bigemp TO BEFORE DROP;
    /*
    Flashback을(를) 성공했습니다.
    */

        -- 테이블을 삭제하고 복구하는 과정에 시간이 지체되지 않습니다.
        -- 휴지통은 RENAME과 같은 기능입니다.

-- 휴지통에서 데이터 삭제
PURGE RECYCLEBIN;
    /*
    RECYCLEBIN이(가) 비워졌습니다.
    */
    
-- 휴지통 확인
SHOW RECYCLEBIN;

-- 테이블 복구
FLASHBACK TABLE bigemp TO BEFORE DROP;
    /*
        <오류>----------------------------------------------------------------------
        오류 보고 -
        ORA-38305: object not in RECYCLE BIN
        38305. 00000 -  "object not in RECYCLE BIN"
        *Cause:    Trying to Flashback Drop an object which is not in RecycleBin.
        *Action:   Only the objects in RecycleBin can be Flashback Dropped.
        ------------------------------------------------------------------------------
    */

반응형