programing

디스크에 로그를 백업한 후에도 로그 파일의 DBCC SHRINGFILE이 크기를 줄이지 않음

lastmoon 2023. 4. 17. 22:18
반응형

디스크에 로그를 백업한 후에도 로그 파일의 DBCC SHRINGFILE이 크기를 줄이지 않음

[My DB]를 사용합니다.
SQL Server 2008
GBMDF 이 30 : 30 GB
GB LDF 사 67 : 67 GB

로그 파일을 가능한 한 축소하고 싶었기 때문에, 그 방법을 찾기 시작했습니다.경고:저는 DBA(또는 DBA 접근)가 아니며, 이 탐색을 통해 촉각적으로 진행되어 왔습니다.

먼저 SSMS, DB properties, Files로 들어가서 Initial Size(MB) 값을 10으로 편집했습니다.이것에 의해, 로그 파일이 62 GB(입력한 10 MB는 아님)로 감소했습니다.SQL Profiler를 첨부하여 DBCC SHROCKFILE이 호출되었음을 확인하였습니다.그런 다음 쿼리 에디터에 명령어를 입력했습니다.그 결과는 다음과 같습니다.

DBCC SHRINKFILE (N'My DB_Log' , 10)

결과는 다음과 같습니다.

Cannot shrink log file 2 (My DB_Log) because the logical log file located at the end of the file is in use.
DbId   FileId      CurrentSize MinimumSize UsedPages   EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
8      2           8044104     12800       8044104     12800

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

그리고 나서 그것에 대해 몇 가지 조사를 해봤는데, 다음과 같은 사실을 발견했습니다.

http://support.microsoft.com/kb/907511

즉, 가상 로그 파일이 릴리스되고 shrink 파일이 기능을 수행할 수 있도록 축소 파일 전에 로그 파일을 백업해야 합니다.무슨 뜻인지 모르겠습니다.그냥 바꿔 말하면 :)

그래서 로그 파일을 백업하고 DBCC SHROCKFILE을 실행하려고 했습니다(그리고 이전 DBCC SHROCKFILE 명령어 출력에서 확인된 최소 크기이기 때문에 새 로그 파일 크기를 12800으로 변경했습니다).

BACKUP LOG [My DB] TO DISK = 'D:\SQLBackup\20110824-MyDB-Log.bak'
GO
DBCC SHRINKFILE (N'My DB_Log' , 12800)
GO

결과는 첫 번째 라운드와 같았다.로그 파일을 62GB까지만 줄일 수 있습니다.

내가 뭘 잘못하고 있는지, 다음에 뭘 해야 할지 모르겠어.

여기에서는 트랜잭션 파일의 물리적 크기를 줄일 수 있지만 복구 모드를 단순하게 변경하지 않는 솔루션이 있습니다.

데이터베이스 내에서 다음 쿼리를 사용하여 로그 파일의 file_id를 찾습니다.

SELECT * FROM sys.database_files;

이 경우 로그 파일은 file_id 2 입니다.이제 사용 중인 가상 로그를 찾고 다음 명령을 사용하여 이 작업을 수행합니다.

DBCC LOGINFO;

여기서 상태가 2(사용 중)인지 0(사용 가능)인지 확인하여 사용 중인 가상 로그가 있는지 확인할 수 있습니다.파일을 축소할 때 빈 가상 로그는 파일의 끝에서 시작하여 처음 사용된 상태가 될 때까지 물리적으로 제거됩니다.트랜잭션 로그 파일을 축소하면 일부만 축소되지만 사용 가능한 가상 로그는 모두 제거되지 않을 수 있습니다.

상태 2가 0보다 큰 경우 파일 축소가 차단됩니다.이 문제를 해결하려면 다른 트랜잭션로그 백업을 수행하고 위의 file_id와 로그 파일의 크기를 지정하여 이러한 명령을 즉시 실행합니다.

-- DBCC SHRINKFILE (file_id, LogSize_MB)
DBCC SHRINKFILE (2, 100);
DBCC LOGINFO;

그러면 가상 로그 파일 할당이 표시되며, 어느 정도 감소했음을 알 수 있을 것입니다.가상 로그 파일이 항상 순서대로 할당되는 것은 아니기 때문에 트랜잭션로그를 여러 백업한 후 이 마지막 쿼리를 다시 실행해야 수 있습니다.그러나 보통 백업 1~2회 이내에 축소할 수 있습니다.

로그를 축소하려면 이미 수행한 단계 외에도 복구 모드를 단순하게 설정해야 합니다.

