IT정보공유/DB

MSSQL 파일 그룹이 꽉 찼으므로 데이터베이스 개체에 공간을 할당할 수 없습니다 오류

알지오™ 2021. 6. 14.

MSSQL 데이터베이스를 사용하다보면 아주 가끔 만날 수 있는 오류메세지입니다. 일반적인경우 보기 힘든 오류인데
"'PRIMARY' 파일 그룹이 꽉 찼으므로 데이터베이스의 개체(테이블)에 공간을 할당 할 수 없습니다. 필요 없는 파일을 삭제하거나, 파일 그룹의 개체를 삭제하거나, 파일 그룹에 파일을 추가하거나, 파일 그룹의 기존 파일에 대해 자동 증가를 설정하여 디스크 공간을 만드십시오" 라는 메세지가 표시될때 조치 방법에 대해 알아보도록 하겠습니다.

 

 

MSSQL DB에 DELETE, INSERT 등 쿼리 수행이 되지 않는 상황

Insert Query, Delete Query가 실행이 되지 않았습니다. Select는 잘 됩니다.
그런데 데이터를 조작&가공하는 쿼리는 수행이 안되는 상황.
특정 테이블의 데이터를 모두 삭제하기 위해 delete from [table] 명령을 내렸지만,
SSMS에서는 아래와 같이 행이 삭제되지 않았습니다라는 오류창이 떴습니다.

 

행이 삭제되지 않았습니다. 파일 그룹의 개체를 삭제하거나 파일그룹에 파일을 추가하라는 메세지
행이 삭제되지 않았습니다. 파일 그룹의 개체를 삭제하거나 파일그룹에 파일을 추가하라는 메세지

 

"공간을 할당 할 수 없습니다"라는 말은 하드디스크의 용량이 부족한거라고 생각하기 쉽습니다만, 무조건 하드디스크가 부족한 것은 아닙니다. 위에서 확인한 오류메세지는 하드디스크의 공간이 부족한 것이 아닌, 데이터베이스 파일의 사용가능한 공간이 없었기 때문에 발생했습니다.

 

데이터베이스 속성을 확인해 보겠습니다.
파일 페이지를 선택하면 데이터베이스의 여러가지 속성이 표시되는데 그 중에서
크기 항목과 사용 가능한 공간 항목을 보시면, 크기는 10기가바이트 정도로 DB 파일인 MDF 파일의 용량이 매우 큽니다.
하지만 사용 가능한 공간은 1메가 남짓. (하지만 실제로 하드디스크의 여유공간이 부족하지는 않음)

 

데이터베이스 속성 - 크기, 사용 가능한 공간
데이터베이스 속성 - 크기, 사용 가능한 공간

 

이렇게 데이터베이스가 사용할 수 있는 공간이 부족하다 보니, 쿼리 실행을 못하는 상황이 되는 거죠.
사용 가능한 공간을 확장 또는 확보하는 방법은 아래와 같은 방법을 시도해 볼 수 있습니다.

 

  1. 하드디스크 용량 확인 후 공간부족인 경우 하드 증설 후 DB이관
  2. 데이터베이스 파일 속성 자동 증가 설정
  3. 데이터베이스 파일 추가
  4. 사용하지 않거나 삭제해도 무관한 테이블 및 데이터 삭제

 

하드디스크 용량이 부족한지 확인해봤으나, 아니였습니다.
그래서 사용하고 있는 데이터베이스 파일의 자동증가설정이 잘못되어 있는지도 확인해 봤습니다.
하지만 정상적으로 데이터베이스파일의 용량이 자동증가 되도록 설정되어 있었습니다.

 

데이터베이스 파일 자동 증가/최대 크기 설정
데이터베이스 파일 자동 증가/최대 크기 설정

 

이미 데이터베이스파일의 크기가 10기가이상 커져서 그런지 더이상 확장이 되지 않는 상태, 왜 10기가에 제한이 걸린것인지도 모르겠으나 어찌되었든 DB에서 삭제와 삽입 모두 안되는 상황인지라 데이터베이스 파일을 추가로 만들려고 했으나 그것도 불가능했습니다.

 

 

마지막 방법, 데이터베이스 사용가능한 공간 확보 방법 - 레코드 개별 삭제

DELETE FROM [TABLE] 명령 실행이 안된다고 처음에 말씀드렸습니다. 그래서 선택한 방법은 상위행 편집기능을 이용하여 레코드 하나씩 하나씩 삭제하는 방법이였습니다.

 

상위 200개 행 편집
상위 200개 행 편집

상위 200개 행 편집 기능을 이용해 레코드를 일부만 제한적으로 삭제하게 되면 저장공간이 부족해도 삭제가 가능해집니다.
이 방법이 가능한 이유는 테이블 전체 데이터를 삭제하면, MSSQL이 LOG를 남겨야 되기 때문에 저장공간을 사용하게 됩니다. 그런데 저장공간이 없으니 로그를 남길 수 없기 때문에 삭제도 안하는 것이죠.
삭제하는 레코드갯수가 적으면 로그도 적게 남고, 삭제된 레코드만큼 또 저장공간은 비워지게 되므로 조금씩 조금씩 삭제하면 삭제할 수 있습니다.
그리고 어느정도 삭제가 되었으면 과감하게 쿼리문(DELETE or TRUNCATE)를 이용하여 데이터를 날려버리면 데이터베이스 파일의 여유공간이 사용 가능한 공간으로 바뀌게 됩니다.

 

--

DELETE FROM [TABLE NAME];

--

-- or

TRUNCATE TABLE [TABLE NAME];

--

 

저는 깔끔하게  TRUNCATE 명령으로 테이블을 싹 비웠습니다.
그리고 굉장히 많은 공간이 확보되었습니다.

 

테이블 데이터 삭제 후 늘어난 데이터베이스 파일 사용가능한 공간
테이블 데이터 삭제 후 늘어난 데이터베이스 파일 사용가능한 공간

 

DELETE or Insert가 되지 않는 문제가 발생할 경우엔
데이터베이스 파일의 사용 가능한 공간을 확인해 보시기 바랍니다.
테이블 레코드 삭제가 한번에 안될때에는 1개씩 삭제해 공간을 먼저 확보해 보는 것도 잊지마시고요~

 

 

댓글

💲 추천 글