출처 : 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;


DEFERRED_SEGMENT_CREATION Parameter의 값을 FALSE로 변경하였다 하더라도
이미 기존에 CREATE된 테이블은 SEGMENT가 생성되지 않는다
이런 경우 임의로 SEGMENT가 생성되지 않은 테이블의 TABLESPACE를 변경해
주거나 임의 Extent를 발생하여 SEGMENT 생성이 가능하다.
아래 쿼리의 실행결과를 복사하여 실행하면 된다.(2013.03.31 수정)


  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');


















Posted by motolies
,