출처 : http://blog.naver.com/on2uu/80169996196
출처2 : http://www.gurubee.net/lecture/2642
주요 골자는 11g 버전 부터는 테이블을 만들 때
user_segments 테이블에 값이 들어가는 것이 아니라
1개라도 데이터를 insert 할 때 user_segments 테이블에 값이 들어간다는 것.
이 때문에 행이 없는 테이블은 백업할 때 제대로 백업이 되지 않아 복원하면 테이블 갯수가 다르다.
이를 확인하는 방법은 SQL*PLUS에서
show parameter DEFERRED_SEGMENT_CREATION; |
명령어로 확인을 하거나
또는 아래의 쿼리로 확인하는 방법이 있다.
SELECT name, value FROM v$system_parameter WHERE NAME = 'deferred_segment_creation'; |
DEFERRED_SEGMENT_CREATION = TRUE : 데이터가 들어올때까지 SEGMENT를 생성하지 않음
DEFERRED_SEGMENT_CREATION = FALSE : CREATE 싯점에 SEGMENT를 생성함
이를 해결 할 수 있는 방법은 우선 서버의 DEFERRED_SEGMENT_CREATION 값을 false 로 변경한다.
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE SCOPE=BOTH; |
SELECT 'ALTER TABLE '||table_name||' ALLOCATE EXTENT;' FROM USER_TABLES UT WHERE UT.TABLE_NAME NOT IN (SELECT US.SEGMENT_NAME FROM USER_SEGMENTS US WHERE US.SEGMENT_TYPE = 'TABLE') UNION ALL SELECT 'ALTER TABLE '||table_name||' DEALLOCATE UNUSED;' FROM USER_TABLES UT WHERE UT.TABLE_NAME NOT IN (SELECT US.SEGMENT_NAME FROM USER_SEGMENTS US WHERE US.SEGMENT_TYPE = 'TABLE'); |