Access 테이블에서 작업을 수행할 때 "디스크 공간이나 메모리가 부족합니다." 오류

고급: 전문 코딩, 상호 운용성 및 다중 사용자 기술이 필요합니다.

이 문서는 Microsoft Access 데이터베이스(.mdb)에만 적용됩니다.

증상

테이블에서 작업을 수행할 때 작업에서 많은 수의 페이지 잠금을 만드는 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 디스크 공간이나 메모리가 부족합니다.

큰 테이블에서 작업 쿼리를 실행하는 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 이 작업 쿼리에서 수행할 데이터 변경 내용을 실행 취소할 디스크 공간이나 메모리가 충분하지 않습니다.

원인

트랜잭션에 필요한 페이지 잠금이 MaxLocksPerFile 값을 초과하며 기본값은 9500 잠금입니다. MaxLocksPerFilesetting은 Windows 레지스트리에 저장됩니다.

해결 방법

중요

이 절, 방법 또는 작업에는 레지스트리를 수정하는 방법에 대한 단계가 포함되어 있습니다. 그러나 레지스트리를 잘못 수정하면 심각한 문제가 발생할 수 있습니다. 따라서 다음 단계를 주의하여 수행해야 합니다. 추가된 보호를 위해 레지스트리를 수정하기 전에 백업하세요. 그런 다음 문제가 발생할 경우 레지스트리를 복원할 수 있습니다. Windows XP 및 Windows Server 2003에서 레지스트리를 백업, 편집 및 복원하는 방법에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료를 참조하세요.

322756 Windows에서 레지스트리를 백업 및 복원하는 방법

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

  • Regedit.exe 사용하여 레지스트리를 편집하고 MaxLocksPerFilevalue를 영구적으로 변경할 수 있습니다.
  • DBEngine 개체의 SetOptionmethod를 사용하여 코드에서 MaxLocksPerFilevalue를 일시적으로 변경할 수 있습니다.
  • 작업 쿼리를 실행할 때 오류가 발생하는 경우 쿼리를 수정하고 UseTransactionproperty를 아니요로 설정할 수 있습니다.

방법 1: 레지스트리에서 MaxLocksPerFile 변경

레지스트리 편집기 사용하여 다음 키에서 MaxLocksPerFile 값을 늘입니다.

Microsoft Access 2000, Microsoft Access 2002 및 32비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2003의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0

Microsoft Access 2000, Microsoft Access 2002 및 64비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2003의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet 4.0

32비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2007의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

64비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2007의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

32비트 Windows 운영 체제에서 실행되는 Microsoft Access 2010 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

64비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2010의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

32비트 Windows 운영 체제에서 실행되는 Microsoft Access 2013 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

64비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2013의 경우:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

32비트 Windows 운영 체제에서 실행되는 Microsoft Access 2016:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

64비트 Windows 운영 체제에서 실행되는 Microsoft Office Access 2016:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

메서드는 Microsoft Jet 데이터베이스 엔진 버전 4.0을 사용하는 모든 애플리케이션에 대한 레지스트리 설정을 변경합니다.

방법 2: SetOption을 사용하여 MaxLocksPerFile 임시로 변경

참고

이 문서의 샘플 코드는 Microsoft 데이터 액세스 개체를 사용합니다. 이 코드가 제대로 실행되려면 Microsoft DAO 3.6 개체 라이브러리를 참조해야 합니다. 이렇게 하려면 Visual Basic 편집기 도구 메뉴에서 참조를 클릭하고 Microsoft DAO 3.6 개체 라이브러리 검사 상자가 선택되어 있는지 확인합니다.

Microsoft에서 제공하는 프로그래밍 예제는 예시를 위한 것일 뿐이며 이와 관련하여 명시적이거나 묵시적인 어떠한 보증도 하지 않습니다. 이는 상품성이나 특정 목적에 대한 적합성의 묵시적인 보증을 포함하며 이에 제한되지 않습니다. 이 문서에서는 예제에 사용되고 있는 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구를 사용자가 잘 알고 있는 것으로 가정합니다. Microsoft 지원 엔지니어는 사용자에게 도움이 되도록 특정 프로시저에 대한 기능을 설명할 수 있지만 사용자의 특정 요구 사항에 맞도록 예제를 수정하여 추가 기능을 제공하거나 프로시저를 구성하지는 않습니다. SetOptionmethod는 레지스트리의 Microsoft Jet 데이터베이스 엔진 키에 대한 값을 일시적으로 재정의합니다. 새 값은 다시 변경하거나 DBEngine 개체가 닫혀 있을 때까지 계속 적용됩니다.

