私はこれを理解するのにあまりにも長い間これを見ていました...
以下の関数は、SQL Serverインスタンスの1つまたは複数のデータベースに関する情報を取得するためのものです。これまでのところ、これはSQL 2005以降で機能することを知っています。
利用した Format-Table
しかし、結局は列が途切れる。利用した Output-File
これは機能しますが、デフォルトではリストビューになり、Excelにアクセスするのは面倒です。また、特定の長さを超える列データを切り捨てます。
[〜#〜] edit [〜#〜]:この機能の目的は、各インスタンスのインベントリを収集するために100以上のサーバーに対して実行することです。
PowerShell関数:
# Load SMO
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
function Get-DatabaseInfo ($server,$dbname)
{
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
$db = $srv.Databases.Item($dbname)
$DataFile = $db | Select -ExpandProperty FileGroups | Select -ExpandProperty Files
$LogFile = $db | Select -ExpandProperty LogFiles
$tables = $db | Select -ExpandProperty tables | ? {$_.IsSystemObject -eq $false}
$indexes = $tables | Select -ExpandProperty Indexes | ? {$_.IsSystemObject -eq $false}
$srv.Databases.Item($dbname) | Select @{Label="*****************Database Name*****************";Expression={$_.Name}}
Write-Host "Database information for $dbname" -ForegroundColor red
$db |
Select @{Label="DateCaptured";Expression={Get-Date -Format yyyyMMdd-HHmm}},
ID, Name, Owner, CreateDate,
CompatibilityLevel, RecoveryModel,
LastBackupDate, LastDifferentialBackupDate, LastLogBackupDate, LogReuseWaitStatus,
ActiveConnections,
AutoClose, AutoShrink,
AutoCreateStatisticsEnabled, AutoUpdateStatisticsEnabled,
Collation,
@{Label="DataSpaceUsage (KB)";Expression={$_.DataSpaceUsage}},
@{Label="IndexSpaceUsage (KB)";Expression={$_.IndexSpaceUsage}},
@{Label="SpaceAvailable (KB)";Expression={$_.SpaceAvailable}},
@{Label="Size (MB)";Expression={$_.Size}},
IsSQLCLREnabled,
IsMirroringEnabled, PageVerify, ReplicationOptions
Write-Host "Database File Level information for $dbname" -Foreground red
$DataFile | Select Name, Filename, Growth, GrowthType,
@{Label="MaxSize (MB)";Expression={$value = $_.MaxSize; switch($value){-1 {"Unlimited"} default {"{0:N2}" -f($value/1024)}}}},
@{Label="SizeAllocated (MB)";Expression={"{0:N2}" -f($_.Size/1024)}},
@{Label="UsedSpace (MB)";Expression={"{0:N2}" -f($_.UsedSpace/1024)}},
@{Label="Data % Full";Expression={"{0:N2}" -f(($_.UsedSpace/$_.Size) * 100)}},
@{Label="Data Space Left (MB)";Expression={"{0:N2}" -f(($_.Size/1024)-($_.UsedSpace/1024))}},
@{Label="Data % Available";Expression={"{0:N2}" -f((($_.Size/1024)-($_.UsedSpace/1024)) / ($_.Size/1024))}}
$logfile | Select Name, Filename, Growth, GrowthType,
@{Label="MaxSize (MB)";Expression={$value = $_.MaxSize; switch($value){-1 {"Unlimited"} default {"{0:N2}" -f($value)}}}},
@{Label="SizeAllocated (MB)";Expression={"{0:N2}" -f($_.Size/1024)}},
@{Label="UsedSpace (MB)";Expression={"{0:N2}" -f($_.UsedSpace/1024)}},
@{Label="Log % Full";Expression={"{0:N2}" -f(($_.UsedSpace/$_.Size) * 100)}},
@{Label="Log Space Left (MB)";Expression={"{0:N2}" -f(($_.Size/1024)-($_.UsedSpace/1024))}},
@{Label="Log % Available";Expression={"{0:N2}" -f((($_.Size/1024)-($_.UsedSpace/1024)) / ($_.Size/1024))}}
Write-Host "Table Information for $dbname" -ForegroundColor red
$tables | Select @{Label="DateCaptured";Expression={Get-Date -Format yyyyMMdd-HHmm}}, Name, RowCount, HasClusteredIndex |
Sort-Object RowCount -Descending
Write-Host "Table Indexes Information for $dbname" -ForegroundColor Red
$indexes | Select Parent, Name, IndexKeyType, IndexedColumns, FillFactor, SortInTempdb
}
PowerShellとSQL Serverに関しては、このシナリオを実行または処理する方法は常に異なります。コメントでアーロンが示唆したように、私はそれらを分割するだけになりました。
この質問は削除したくないので、提供されたスクリプトを誰かが使用したい場合に備えて、この方法で答えます。
モデレーターが質問が削除された方が良いと感じた場合は、必ず先に進んでください。
私は前の仕事で同様のことを行い、中央サーバーにテーブルを定義し、それらのテーブルに(監視された)SQLサーバーエージェントサービスアカウントに権限を付与しました。次に、監視対象の各インスタンスで中央サーバーにジョブとリンクサーバーを作成しました。