シンプルリカバリモードを設定し、ユーザーが作成したすべてのデータベースのログファイルを圧縮する


8

正しい方向に向けていただければ幸いです。私はT-SQLを頻繁に使用するわけではありませんが、グーグル操作をして、以下のスクリプトを見つけました。スクリプトを少し修正しました。

スクリプトで次のことを行います。

  1. システムDBを除くすべてのデータベースを選択します。
  2. リカバリをシンプルに設定します。
  3. システムデータベースを除くすべてのdb(.ldf)のログファイルを圧縮するには

スクリプト:

USE MASTER
declare
@isql varchar(2000),
@dbname varchar(64)

declare c1 cursor for select name from master..sysdatabases where name not in ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
open c1
fetch next from c1 into @dbname
While @@fetch_status <> -1
    begin
    select @isql = 'ALTER DATABASE @dbname SET RECOVERY SIMPLE'
    select @isql = replace(@isql,'@dbname',@dbname)
    print @isql
    exec(@isql)
    select @isql='USE @dbname checkpoint'
    select @isql = replace(@isql,'@dbname',@dbname)
    print @isql
    exec(@isql)
    select @isql='DBCC SHRINKFILE @dbname.ldf'
    select @isql = replace(@isql,'@dbname',@dbname)
    print @isql
    exec(@isql)

    fetch next from c1 into @dbname
    end
close c1
deallocate c1

なぜ、なぜ、なぜ?「正しい方向」とは?スクリプトは機能しませんか?もしそうなら、どうですか?エラーメッセージが表示されますか?それは何ですか?おそらく最後のブロックでUSEコマンドが必要です。しかし、もう一度:なぜ、なぜ、なぜ?
アーロンバートランド

.ldfファイルはサーバーのディスク領域の70%を占めるためです。しかし、あなたがより良い方法を知っているなら、教えてください。スクリプトが機能するかどうかわかりません。ただ実行することはできません。本番環境なので、最初に機能することを確認する必要があります。
Arviddk 2014年

これをテストできる開発環境またはテスト環境がありませんか?率直に言って、誰が書いたかに関わらず、私はここから何も取らず、インターネット上の見知らぬ人の保証のみに基づいてそれをプロダクションに適用します...
アーロンベルトラン

@Arviddk復旧モデルをFULL / BULK LOGGEDからSIMPLEに変更した結果はどうなりますか?あなたが気づいているなら、先に進んでそれをしてください。
BuahahaXD 2016年

同じことをしたいと考えているかもしれない将来の読者のための理由についてコメントしたかっただけです。以前は、トランザクションログバックアップを使用して完全なSQLバックアップを行っていました。その後、バックアップの実行にDell AppAssureを使用するように切り替え、トランザクションログのバックアップを必要としない場所に移動しました。現在、複数のサーバーにまたがる何百ものデータベースが、理由もなくテラバイトのLDFファイルでいっぱいに設定されています。これは、バックアップ/復元だけでなく、それを取り巻くその他の事柄、レプリケーションなどにも影響します。
Thorin

回答:


13

スクリプトを使用して、システムDB以外のすべてのデータベースのログファイルを圧縮します。

USE MASTER   
GO    
SET QUOTED_IDENTIFIER ON  
GO  
SET ARITHABORT ON  
GO  

DECLARE @DBName NVARCHAR(255),@LogicalFileName NVARCHAR(255),@DBRecoveryDesc Varchar(200)  

DECLARE DatabaseList CURSOR   
FOR   
SELECT name,recovery_model_desc  
FROM sys.databases  
WHERE state_desc = 'ONLINE'  
AND is_read_only = 0  
and database_id>4  
ORDER BY name  

OPEN DatabaseList  
FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc  
WHILE @@FETCH_STATUS = 0     
BEGIN   

SET @LogicalFileName=(SELECT top 1 name FROM sys.master_files AS mf WHERE DB_NAME(database_id)=@DBName and type_desc='LOG')  

If @DBRecoveryDesc='Full'  
Begin  
     Print('Use ['+@DBName+'] 
            GO  

           ALTER DATABASE ['+@DBName+'] SET RECOVERY SIMPLE WITH NO_WAIT
           GO   

            DBCC SHRINKFILE ('''+@LogicalFileName+''',10)  
            GO  

            ALTER DATABASE ['+@DBName+'] SET RECOVERY FULL WITH  NO_WAIT
            GO ')  
Print '----------------------------------------------------------- '  
END  

If @DBRecoveryDesc='Simple'  
Begin   
     Print('Use ['+@DBName+']  
            GO  

            DBCC SHRINKFILE ('''+@LogicalFileName+''',10)    
            GO    
 ')  
Print '----------------------------------------------------------- '

END

         FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc
      END  
CLOSE DatabaseList  
DEALLOCATE DatabaseList

最初は実行する------...とエラーになると思っていましたが、構文の強調表示によって実際に何が起こるかについてのヒントが得られました。きちんと!
ta.speot.is 2016

おかげで、私はこれを私たちの
トーリン

「DBCC SHRINKFILE( '' '+ @ LogicalFileName +' _ Log ''、10)GO」を追加する必要があります。追加しない場合、ログデータベースは圧縮されません。
Andreas Rehm

5

私はいつもカーソルに対する嫌悪感を抱いており、理解しやすいようにこれを書きました。これは、AA.SCの回答(ちなみにありがとう)に完全に基づいています。これが他の人の考えとうまくいっているなら、素晴らしい。ただし、後で完全復旧モードに戻しませんでした。

SELECT 
'--', d.name dbName, d.recovery_model, d.recovery_model_desc , mf.name LogicalFileName,
'
use [' + d.name + ']

if(' + cast(d.recovery_model as varchar(5)) + ' = 1)
BEGIN
    ALTER DATABASE ['+ d.name +'] SET RECOVERY SIMPLE WITH NO_WAIT
END
GO 
DBCC SHRINKFILE (''' + mf.name  +''',10)  
GO  
'
FROM sys.databases d
join sys.master_files mf
    on d.database_id = mf.database_id
    and mf.type_desc = 'LOG' 
WHERE d.state_desc = 'ONLINE'  
AND d.is_read_only = 0  
and d.database_id > 4 
--and d.recovery_model = 1
ORDER BY d.name 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.