web-dev-qa-db-ja.com

SMOによるログファイルの圧縮

次のt-SQLを使用してログファイルを圧縮できることはわかっています。

BACKUP LOG db1 TO DISK = '\\server\share\db1_log1.trn';
DBCC ShrinkFile([db1_log], 0);

SMOで同じことをするにはどうすればよいですか?私は試した:

$server = new-Object Microsoft.SqlServer.Management.Smo.Server()

$dbBackup = new-object Microsoft.SqlServer.Management.Smo.Backup
$dbBackup.Action = "Log"
$dbBackup.Database = "db1"
$dbBackup.Devices.AddDevice("\\server\share\db1_log1.trn", "File")
$dbBackup.SqlBackup($server)

$db = $srv.Databases.Item("db1")
$db.TruncateLog()

しかし here の場合、TruncateLog()メソッドはSQL 2005以降では機能しないことがわかりました。

$db.RecoveryModel = RecoveryModel.Simple
$db.Alter()
$db.LogFiles[0].Shrink(0, ShrinkMethod.TruncateOnly)

ただし、シンプルリカバリモードに切り替えると、ログチェーンが壊れるので、やりたくありません。ログファイルを縮小しても、ログチェーンは切断されないため、同等のSMOメソッドを探しています。そのような方法はありますか?

2
Elijah W. Gagne

@elijah、

SMOにはファイルを圧縮する機能があります。以下のPowerShellスクリプトは、log.shrinkメソッドがログファイルのみを圧縮するために使用されることを示しています。デフォルトの縮小オプションまたは切り捨てのみのオプションは、完全復旧モデルで機能します。

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

$server = Read-Host 'Enter your SQL Server instance'
$instance = New-Object Microsoft.SqlServer.Management.Smo.Server $server

$dbname = 'Testdb'
$db = New-Object Microsoft.SqlServer.Management.Smo.Database $instance, $dbname
$db.RecoveryModel = 'FULL'

$filegroup = New-Object Microsoft.SqlServer.Management.Smo.FileGroup $db, 'PRIMARY'
$db.FileGroups.Add($filegroup)

$datafilename = 'Testdb_data'
$datafile = New-Object Microsoft.SqlServer.Management.Smo.DataFile $filegroup, $datafilename
$datafile.FileName =  $instance.MasterDBPath + '\' + $datafilename + '.mdf'
$datafile.Size = (5 * 1024)
$filegroup.Files.Add($datafile)

$logfilename = 'Testdb_log'
$logfile = New-Object Microsoft.SqlServer.Management.Smo.LogFile $db, $logfilename
$logfile.FileName = $instance.MasterDBLogPath + '\' + $logfilename + '.ldf'
$logfile.Size = (1 * 1024)
$db.LogFiles.Add($logfile)

$db.Create()

write-Host ""
write-Host "Data file size before log expand, " $db.FileGroups['PRIMARY'].Files[0].Size
write-Host "Log file size before log expand, " $db.LogFiles[0].Size

$db.LogFiles[0].Size = (10 * 1024)
$db.Alter()

write-Host ""
write-Host "Data file size before log shrink, " $db.FileGroups['PRIMARY'].Files[0].Size
write-Host "Log file size before log shrink, " $db.LogFiles[0].Size

$db.LogFiles[0].Shrink(1, [Microsoft.SqlServer.Management.Smo.ShrinkMethod]::TruncateOnly)
$db.LogFiles[0].Refresh()

write-Host ""
write-Host "Data file size after log shrink, " $db.FileGroups['PRIMARY'].Files[0].Size
write-Host "Log file size after log shrink, " $db.LogFiles[0].Size

$db.Drop()

スクリプトは、ログファイルが最初は1MBに設定されていることを示し、サイズを10MBに変更し、1MBに縮小します。データファイルのサイズは初期サイズの5MBのままです。

2
Travis

ログファイルを圧縮する前に、 ここ をお読みください。

復旧モデルを変更する必要はありません...

更新:

invoke-sqlcmdコマンドレットを使用できます。

例えば。

$query = "DBCC SHRINKFILE(db1_log)"
Invoke-Sqlcmd -ServerInstance $instanceName -Query $query

編集:以下は Powershell V3 Cookbook ...からの抜粋です.

すべてのDBCCコマンドがSMOメソッドでラップされるわけではありません。メソッドにうまくラップされていない他のDBCCコマンドについては、Invoke-Sqlcmdコマンドレットを使用して実行できます。

4
Kin Shah