2010-08-07 15 views
8

.mdb 파일의 크기는 70MB입니다.MS Access 데이터베이스를 압축하는 방법

파일에 포함 된 모든 레코드를 삭제 한 후에도 크기는 70MB로 유지됩니다.

.mdb 파일을 더 작게 만들려면 어떻게해야합니까?

+0

일부 수정되었습니다. MB 단위로 펀 트배를 잡았습니다. 가장 가능성있는 측정 단위와 같았습니다. 실제로 질문의 결과에 영향을 미치지 않습니다. – spender

+2

나는이 질문에 대한 비판을 듣지 않는다. 나는 원래의 질문에 대한 출처로 갔고, 편집 내용이 명료하게 명확 해졌지만, 어떤 질문을 받았는지 완전히 분명했다. 그것은 처음부터 진정한 질문이었습니다. 두 번째로, 프로그래밍이 명시 적으로 포함되지 않은 데이터베이스 유지 관리에 대한 질문은 SO에서 허용되므로 어디에서나 발생하므로 반드시 수퍼 유저 질문이 무엇인지는 알 수 없습니다. 나에게 그것은 회색 영역처럼 보입니다 - 그것은 SU에도 괜찮은 질문이 될 것입니다. 그러나 나는 그것이 SO에 속하지 않는다는 것을 보지 못합니다. –

답변

8

mdb를 열고 '압축 및 복구'를 수행하십시오. 이렇게하면 mdb의 크기가 줄어 듭니다.

'압축시 닫기'옵션을 켜기 (기본적으로 꺼짐)로 설정할 수도 있습니다. 여기

은 몇 가지 추가 정보에 대한 링크입니다 : http://www.trcb.com/computers-and-technology/data-recovery/ways-to-compact-and-repair-an-access-database-27384.htm

+3

당신은 어떻게 그것을 이해 했습니까 ...? – Alexander

+1

10 년 전에 똑같은 문제가 있었는데 그게 내 정확한 단어라고 생각합니다 ...-) –

+1

압축 및 복구 방법 –

16

지금까지 정기적 인 유지 보수 작업이 그들에 실행 요구 데이터 저장을 최적화하고 여유 공간을 복구하기를 존재하고 모든 데이터베이스 엔진. xBase 일전에 PACK 명령을 실행하여 삭제 된 행을 제거했습니다. SQL Server에서 동일한 이유로 실제 데이터 파일을 축소하기 위해 스크립트를 실행합니다.

왜 모든 데이터베이스 엔진이이를 수행합니까?

데이터베이스에 대한 모든 쓰기가 전체 파일을 최적화 된 순서로 다시 작성해야한다면 성능이 크게 저하 될 수 있습니다. 각 데이터 테이블을 별도의 파일에 저장하는 데이터베이스를 생각해보십시오. 테이블에 10000 개의 레코드가 있고 5000 번째 레코드를 삭제하면 여유 공간을 없애기 위해 데이터 파일의 전체 후반부를 다시 작성해야합니다. 대신, 모든 데이터베이스는 사용 된 공간을 다음에 최적화 작업이 데이터 테이블에서 실행될 때 사용되지 않고 무시할 수있는 것으로 표시하는 형식을 사용합니다.

Jet/ACE는 다른 데이터베이스 엔진과 다르지 않으며 Jet/ACE 데이터베이스를 데이터 저장소로 사용하는 모든 응용 프로그램에는 백업과 압축을 포함하여 정기적 인 유지 관리 작업이 예약되어 있어야합니다.

서버 데이터베이스 엔진에없는 Jet/ACE에는 몇 가지 문제가 있습니다. 특히, 모든 사용자가 데이터 파일에 대한 연결을 종료하지 않으면 압축 할 수 없습니다. 서버 데이터베이스에서 사용자는 데이터베이스 엔진의 서버 측 프로세스에 연결하고 해당 서버 측 악마는 데이터가 저장되는 실제 데이터 파일의 유일한 "사용자"입니다. 따라서 서버 악마는 최적화 및 유지 관리 루틴을 언제 실행할 것인지를 결정할 수 있습니다. 데이터 파일이 언제 사용되는지 여부를 전적으로 제어하기 때문입니다.

Access 응용 프로그램의 일반적인 문제 중 하나는 사용자가 자신의 컴퓨터에서 응용 프로그램을 열어두고 사무실을 떠나야한다는 것입니다. 즉, 컴팩트 한 작업을 수행 할 때, 즉 오전 2시에 파일이 열려 있다는 의미입니다. compact는 원본 파일을 대체하기 때문에 실행할 수 없습니다. 이 문제를 겪는 Access 애플리케이션의 대부분 프로그래머는 백업 복사본이 100 % 내부적으로 일관성있는 상태에 있음을 보장하지 않지만 볼륨 섀도 복사본은 여전히 ​​파일의 백업을 허용합니다. , 또는 하룻밤 유지 관리 작업을 허용 할 적절한 시간에 종료하도록 Access 응용 프로그램을 설계합니다. 나 혼자 다 했어.

