-
Notifications
You must be signed in to change notification settings - Fork 0
/
Test-OptimizationRestoreDatabase.ps1
152 lines (130 loc) · 5.34 KB
/
Test-OptimizationRestoreDatabase.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<#
.Synopsis
Skrypt do testowania parametrów BufferCount oraz MaxTransferSize w celu optymalizacji przywracania bazy danych.
The script to test parameters BufferCount and MaxTransferSize for optimization database restore.
.DESCRIPTION
Skrypt umożliwia RESTORE bazy danych z określona ilość powtórzeń. Skrypt na podstawie parameterów
wartościa MaxTransferSize, SetOfBuffers oraz TotalMemory wylicza wartość BufferCount.
Skrypt zwraca czas oraz szybkość MB/sec. Odczytuje te wartości z dziennika bledow SQL Server, dlatego tez,
przed każda operacja RESTORE wykonywana jest procedura sp_cycle_errorlog zamykajaca obecny dziennik bledow.
Skrypt nie należy stosować w środowisku produkcyjnym.
Wymaga PowerShell 5.0 oraz moduły SqlServer.
.EXAMPLE
Test-OptimizationRestoreDatabase `
-MaxTransferSize default,65536,524288,1048576,2097152,4194304 `
-TotalMemory 1500 `
-SetsofBuffers 2 `
-CountOfRepeat 4 `
-ServerInstance SERWER-SQL\MSSQLSERVER14 -Database AdventureWorks2014 `
-BackupPath 'E:\SQLBackup\AdventureWorks2014_C.bak' `
-Break 30
.LINK
Author: Mateusz Nadobnik
Link: mnadobnik.pl
Date: 15.12.2017
Version: 1.0.0.1
Keywords: Restore, BufferCount, MaxTransferSize, TotalMemory, Duration, MB/sec, SqlServer
Notes:
Changelog:
#>
#Requires -Version 5.0
#Requires -Modules SqlServer
function Test-OptimizationRestoreDatabase {
[CmdletBinding()]
[Alias()]
[OutputType([String])]
Param
(
#Nazwa instancji SQL Server
[Parameter(Mandatory = $true)]
[string]$ServerInstance,
#Nazwa bazy danych
[Parameter(Mandatory = $true)]
[string]$Database,
#Sciezka do pliki .bak
[Parameter(Mandatory = $true)]
[string]$BackupPath,
#MaxTransferSize - maksymalna ilość danych, które będą przetwarzane na bufor
[Parameter(Mandatory = $true)]
[ValidateSet('65536', '524288', '1048576', '2097152', '4194304', 'default')]
[array]$MaxTransferSize,
#Limit pamięci to ilość pamięci wewnętrznej puli buforów, która jest dostępna dla tego procesu tworzenia kopii /przywracania.
[Parameter(Mandatory = $false)]
[int]$TotalMemory,
#Liczba Sets of Buffers, domyślnie = 1
[Parameter(Mandatory = $false)]
[int]$SetsofBuffers = 1,
#Liczba powtrzeń
[Parameter(Mandatory = $false)]
[int]$CountOfRepeat,
#Przerwa pomiędzy odzyskiwaniami wyrażona w sekundach
[Parameter(Mandatory = $false)]
[int]$Break = 10
)
Begin {
$Error.Clear()
<#if(-not (Get-Module SqlServer))
{
try
{
Install-Module -Name SqlServer -Force
}
catch
{
return $Error[0]
}
}#>
}
Process {
$Object = @()
Foreach ($MTS in $MaxTransferSize) {
1 .. $CountOfRepeat | Foreach {
$ObjResult = @{} | Select BufferCount, MaxTransferSize, TotalLimit, Duration, MBperSecond
$query = "EXEC sp_cycle_errorlog
GO
DBCC TRACEON(3014,3605)
GO `n"
if ($MTS -eq 'default') {
[int]$BufferCount = 6
[int]$MaxTransferSize = 1048576
}
else {
[int]$BufferCount = (($TotalMemory * 1MB) / ([int]$MTS)) / $SetsOfBuffers
[int]$MaxTransferSize = $MTS
}
try {
$query += Restore-SqlDatabase -ServerInstance $ServerInstance -Database $Database -BackupFile $BackupPath `
-ReplaceDatabase -BufferCount $BufferCount -MaxTransferSize $MaxTransferSize -Script
Write-Host "Restoring database $Database with options BufferCount $BufferCount and MaxTransferSize $MaxTransferSize" -ForegroundColor Yellow
#Write-Host $query
Invoke-Sqlcmd -ServerInstance $ServerInstance -Database master -Query $query -QueryTimeout 0
Sleep -Seconds $Break
}
catch {
return $Error[0]
}
try {
$querResult = 'EXEC xp_ReadErrorLog 4, 1, "RESTORE DATABASE successfully"'
$result = Invoke-Sqlcmd -ServerInstance $ServerInstance -Database msdb -Query $querResult
Write-Host $result.Text -ForegroundColor Yellow
[regex]$regex = '\d{1,8}[\,\.]{1}\d{1,8}'
$TextResult = $regex.Matches($result.Text)
}
catch {
return $Error[0]
}
#Add to ObjResult
$ObjResult.BufferCount = ($BufferCount)
$ObjResult.MaxTransferSize = ($MaxTransferSize)
$ObjResult.Duration = [float]$TextResult[0].Value
$ObjResult.MBperSecond = [float]$TextResult[1].Value
$objResult.TotalLimit = ((($BufferCount) * ($MaxTransferSize)) * $SetsOfBuffers) / 1MB
#$ObjResult
$Object += $ObjResult
}
}
}
End {
return $Object
}
}