DBF 파일 줄이기 오류 0 2 11,919

by 김영철 10g 줄이기 물리 데이터파일 [2009.08.06 14:39:45]


UX-HP/Oracle 10g 를 사용하고 있습니다.

TXX001 이라는 테이블 스페이스를 할당하였고

내부는 각각 10GB의 dbf 파일을 15개 생성하여 모두 150GB의 물리적 공간을 할당하였습니다.

툴을 이용하거나 쿼리를 던져서 실제 데이터가 얼마나 들어갔나 싶어서 각각의 dbf파일을 열어보면 실 사용은

10GB/15GB 를 사용하고 있습니다.

 

데이터가 더 늘어나지 않을 것 같다는 판단에 5GB정도의 물리적인 공간이 유휴 상태로 있고 낭비라는 생각에서

dbf파일의 용량을 하나씩 줄여보려는 시도를 하고 있습니다.

 

그런데 일단 하나의 DBF파일을 타겟으로 조회를 해보니 10GB의 용량중 5GB만 사용하는 것으로 보여서

alter database datafile 'TXB01006.dbf' resize 6144M

이런 식의 구문을 던져봤으나.. 결과는..

ORA-03297: 파일에 요청된 RESIZE 값을 넘어선 사용된 값을 포함하고 있습니다

라고 에러메세지가 발생하고 있습니다.

이상하다 싶어서 점차 용량을 늘려서 9216M(9GB)로 1GB의 용량을 줄이기를 시도해도 같은 메세지가 발생하고 있습니다. DB 엔지니어에게 질문을 던져도 이상하다 하며 머리만 갸우뚱하고 왜 안되지 한마디를 남기시고는 알아본다 하시고 돌아가시고.. 결과는 아직 얻지를 못하고 있습니다..

혹시 이 원인을 분석할 방법이 있을까요?

이러다가는 다른 테이블 스페이스 영역으로 인해 쓸데 없는 HDD만 더 사야될지도 모르겠습니다..

방법 좀 알려주세요 ㅠ.ㅠ

어디서 어떻게 접근을 해야할지 모르겠어요 ㅠ.ㅠ

 

여담으로 MS-SQL을 관리하다가 Oracle로 넘어오니.. 아는 것 보단 모르는게 너무나 많네요^^;;


by 타락천사 [2009.08.06 14:54:18]
간단히 이야기 드리면
화일 내의 주소가
1 2 3 4 5 6 7 8 9 10
까지 있는 상황에서 앞은 텅텅 빈 상태고
8,9,10만 사용 상태에서 resize 하셔두 줄수가 없습니다.
우선 8,9,10에 있는 segment 를 1,2,3 을로 옮기셔야 합니다.
alter table 테이블명 tablespace이름 ( 원래 위치하던 tablespace이름)을 주셔두
앞쪽으로 이동 됩니다.
인덱스를 rebuild 하세요
참고자료)
기존의 datafile을 resize하여 늘리거나 줄일 수 있습니다.
datafile size를 증가하는 경우는 disk에 free space만 있다면 다음과 같이 간단합니다.
다음과 같이 늘리면 되나 줄일 경우는 계산을 하여 줄여야 합니다.
<Bulletin No: 10165> 참고
SQL>alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;

줄이실 경우는 주의가 필요합니다. 만일 지정한 size만큼 data가 있다면
error가 발생되고 resize되지 않습니다.
SQL> alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;
alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M'
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
50953 128
1 select max(block_id), max(blocks)
2 from dba_extents e
3 where e.file_id in (select file_id from dba_data_files
4 where tablespace_name ='USERS')
5* order by block_id
SQL> /
MAX(BLOCK_ID) MAX(BLOCKS)
------------- -----------
50953 128

방법1
-------
1) 줄이고자하는 file id를 확인합니다.
SVRMGR> select file_id, file_name from dba_data_files;
2) 얼마를 사용했는지 확인합니다.
SVRMGR> select block_id, blocks from dba_extents
2> where file_id='FILE_ID' order by block_id;
FILE_ID 대신에 줄이려는 file id를 기술합니다.
3)현재 사용중이 db block size를 확인합니다.
SVRMGR> show parameter db_block_size
만일 2048일 경우 다음과 같이 계산합니다.
2)에서 조회된 마지막의 block_id, blocks 값을 가지고 계산합니다.
block_id * 2048 + blocks * 2048 의 결과에 한 block더한 값만큼만 줄이는
것이 가능합니다.
만일 마지막으로 조회된 값이 block_id가 578261, blocks가 515일 경우
578261*2048 + 515*2048 =1185333248로 최소한 1.2GB이상은 써야 합니다.
==>

4) 실제 datafile을 줄입니다.
svrmgr>alter database datafile '/oracle/dbs/toolsORA.dbf' resize
1200M;

by 김영철 [2009.08.06 17:16:56]
아.. 타락 천사님 감사합니다..
말씀하신대로 하니까 물리적 공간을 10G 할당했는데 나오는 값도 10G로 나오네요..
줄일 공간이 없네요 ㅡㅡ;;

그럼 이걸 줄이려면 TableSpace move로 처리를 해서 정리를 한번 하는 수 밖에 없겠군요 ㅠ.ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입