비 액세스 응용 프로그램에서 같은 문제가 있지만 다르게 해결해야합니다. 웹 응용 프로그램의 경우 문제가 될 수 있지만 일반적으로 압축을 요구하는 웹 응용 프로그램은 Jet/ACE 데이터 저장소가 전적으로 부적절한 데이터입니다.

지금, COMPACT ON의 CLOSE의 주제에 :

그것은 누군가에 의해 사용해서는 안됩니다.

실제로에서 개막 때

그것은 쓸모 명백히 위험이 쓸모

하는 사용자가 지금까지 백 엔드를 개방 할 것없이 제대로 설계된 생산 환경이 있기 때문에 -. 그것이 액세스 응용 프로그램이 있다면, 그것은해야 분할하여 사용자가 프런트 엔드 만 열면 웹 앱 인 경우 사용자는 데이터 파일과 직접 상호 작용하지 않습니다. 따라서 두 시나리오 모두 어느 누구도 COMPACT ON CLOSE를 실행하지 않으므로 시간을 낭비했습니다.

둘째, 누군가가 가끔 트리거하더라도, 해당 사용자 만 데이터베이스를 열면 작동합니다. 위에서 말했듯이, 다른 사용자가 열려있는 경우 압축 할 수 없기 때문에 COMPACT ON CLOSE는 해당 사용자를 트리거하는 사용자가 배타적 액세스 권한을 가질 때만 실행할 수 있습니다.

하지만 최악의 경우 COMPACT ON CLOSE은 위험하며 실행하면 실제 데이터가 손실 될 수 있습니다. 이는 Jet/ACE 데이터베이스가 내부 구조가 손상 되어도 데이터가 모두 액세스 할 수있는 특정 상태가 있기 때문입니다. 해당 상태에서 압축/복구 작업을 실행하면 데이터가 손실 될 수 있습니다. 이것은 매우 드문 상태이지만 매우 먼 경우입니다.

요점은 COMPACT ON CLOSE은 조건부가 아니며, 실행할지 묻는 프롬프트가 없다는 것입니다. 실행되기 전에 백업을 수행 할 기회가 없기 때문에 데이터베이스를 켜지 않으면 매우 드문 상태입니다. 복구 할 수없는 데이터가 손실 될 수 있습니다. 컴팩트 한 작업을 실행하지 않았습니다.

즉, 간단히 말해서 Jet/ACE 및 압축에 대한 지식이없는 누구도 COMPACT ON CLOSE를 사용하지 않습니다.

단일 사용자의 경우 필요에 따라 간단히 압축 할 수 있습니다.

공유 응용 프로그램의 경우 일종의 예약 된 유지 관리 스크립트가 가장 좋습니다. 일반적으로 파일 서버에서 밤새 실행됩니다. 이 스크립트는 파일을 백업 한 다음 압축 파일을 실행합니다. VBScript로 작성하고 쉽게 예약 할 수있는 아주 간단한 스크립트입니다.

마지막으로 응용 프로그램에서 많은 수의 레코드를 자주 삭제하면 대부분의 경우 디자인 오류가 발생합니다. 정규 프로덕션 용도로 추가되거나 삭제 된 레코드는 일시적 데이터이며 논리적으로 말하고 실용적인 의미로 주 데이터 파일에 포함되지 않습니다.

