programing

SQL Server 데이터베이스를 축소하려면 어떻게 해야 합니까?

codeshow 2023. 8. 5. 11:07
반응형

SQL Server 데이터베이스를 축소하려면 어떻게 해야 합니까?

데이터베이스 크기가 거의 1.9Gb인 데이터베이스가 있으며 MSDE2000은 2.0Gb를 초과하는 DB를 허용하지 않습니다.

이 DB(및 다양한 클라이언트 위치에서 이와 같은 많은 DB)를 축소해야 합니다.

저는 불필요한 것으로 간주되는 1000개의 레코드 중 100개를 찾아 삭제했습니다. 이러한 레코드는 데이터베이스의 주요(가장 큰) 테이블 중 일부에서 큰 비율을 차지합니다.따라서 이제 많은 공간을 검색할 수 있어야 한다고 가정하는 것이 합리적입니다.

이제 레코드가 누락된 이유로 DB를 축소해야 합니다.

  • 는 실합다를 실행합니다.DBCC ShrinkDatabase('MyDB')효과 없음.
  • MSMS에서 제공하는 다양한 수축 설비를 사용해 보았습니다.여전히 효과가 없습니다.
  • 데이터베이스를 백업하고 복원했습니다.여전히 효과가 없습니다.

여전히 1.9Gb

왜요?

최종적으로 찾은 절차는 OSql 또는 유사한 액세스 권한이 없는 클라이언트 시스템에서 재생할 수 있어야 합니다.

ALTER DATABASE MyDatabase SET RECOVERY SIMPLE

GO

DBCC SHRINKFILE (MyDatabase_Log, 5)

GO

ALTER DATABASE MyDatabase SET RECOVERY FULL

GO

이것은 이상하게 보일지 모르지만, 저는 이것을 자동화하기 위해 C# 프로그램을 만들었습니다.

1단계: 트랜잭션 로그 잘라내기(트랜잭션 로그만 백업, 비활성 트랜잭션 제거 옵션 켜기)

2단계: 모든 페이지를 파일의 시작으로 이동하여 데이터베이스 축소 실행

3단계: 2단계에서 로그 항목을 추가하므로 트랜잭션 로그를 다시 자릅니다.

4단계: 데이터베이스 축소를 다시 실행합니다.

SQL DMO 라이브러리를 사용하는 내 제거된 코드는 다음과 같습니다.

SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_NoTruncate);
SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_Default);

이것은 오래된 질문이지만, 우연히 발견했습니다.

정말 짧고 정확한 답은 이미 주어졌고 가장 많은 표를 얻었습니다.그것이 당신이 트랜잭션 로그를 축소하는 방법이며, 그것이 아마도 OP의 문제였을 것입니다.또한 트랜잭션 로그가 관리 범위를 벗어나면 트랜잭션 로그를 축소해야 하는 경우가 많지만, 향후 로그 상황이 관리 범위를 벗어나지 않도록 주의해야 합니다.dba.se 의 이 질문은 그것을 설명합니다.기본적으로 - 적절한 복구 모델, 트랜잭션 로그 유지 관리, 트랜잭션 관리 등을 통해 처음부터 이를 크게 만들지 마십시오.

그러나 데이터 파일(또는 로그 파일) 축소와 관련된 이 질문을 읽을 때 더 큰 의문점은 왜일까요? 그리고 시도할 때 어떤 나쁜 일이 일어날까요?축소 작업이 수행된 것처럼 보입니다.MSDE/Express 버전은 최대 DB 크기로 제한되기 때문에 이 경우에는 의미가 있습니다.하지만 올바른 답은 여러분의 요구에 맞는 버전을 보는 것일 수도 있습니다.그리고 프로덕션 데이터베이스를 축소하려고 하다가 이 질문을 우연히 발견했는데, 이것이 여러분이 스스로에게 그 이유를 물어야 할 이유가 아니라면요?질문.

웹에서 "데이터베이스 축소 방법"을 검색하는 누군가가 이 문제를 발견하고 이 문제를 해결하는 것이 멋지거나 허용되는 일이라고 생각하는 것을 원치 않습니다.

데이터 파일 축소는 특수한 경우를 위해 예약해야 하는 특수 작업입니다.데이터베이스를 축소할 때 인덱스를 효과적으로 조각내는 것으로 간주합니다.데이터베이스를 축소할 때 데이터베이스의 사용 가능한 공간을 다시 확보하게 되므로 시간을 낭비하고 DB가 다시 확장되는 경우에만 축소 작업의 성능 저하를 초래할 수를 고려해 보십시오.