참고

SetOption 메서드를 사용하여 MaxLocksPerFilesetting을 변경한 내용은 DAO(데이터 액세스 개체)의 현재 세션을 통해서만 사용할 수 있습니다. Microsoft Access 사용자 인터페이스를 통해 실행되는 쿼리는 레지스트리의 설정을 계속 사용합니다.

다음 코드 샘플에서는 트랜잭션 내에서 업데이트 작업을 실행하기 전에 MaxLocksPerFile을 200,000으로 설정합니다.

Sub LargeUpdate()
   On Error GoTo LargeUpdate_Error
   Dim db As DAO.Database, ws As DAO.Workspace

' Set MaxLocksPerFile.
   DBEngine.SetOption dbMaxLocksPerFile, 200000

Set db = CurrentDb
   Set ws = Workspaces(0)

' Perform the update.
   ws.BeginTrans
   db.Execute "UPDATE BigTable SET Field1 = 'Updated Field'", _
         dbFailOnError

ws.CommitTrans

db.Close
   MsgBox "Done!"
   Exit Sub

LargeUpdate_Error:
   MsgBox Err & " " & Error
   ws.Rollback
   MsgBox "Operation Failed - Update Canceled"
   End Sub

방법 3: 작업 쿼리에서 UseTransaction 속성 설정

저장된 작업 쿼리로 인해 오류가 발생하는 경우 UseTransaction 속성을 아니요로 설정할 수 있습니다. 이렇게 하면 쿼리가 실행되는 동안 문제 또는 오류가 있는 경우 변경 내용을 롤백할 수 없습니다.

  1. 디자인 보기에서 쿼리를 엽니다.
  2. 보기 메뉴에서 속성을 클릭합니다.
  3. 쿼리 창의 위쪽 절반에 있는 빈 공간을 클릭하여 쿼리 속성 대화 상자를 표시합니다.
  4. UseTransactionproperty를 아니요로 설정합니다.
  5. 쿼리를 저장하고 닫습니다.

추가 정보

레지스트리의 MaxLocksPerFilesetting은 Microsoft Jet 데이터베이스 엔진의 트랜잭션이 지정된 값을 초과하지 못하도록 방지합니다. 트랜잭션이 MaxLocksPerFile 값을 초과하는 잠금을 만들려고 하면 트랜잭션이 두 개 이상의 부분으로 분할되고 부분적으로 커밋됩니다.

문제를 재현하는 방법

다음 예제에서는 Visual Basic 프로시저를 사용하여 10,000개 레코드가 포함된 테이블을 만든 다음 오류 메시지를 발생시키기 위해 테이블을 수정합니다.

  1. 샘플 데이터베이스 Northwind.mdb 엽니다.
  2. 모듈을 만든 다음 다음 절차를 입력합니다.
Sub CreateBigTable()
   Dim db As Database, rs As Recordset
   Dim iCounter As Integer, strChar As String
   Set db = CurrentDb
   db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
     "Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
     dbFailOnError
   Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
   iCounter = 0
   strChar = String(255, " ")
   While iCounter <= 10000
      rs.AddNew
      rs!ID = iCounter
      rs!Field1 = strChar
      rs!Field2 = strChar
      rs!Field3 = strChar
      rs!Field4 = strChar
      rs.Update
      iCounter = iCounter + 1
   Wend
   MsgBox "Done!"
End Sub

  1. 프로시저를 실행하려면 직접 실행 창에 다음 줄을 입력한 다음 Enter 키를 누릅니다.

    CreateBigTable
    

    프로시저는 10,000명의 레코드가 있는 BigTable이라는 테이블을 만듭니다.

  2. 모듈을 Module1로 저장한 다음 닫습니다.

  3. 디자인 보기에서 BigTable 테이블을 엽니다.

  4. Field4의 FieldSizeproperty를 253으로 변경합니다.

  5. 테이블을 저장합니다. 일부 데이터가 손실될 수 있다는 메시지가 표시되면 예를 클릭합니다.

    잠시 후 다음과 같은 오류 메시지가 표시됩니다.

    Microsoft Access can't change the data type.
    There isn't enough disk space or memory.  
    
    Errors were encountered during the save operation. Data types were not changed. Properties were not updated.