모든 제작 응용 프로그램에는 아키텍처의 일부로 임시 데이터베이스가 있으며 모든 임시 테이블이 여기에 저장됩니다. 나는 임시 데이터베이스를 압축하는 것을 결코 신경 쓰지 않는다. 임시 데이터베이스 내에서 성능이 저하되어 성능이 저하되는 경우 임시 데이터베이스 이외의 임시 데이터베이스가 없으므로 임시 데이터베이스의 빈 복사본을 기존 데이터베이스의 맨 위에 복사하면됩니다. 이렇게하면 프런트 엔드 또는 백 엔드에서 변동 및 부풀림이 줄어들고 백 엔드 데이터 파일에서 필요한 압축 파일의 빈도가 크게 줄어 듭니다. (| 데이터베이스 유틸리티 도구)는 현재 열려있는 데이터베이스를 압축 할 수있는 액세스 UI에서

  1. : 압축하는 방법에 대한 질문에

    는 옵션이 될 것입니다.그러나 이는 프로세스의 일부로 백업을 할 수 없으며, 문제가 발생한 경우에 대비하여 압축하기 전에 백업하는 것이 좋습니다.

  2. Access UI에서 이 아닌 데이터베이스를 압축 할 수 있습니다. 이 파일은 기존 파일에서 새로운 파일로 압축되기 때문에 완료되면 원래 파일과 새로 압축 된 파일의 이름을 바꾸어야합니다 (새 이름을 갖기 위해). 압축 할 파일을 묻는 FILE OPEN 대화 상자에서 파일의 이름을 바꾸면 수동으로 처리 할 수 ​​있습니다.

  3. 코드에서 DAO DBEngine.CompactDatabase 메서드를 사용하여 작업을 수행 할 수 있습니다. Access VBA, VBScript 또는 COM을 사용할 수있는 모든 환경에서 사용할 수 있습니다. 파일을 백업하고 이름을 바꾸는 등의 작업을 코드에서 담당합니다.

  4. 다른 옵션은 JRO (Jet & 복제 개체)이지만 DAO가 아직 가지고 있지 않은 조밀 한 조작에 대해서는 아무것도 제공하지 않습니다. JRO는 ADO 자체에서 지원되지 않는 Jet 관련 기능을 처리하는 별도의 라이브러리로 만들어 졌으므로 ADO를 인터페이스로 사용하는 경우 MS 권장 압축 라이브러리는 JRO입니다. DAO 참조가 없더라도 (예 : DAO 참조 여부에 상관없이 DBEngine은 Access에서 항상 사용할 수 있음) CompactJatabase 메서드를 사용할 수 있으므로 JRO는 Compact 내에서 적합하지 않습니다. 즉, JRO CompactDatabase 메서드는 JRO 참조 (또는 후기 바인딩 사용)에서만 사용할 수있는 DAO 또는 ADO 참조없이 Access 내에서 DBEngine.CompactDatabase를 사용할 수 있습니다. Access 외부에서 JRO가 적절한 라이브러리 일 수 있습니다.

백업의 중요성을 강조하겠습니다. 1000 번 중 999 번 (또는 그보다 덜 자주 사용)은 필요하지 않지만 필요할 때 필요합니다. 미리 백업하지 않고 압축하지 마십시오.

마지막으로 컴팩트 한 후에 압축 된 파일을 검사하여 MSysCompactErrors라는 시스템 테이블이 있는지 확인하는 것이 좋습니다. 이 표는 콤팩트 중 발생한 문제가 있으면 나열합니다.

이제는 컴팩트와 관련하여 생각할 수있는 전부입니다.

+3

당신의 대답이 바주카포로 파리를 죽이는 것 같은 기분 일지라도 좋은 게시글입니다. :) –

+0

ㅎ, 맞아. 하지만이 질문은 자주 묻습니다. 사람들이 Jet/ACE를 비롯한 데이터베이스를 어떻게 사용하는지에 대한 기본 지식이 없어도 사용할 수 있습니다. 이렇게하면 단 한 곳에서 모든 것을 한 번에 볼 수 있습니다. 단편적인 주제에 대해 질문에 대답해야하는 대신에 필요할 때 사람들이 지적 할 수 있기를 바랍니다. 나는 내가 무엇을하고 모르는 지 이해하는 데 도움이되기 때문에 이런 답을 쓰는 것을 좋아합니다. 가끔은 다른 사람들을 돕기를 바랍니다. –

4

Microsoft Access 데이터베이스 엔진은 데이터베이스 파일의 압축 복사본을 만드는 CompactDatabase 메서드를 제공합니다. CompactDatabase를 호출하기 전에 데이터베이스 파일을 닫아야합니다.

문서 : 당신이 압축 할 수 있습니다 파이썬으로

import os.path 
import sys 
import win32com.client 

# Access 97: DAO.DBEngine.35 
# Access 2000/2003: DAO.DBEngine.36 
# Access 2007: DAO.DBEngine.120 
daoEngine = win32com.client.Dispatch('DAO.DBEngine.36') 

if len(sys.argv) != 3: 
    print("Uses Microsoft DAO to copy the database file and compact it.") 
    print("Usage: %s DB_FILE FILE_TO_WRITE" % os.path.basename(sys.argv[0])) 
    sys.exit(2) 

(src_db_path, dest_db_path) = sys.argv[1:] 
print('Using database "%s", compacting to "%s"' % (src_db_path, dest_db_path)) 
daoEngine.CompactDatabase(src_db_path, dest_db_path) 
print("Done") 
1

:

복사 컴팩트 MDB 파일을 DAO를 사용하는 파이썬 스크립트입니다 pypyodbc libary 수 (.mdb 또는 .accdb 중)

import pypyodbc 
pypyodbc.win_compact_mdb('C:\\data\\database.accdb','C:\\data\\compacted.accdb') 

(source)

는 그런 다음 데이터베이스에 다시 compacted.accdb 복사 할 수 있습니다.shutil와 함께에만 적용 :

import shutil 
shutil.copy2('C:\\data\\compacted.accdb','C:\\data\\database.accdb') 

(source)

: 내가 아는 한 ODBC, 파이썬과 라이브러리에 액세스 DB를위한해야 32 비트 (link). 또한이 단계는 Windows OS에서만 작동합니다.

관련 문제