2007~2011/SQL Server2011. 4. 1. 20:13
SQL Server 2008 에서 대용량 데이터베이스를 복구하는 데 발생하는 메모리 부족 오류!

오류: 701, 심각도: 17, 상태: 123.
There is insufficient system memory in resource pool 'internal' to run this query.

30만개가 넘는 VLF 를 가진 트랜잭션 로그가 포함된 데이터베이스를 복원하면서 발생하는 MemToLeave 공간 부족 이슈!
아무튼 MemToLeave 관련 이슈를 만났을 때, 우선 확인해 봐야 할 스크립트입니다. 예약된 작업에 추가하여 문제 발생 예상 시점에 SQL server process 내의 Max free block size 를 다음 쿼리를 통해 확인해 봅니다.

32bit SQL Server 환경에서 데이터베이스 복원 시, 쿼리 실패 이슈가 있어 정리해 봅니다.

USE LAIGO
GO

-- 테이블 생성
CREATE TABLE TblVA (regdate datetime, total bigint, free bigint)


-- Virtual Address 확인 
With VASummary(Size,Reserved,Free) AS 
(SELECT 
    Size = VaDump.Size, 
    Reserved =  SUM(CASE(CONVERT(INT, VaDump.Base)^0) 
    WHEN 0 THEN 0 ELSE 1 END), 
    Free = SUM(CASE(CONVERT(INT, VaDump.Base)^0) 
    WHEN 0 THEN 1 ELSE 0 END) 
FROM 
    SELECT  CONVERT(VARBINARY, SUM(region_size_in_bytes)) 
    AS Size, region_allocation_base_address AS Base 
    FROM sys.dm_os_virtual_address_dump  
    WHERE region_allocation_base_address <> 0x0 
    GROUP BY region_allocation_base_address  
UNION   
    SELECT CONVERT(VARBINARY, region_size_in_bytes), region_allocation_base_address 
    FROM sys.dm_os_virtual_address_dump 
    WHERE region_allocation_base_address  = 0x0 
AS VaDump 
GROUP BY Size) 

INSERT INTO TblVA
SELECT getdate(), SUM(CONVERT(BIGINT,Size)*Free)/1024 AS [Total avail mem, KB] ,CAST(MAX(Size) AS BIGINT)/1024 AS [Max free size, KB]  
FROM VASummary  
WHERE Free <> 0


추가적으로 701 오류 발생 시 덤프를 생성할 수 있도록 설정하는 DUMP TRIGGER 방법은 다음과 같습니다.

DBCC TRACEON(2551, 2546, -1)

DBCC DUMPTRIGGER ('set',701)


[참고자료]
Get memory
Posted by Lai Go