저는 데이터베이스 축소에 대한 여러 블로그 게시물에 이 개념에 대해 썼습니다."수축 버튼을 만지지 마세요"라는 이름의 이 책이 가장 먼저 떠오릅니다.여기에 요약된 개념뿐만 아니라 데이터베이스 "올바른 크기 조정" 개념에 대해서도 설명합니다.데이터베이스 크기를 결정하고 미래의 성장을 계획한 후 그 크기에 할당하는 것이 훨씬 더 좋습니다.SQL Server 2005 이후에는 데이터 파일에 대해 Instant File Initialization을 사용할 수 있기 때문에 증가 비용은 낮아지지만 적절한 초기 애플리케이션을 사용하는 것이 좋습니다. 일반적으로 데이터베이스의 빈 공간을 먼저 생각하지 않고 축소하는 것보다 훨씬 덜 무서워합니다. :)

DBCC SHRINKDATABASE저한테는 효과가 있지만, 이것이 완전한 구문입니다.

DBCC SHRINKDATABASE ( database_name, [target_percent], [truncate] )

target_percent데이터베이스가 축소된 후 데이터베이스 파일에 남아 있는 사용 가능한 공간의 원하는 백분율입니다.

그리고.truncate매개 변수는 다음과 같습니다.

NOTRUNCATE

사용 가능한 파일 공간을 데이터베이스 파일에 유지합니다.지정하지 않으면 사용 가능한 파일 공간이 운영 체제에 릴리스됩니다.

TRUNCATEONLY

데이터 파일의 사용되지 않은 공간을 운영 체제에 릴리스하고 파일을 마지막으로 할당된 범위로 축소하여 데이터를 이동하지 않고 파일 크기를 줄입니다.할당되지 않은 페이지로 행을 재배치하지 않습니다. TRUNKATE ONLY를 사용하면 target_percent가 무시됩니다.

...그리고 yes no_one이 옳습니다. 데이터베이스 축소는 다음과 같은 이유로 그다지 좋은 방법이 아닙니다.

데이터 파일 축소는 데이터베이스 파일의 할당된 범위 끝에서 파일 앞쪽으로 페이지를 이동하기 때문에 상당한 논리적 단편화를 도입할 수 있는 훌륭한 방법입니다.

데이터베이스 축소는 데이터베이스, 서버에 많은 영향을 미칠 수 있습니다.그것을 하기 전에 그것에 대해 많이 생각해 보세요!

웹에는 그것에 대한 많은 블로그와 기사들이 있습니다.

답변이 늦었지만 다른 사람에게 유용할 수 있음

DBCC ShrinkDatabase/ShrinkFile 또는 SSMS(Tasks/Shrink/Database) 중 어느 것도 도움이 되지 않는 경우, 작업을 수행할 수 있는 Quest 및 ApexSQL의 도구가 있으며 필요한 경우 주기적인 축소를 예약할 수도 있습니다.

저는 얼마 전에 무료 평가판에서 후자를 사용하여 이 작업을 수행한 적이 있습니다. 이 기사의 마지막 부분에 있는 간단한 설명을 참조하십시오.

https://solutioncenter.apexsql.com/sql-server-database-shrink-how-and-when-to-schedule-and-perform-shrinking-of-database-files/

ApexSQL Backup을 설치하고 기본 리본에서 "데이터베이스 축소" 버튼을 클릭한 다음 팝업 창에서 데이터베이스를 선택하고 "마침"을 클릭하기만 하면 됩니다.

개별 데이터 파일도 축소해야 합니다.

그러나 데이터베이스를 축소하는 것은 좋은 생각이 아닙니다.예를 들어 여기를 참조하십시오.

다음을 사용해야 합니다.

dbcc shrinkdatabase (MyDB)

그러면 로그 파일이 축소됩니다(Windows 탐색기를 열어 두고 해당 작업이 수행되는지 확인).

다음은 또 다른 솔루션입니다.데이터베이스 게시 마법사를 사용하여 스키마, 보안 및 데이터를 SQL 스크립트로 내보냅니다.그런 다음 현재 DB를 오프라인으로 전환하고 스크립트를 사용하여 다시 작성할 수 있습니다.

어리석게 들리지만, 몇 가지 장점이 있습니다.첫째, 데이터가 손실될 가능성이 없습니다.원래의 DB(DB를 삭제할 때 삭제하지 않는 한!)는 안전합니다. 새 DB는 최대한 작아질 것이며, 현재 데이터베이스의 두 가지 스냅샷(하나는 롤 준비 완료, 하나는 최소화)이 생성됩니다. 백업에서 선택할 수 있습니다.

"따라서 이제 많은 공간을 회수할 수 있어야 한다고 가정하는 것이 합리적입니다."

