테이블 스페이스가 갑자기 늘어났습니다. 1 1 3,439

by grape111 [Oracle Admin] 테이블 스페이스 [2012.07.23 16:41:18]



안녕하세요 테이블 스페이스가 갑자기 늘어났습니다.
체크는 아래 쿼리로 했구요..결과를 매주마다 체크했는데 특정 테이블 스페이스가 늘어났습니다.
그런데 어떤 테이블 때문에 늘어났는지 알수 있는 방법없을까요?
그리고 다른 질문인데 최근의 insert 된 트랜잭션을 조회하는 방법없을까요? 날짜별루요..
답변부탁드립니다.
SELECT 'dummy'     "Dummy",
   ts.tablespace_name "Ts",
   count(*)    "NbrFiles",
   ts.status   "Status",
   sum(bytes)/(1024*1024) "Size",
   sum(decode(maxbytes,0,bytes,maxbytes)-bytes)/(1024*1024)   "MaxAutoExt",
   round(100*(1-(nvl(fs.SumFree,0)+
  (sum(decode(maxbytes,0,bytes,maxbytes)-bytes)/(1024*1024)))/
  sum(decode(maxbytes,0,bytes,maxbytes)/(1024*1024))))    "PctUsed",
   nvl(fs.SumFree,0)   "SumFree",
   to_char(decode(fs.MaxFree,null,0,fs.MaxFree),'99G999G999') "MaxFree",
   allocation_type     "AllType",
   initial_extent/1024     "InExt",
   block_size "BlockSize",
   segment_space_management    "ASSM"
  FROM dba_tablespaces  ts,
   dba_data_files   df,
   ( SELECT tablespace_name,
    sum(bytes)/(1024*1024)   SumFree,
    max(bytes)/1024   MaxFree
   FROM dba_free_space
  GROUP BY tablespace_name ) fs
WHERE ts.tablespace_name = df.tablespace_name
   AND ts.tablespace_name = fs.tablespace_name (+)
GROUP BY ts.tablespace_name, ts.status, allocation_type, initial_extent,
  block_size, fs.SumFree, fs.MaxFree, segment_space_management
union all
SELECT 'dummy'   "Dummy",
   ts.tablespace_name    "Ts",
   count(bytes) "NbrFiles",   -- instead of count(*), use a column which is null if the temp file is missing
   ts.status     "Status",
   sum(bytes)/(1024*1024)    "Size",
   sum(decode(maxbytes,0,bytes,maxbytes)-bytes)/(1024*1024) "MaxAutoExt",
   to_number(null)   "PctUsed",
   to_number(null)   "SumFree",
   '  temporary'     "MaxFree",
   allocation_type   "AllType",
   initial_extent/1024   "InExt",
   block_size    "BlockSize",
   segment_space_management "ASSM"
  FROM dba_tablespaces  ts,
   dba_temp_files   tf
WHERE ts.contents = 'TEMPORARY'
   AND ts.tablespace_name = tf.tablespace_name (+)
GROUP BY ts.tablespace_name, ts.status, allocation_type, initial_extent,
  block_size, 5, 6, segment_space_management
ORDER BY "Ts";

by 제로 [2012.07.24 16:32:17]
일단 어느 테이블스페이스가 늘어났는지에 대한 부분이 없네요..
테이블스페이스의 경우 사용분야(?)에 따라 크게 4분류로 나눌수 있겠는데요..
1. 시스템테이블스페이스(SYSTEM, SYSAUX 등등)
2. 언두테이블스페이스(UNDOTBS1 등등)
3. 템프테이블스페이스(TEMP) 
4. 사용자테이블스페이스(DBA가 목적에 따라 만든 테이블스페이스들)
1번과 같은 테이블스페이스는 오브젝트들의 정보를 저장하는 테이블스페이스로 
사용자 테이블을 저장하지는 않는게 좋습니다. 따라서, 이 테이블스페이스가
늘었났다면 사용자 테이블이 본의아니게? 저장되어 있지는 않은지 확인하시면 될듯합니다.
2번과 같은 테이블스페이스가 증가했다면 최근에 대량의 DML(insert, update, delete) 작업이 
있었는지 확인을 해보세요. 
3번과 같은 테이블스페이스가 증가했다면 대량의 데이터를 sort, hash 작업이 있었는지에 대한
확인을 해보세요. sort, hssh 작업시 템프테이블스페이스를 사용합니다.
4.번과 같은 경우 대량의 테이블이 생성 또는 대량의 데이터가 인서트되면 저장공간도 증가하겠죠~
즉, dba_segments 를 조회하시어 어느 테이블의 용량이 큰지 확인하셔야 할것 같습니다.
select * from dba_segments where tablespace_name = 'TEST' order by bytes desc;

최근의 인서트 문장은 메모리에 저장되어 있다면
SELECT sql_id, last_active_time, SUBSTR(sql_text, 1, 100) sql_text
FROM v$sqlarea 
WHERE REGEXP_LIKE(sql_text, '^insert|^INSERT');
메모리에서 밀려났다면 최대 7일(default) dba_hist_sqltext 로 조회 하실수 있습니다.
SELECT *
FROM dba_hist_sqltext
WHERE command_type = 2;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입