본문 바로가기

개발&컴퓨터/DB

MSSQL 'PRIMARY' 파일 그룹 용량 부족 문제 해결

반응형

DB서버를 운영하다 보면 웹사이트 접속시, 다음과 같은 에러를 만나는 경우가 있습니다. (물론 주기적으로 관리하고, 모니터링 시스템을 두고 있다면 이런 문제는 안만나겠죠?^^)

 

Microsoft OLE DB Provider for SQL Server 오류 '80040e14'

 

'PRIMARY' 파일 그룹이 꽉 찼으므로 데이터베이스 'tempdb'의 개체 '<temporary system object: 422217677930496>'에 공간을 할당할 수 없습니다. 필요 없는 파일을 삭제하거나, 파일 그룹의 개체를 삭제하거나, 파일 그룹에 파일을 추가하거나, 파일 그룹의 기존 파일에 대해 자동 증가를 설정하여 디스크 공간을 만드십시오.

 

/sub/aaa/bbb.asp, 줄 27  

 

 

 

 

 

어떻게 대처해야 할까요?

웹사이트의 /sub/aaa/bbb.asp 폴더의 27번째 줄에서 오류가 났는데, 아마 DB 관련 접속이나 쿼리 질의 구문이 있을 겁니다.

 

여기서 문제가 발생한 DB가 tempdb 인데, 해당 DB의 데이터를 저장하는 물리적 Primary 파일 그룹을 저장하는 공간이 부족한 것으로 보입니다. 어떻게 하라고 가이드를 주고 있군요.

 

이 문제는 대부분 해당 DB를 저장하는 물리적인 하드디스크의 공간에 데이터를 쓸 공간이 없어 발생합니다.

만약 파일 그룹의 크기가 MAX에 도달했을 경우, 자동 증가 처리를 해 놓지 않은 경우에도 발생합니다. (하지만, 대부분 자동 증가 설정을 해놓을 셨을 것입니다.)

 

해결 방법은 어렵지 않으며 여러가지가 있습니다.

* 해당 DB의 데이터를 저장하는 DB파일이 관리되는 하드디스크의 공간을 늘려주면 됩니다. DB파일이 있는 하드디스크 드라이브에서 파일을 직접 삭제합니다.

* 또는 tempdb의 DB를 비워주거나 그 외에 tempdb와 같은 하드디스크 드라이브를 사용하는 불필요한 DB파일을 삭제해주어도 됩니다.

* 하드디스크의 공간이 여유가 있는데, 위와 같은 에러가 났다면 해당 DB의 용량을 자동 증가 처리해 놓지 않은 경우입니다. (아주 예외적인 케이스)

 

결론은 하나인데, 하드디스크의 공간을 여유있게 해주면 됩니다.

 

 

참고로 위의 에러는 tempdb에서 발생하였는데(실제 다른 사용자 DB에서도 발생할 수 있습니다.), 사실 tempdb는 MS-SQL에서 제어하고, 관리되는 임시 데이터 관리 DB입니다. MS-SQL에서 직접 제어하고, 임시 관리되는 데이터가 더 이상 사용되지 않으면 불필요하게 용량이 증가하지 않도록 처리합니다. 그렇기 때문에 특별한 경우가 아니라면 tempdb의 용량은 매우 작게 유지될 것입니다. 그렇기 때문에 tempdb에서 파일 그룹 용량 부족 문제가 발생하였다면 tempdb 용량을 축소하는 것보다는 DB데이터가 저장되는 하드디스크 공간을 여유롭게 해주는 것이 가장 좋은 해결 방법입니다.

 

일단 tempdb 가 하드디스크의 어느 드라이브에 물리적으로 저장되어 있는지 확인해보도록 하겠습니다.

 

MSSQL ServerManagement Studio 를 실행하고, 좌측의 개체 탐색기에서 tempdb 를 선택합니다. (tempdb는 시스템 데이터베이스에 있습니다.)

tempdb를 선택한 후, 마우스 우측 버튼을 클릭하면 뜨는 컨텍스트 메뉴에서 속성 메뉴를 선택합니다.

 

 

 

 

 

데이터베이스 속성 다이얼로그가 뜨면 좌측 페이지 선택 메뉴에서 '파일'을 선택합니다.

'파일'의 우측 화면을 보면 데이터베이스 파일이 실제 저장되어 있는 경로가 표시됩니다. 두 데이터베이스 파일이 순차적으로 보여지고 있는데, 첫번째 것이 실제 데이터를 저장하고 관리하는 PRIMARY 파일 그룹에 속한 DB이며, 두번째 것은 로그 파일입니다.

 

 

 

 

파일이 E드라이브에 있군요. 아마 E드라이브의 용량이 꽉 찬 것으로 보입니다.

 

 

 

 

예상이 맞았습니다. E 드라이브에 용량이 없군요. (이렇게 될 동안 뭘한거야? ㅎㅎㅎ)

 

일단 E 드라이브로 가서 tempdb 파일의 용량을 확인해보도록 할까요?

 

 

 

 

생각보다 용량이 크지 않군요. 그렇다면 tempdb 를 비우는 것은 큰 의미가 없겠습니다.

 

그렇다면 다른 파일들을 삭제하거나 다른 DB파일의 용량을 축소하면 문제가 해결될 것 같습니다.

같은 폴더에 다른 DB파일들도 많군요. 10GB의 파일도 보입니다. 

 

 

 

불필요한 DB파일을 삭제하거나 DB 로그(Log) 파일을 삭제하는 것이 가장 좋은 해결책으로 보입니다.

위의 폴더에서 확장자가 ldf 인 것들은 모두 로그파일들입니다. 로그 내용을 비우더라도 서비스에 영향을 주지는 않습니다.

(단, 로그를 축소하기 전에는 가급적 다른 드라이브나 다른 서버에 축소 이전의 백업 데이터를 생성하여 저장하기를 권장합니다.)

 

DB 로그 파일을 축소하는 방법은 다음 포스팅을 참조하여 주세요. (로그 파일 축소는 어렵지 않습니다. 아래 포스팅에서 파란색 박스로 된 영역의 쿼리를 실행 해주면 됩니다.

 

[MSSQL] DB 로그 파일 축소하기 http://ozit.co.kr/103

 

 

용량이 큰 몇 개의 DB 로그 파일들을 축소하였더니, 용량이 많이 늘어 났습니다.

 

 

 

 

 

이제 더 이상  해당 웹사이트에서는 'PRIMARY' 파일 그룹 용량 부족 문제를 발생시키지 않을 것입니다.

 

가능하면 DB서버 HDD의 용량이 꽉차면 더 이상 DB에 데이터를 기록하지 못하는 심각한 오류가 발생하므로 주기적인 관리가 필요합니다. 특정 용량 미만으로 HDD 여유분이 줄어든다면 자동으로 문자메시지나 메일을 발송해주는 시스템을 구축해 놓는 것도 좋은 방법입니다.

 

반응형