질문을 잘못 이해했다면 죄송합니다만, 공간을 다 쓴 것은 로그 파일이 아니라 데이터베이스인 것이 확실합니까?데이터베이스가 어떤 복구 모델에 있는지 확인합니다.전체 상태일 수 있습니다. 즉, 로그 파일이 잘리지 않습니다.모든 트랜잭션에 대한 전체 레코드가 필요하지 않은 경우 단순으로 변경하면 로그가 잘립니다.프로세스 중에 데이터베이스를 축소할 수 있습니다.모든 것이 올바르게 진행된다고 가정할 때, 이 과정은 다음과 같습니다.

  1. 데이터베이스 백업!
  2. 단순 복구로 변경
  3. shrink db (우클릭 db, 모든 작업 선택 > shrink db -> 사용 가능한 공간 10%로 설정)
  4. 공간이 회수되었는지 확인합니다. 그렇지 않은 경우 전체 백업을 수행해야 할 수 있습니다.

그래도 작동하지 않거나 복구 모드를 전환하려고 할 때 "log file is full"(로그 파일이 꽉 찼습니다)라는 메시지가 표시되면 다음을 시도해 보십시오.

  1. 지원하다
  2. DB에 대한 모든 연결 종료
  3. db 분리 (우클릭 > 분리 또는 우클릭 > 모든 작업 > 분리)
  4. 로그(ldf) 파일 삭제
  5. DB를 다시 연결합니다.
  6. 복구 모드 변경

기타.

2000년 또는 2005년 버전 이후로 조금 더 까다로운 MSSQL 2012 버전에서 파일을 축소해야 함에도 불구하고 이 게시물을 보게 되었습니다.저는 이 문제와 관련된 모든 위험과 이슈를 읽고 테스트를 마쳤습니다.간단히 말해서 MS SQL Server Management Studio를 사용한 결과가 가장 좋았습니다.

Right-Click the DB -> TASKS -> SHRINK -> FILES -> select the LOG file

또한 데이터 및 로그 파일의 최소 크기를 수정해야 합니다.DBCC SHRORK 데이터베이스는 이미 할당한 파일 의 데이터를 축소합니다.파일을 최소 크기보다 작은 크기로 축소하려면 DBCC SHRORKFILE을 사용하고 새 크기를 지정합니다.

데이터를 삭제하고 복구 모델이 간단한지 확인한 다음 데이터베이스 축소 또는 파일 축소 작업을 수행합니다.데이터 파일이 여전히 너무 크고 데이터를 저장하는 데 힙을 사용하는 경우(즉, 큰 테이블에 클러스터된 인덱스가 없는 경우) 힙에서 데이터를 삭제하는 것과 관련하여 문제가 발생할 수 있습니다. http://support.microsoft.com/kb/913399

저는 최근에 이걸 했어요.이동 중 테스트를 위해 데이터베이스를 컴팩트 버전으로 만들려고 했지만 아무리 많은 행을 삭제해도 축소할 수 없었습니다.결국 이 스레드에서 많은 다른 명령을 실행한 후에 행을 삭제한 후 클러스터된 인덱스가 다시 작성되지 않는 것을 발견했습니다.인덱스를 다시 작성한 덕분에 제대로 축소할 수 있었습니다.

데이터베이스 크기, 테이블 수 및 기타 복잡성에 따라 이 작업이 얼마나 실용적인지는 확실하지 않지만, 다음과 같습니다.

  1. 실제 드라이브 조각 모음
  2. 요구사항, 공간, 증가율 등에 따라 새 데이터베이스 생성
  3. 단순 ssms 작업을 사용하여 이전 DB의 모든 테이블을 새 DB로 가져옵니다.
  4. 이전 데이터베이스의 모든 테이블에 대한 색인을 스크립팅한 다음 새 데이터베이스에 색인을 다시 작성합니다.외부 키 등의 필요에 따라 확장합니다.
  5. 필요에 따라 데이터베이스 이름 변경, 성공 확인, 이전 항목 삭제

전체 복구에서 단순 복구로 전환하여 모든 로그를 제거할 수 있다고 생각합니다.데이터베이스를 마우스 오른쪽 단추로 클릭하고 다음을 선택합니다.Properties선택합니다.Options그리고 변화

  • Recovery mode로.Simple
  • Containment type로.None

Switching from full to simple

복구 모델을 단순으로 설정하고 자동 축소를 사용하도록 설정한 경우에도 SQL Server에서 로그를 축소할 수 없습니다.로그의 체크포인트(또는 로그의 부족)와 관련이 있습니다.

그래서 첫 번째 실행.

DBCC CHECKDB

데이터베이스에 있습니다.그 후에는 수축 수술이 매력적으로 작동할 것입니다.

보통 저는 작업 >수축 >을 사용합니다.[파일] 메뉴에서 페이지 재구성 옵션이 있는 로그 파일을 선택합니다.

언급URL : https://stackoverflow.com/questions/439071/how-do-i-shrink-my-sql-server-database

반응형