이것은 실가동 시스템에 권장되는 프랙티스가 아닙니다.이전 백업/로그 파일에서 특정 시점으로 복구할 수 없게 됩니다.

예시와 설명은 이 DBCC SHROCKFILE(Transact-SQL) msdn 페이지의 예 B를 참조하십시오.

이거 드셔보세요

ALTER DATABASE XXXX  SET RECOVERY SIMPLE

use XXXX

declare @log_File_Name varchar(200) 

select @log_File_Name  = name from sysfiles where filename like '%LDF'

declare @i int = FILE_IDEX ( @log_File_Name)

dbcc shrinkfile ( @i , 50) 

이 스크립트는 sql server 2008 R2에서 사용합니다.

USE [db_name]

ALTER DATABASE [db_name] SET RECOVERY SIMPLE WITH NO_WAIT

DBCC SHRINKFILE([log_file_name]/log_file_number, wanted_size)

ALTER DATABASE [db_name] SET RECOVERY FULL WITH NO_WAIT

Paul Randal은 블로그 http://www.sqlskills.com/blogs/paul/post/backup-log-with-no_log-use-abuse-and-undocumented-trace-flags-to-stop-it.aspx에서 이 문제에 대해 매우 흥미로운 토론을 하고 있습니다.

나는 여러 가지 방법을 시도했지만, 이것은 효과가 있다.

샘플 코드는 DBCC SHROCKFILE에서 사용할 수 있습니다.

USE DBName;  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE DBName  
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.  
DBCC SHRINKFILE (DBName_log, 1);  --File name SELECT * FROM sys.database_files; query to get the file name
GO  
-- Reset the database recovery model.  
ALTER DATABASE DBName  
SET RECOVERY FULL;  
GO

이 문제는 전체 백업 및 트랜잭션 백업을 통해 해결되었습니다.백업 프로세스가 완료되지 않을 수 있으며, 이것이 .ldf 파일이 축소되지 않는 이유 중 하나입니다.이거 먹어봐.그것은 나에게 효과가 있었다.

대량으로 처리되는 데이터베이스 중 하나는 매일 로그 테이블에 수십만 개의 레코드를 저장합니다.매일 수백 GB씩 증가하는 로그 파일이 여러 개 있습니다.

30분마다 차등 백업이 필요한 예약된 작업이 있습니다.매일 아침 일찍 진행되는 하우스키핑 일이 하나 더 있어요.

리커버리를 심플하게 설정한 후 하우스키핑 중에 SHROCKFILE을 실시합니다.이전 백업/로그 파일에서 특정 시점으로 복구할 수 없는 문제를 해결하기 위해 프로세스 시작 시점과 종료 시점의 완전한 백업을 수행합니다.하우스키핑 작업이 완료될 때까지 차등 백업이 시도되지 않도록 하기 위해 데이터베이스의 플래그를 사용합니다.간단한 개요는 다음과 같습니다. - 하우스 키핑 직업:

  1. 상태를 'Housekeeping in progress'로 설정합니다.
  2. 데이터베이스를 단일 사용자 모드로 설정
  3. 데이터베이스의 전체 백업
  4. 다양한 테이블에서 오래된 레코드 삭제
  5. 데이터베이스 복구 모드를 SIMPLE로 설정합니다.
  6. 로그 파일을 반복하여 각 파일을 축소합니다.
  7. 데이터베이스 복구 모드를 FULL로 설정합니다.
  8. 데이터베이스의 전체 백업
  9. 데이터베이스를 다중 사용자 모드로 설정
  10. 상태를 '하우스키핑 완료'로 설정합니다.

차등 백업 작업:

  1. 상태가 'Housekeeping completed'인 경우에만 진행하십시오.
  2. 차등 백업을 수행합니다.

완료하는 데 시간이 좀 걸리지만, 아침에 정규 업무를 시작하기 전에 데이터베이스를 깔끔하게 정리하고 새로워집니다.그것은 우리에게 잘 작동하고 있다.

@user2630576 및 @Ed 덕분입니다.s.

다음은 효과가 있었습니다.

BACKUP LOG [database] TO DISK = 'D:\database.bak'
GO

ALTER DATABASE [database] SET RECOVERY SIMPLE

use [database]

declare @log_File_Name varchar(200)

select @log_File_Name = name from sysfiles where filename like '%LDF'

declare @i int = FILE_IDEX ( @log_File_Name)

dbcc shrinkfile ( @i , 50)

ALTER DATABASE [database] SET RECOVERY FULL

언급URL : https://stackoverflow.com/questions/7193445/dbcc-shrinkfile-on-log-file-not-reducing-size-even-after-backup-log-to-disk

반응형