-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path04-DbaToolsModule.ps1
More file actions
296 lines (237 loc) · 9.49 KB
/
Copy path04-DbaToolsModule.ps1
File metadata and controls
296 lines (237 loc) · 9.49 KB
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#region DBATools module
# DBATools is an awesome module created by Chrissy LeMaire @cl
# It's now maintenaned and expanded by the community, and anyone can contribute on it.
# It require a client with PowerShell 3.0+ and Windows 7+ and it works with SQL Server 2000+
#
# https://dbatools.io
# Install or update module from PSGallery
if(!(Get-Module -Name dbatools -ListAvailable)) {
Install-Module dbatools
} else {
Update-Module dbatools
}
# List the available commands
Start-Process -filepath "https://dbatools.io" -WindowStyle Maximized
# List available cmdlets - generic way
Get-Command -Module DbaTools
Get-Command -Module DbaTools | Measure
# List available cmdlets - native way
Find-DbaCommand | Out-GridView
Find-DbaCommand -Tag Backup
Find-dbaCommand -Tag AG
Find-DbaCommand -Pattern memory
# Discover SQL Server instances in various way
Find-DbaInstance -DiscoveryType Domain
Find-DbaInstance -DiscoveryType IPRange -IpAddress 10.0.1.0/24
Find-DbaInstance -DiscoveryType DataSourceEnumeration
# Pipe with other cmdlets to assess environments
Find-DbaInstance -DiscoveryType Domain | Get-DbaLogin
# Same as before, but using a list of known instances
$instances = @()
$instances += "DEMO-SQL-0"
$instances += "DEMO-SQL-1"
$instances | Connect-DbaInstance | Get-DbaLogin | Out-GridView
# Best practice assessment
Get-DbaPrivilege -ComputerName $instances
Test-DbaMaxDop -SqlInstance $instances
Test-DbaMaxMemory -SqlInstance $instances
function Get-InstanceBestPracticesStatus {
[CmdletBinding()]
param (
[Parameter(Mandatory, ValueFromPipeline)]
[string[]]$sqlInstance,
[Parameter(Mandatory=$false)]
[string]$logFilePath = ".\BestPracticesStatus.txt"
)
"Best practices summary" | Out-File $logFilePath -Force
$instances | % {
try {
Get-DbaPrivilege -ComputerName $_ -EnableException | Out-File $logFilePath -Append
Test-DbaMaxDop -SqlInstance $_ -EnableException | Out-File $logFilePath -Append
Test-DbaMaxMemory -SqlInstance $_ -EnableException | Out-File $logFilePath -Append
}
catch {
Write-Output "Error while assessing instance $_" | Out-File $logFilePath -Append
}
}
}
$instances += "NONEXISTINGSQL"
$instances | Get-InstanceBestPracticesStatus
code .\BestPracticesStatus.txt
# Execute T-SQL
$query = @"
SELECT @@ServerName as ServerName,
name
FROM sys.databases
"@
Invoke-DbaQuery -sqlInstance "DEMO-SQL-0", "DEMO-SQL-1" -Query $query
# Instance setup and configuration
# Keep track of all command executed
Start-Transcript -Path .\Transcript.txt -Force -IncludeInvocationHeader
$config = @{
AGTSVCSTARTUPTYPE = "Automatic"
SQLCOLLATION = "Latin1_General_CI_AS"
BROWSERSVCSTARTUPTYPE = "Automatic"
FILESTREAMLEVEL = 0
FEATURES = "SQLEngine"
}
Install-DbaInstance -SqlInstance "DEMO-SQL-0\NAMED" `
-Version 2017 `
-Path "C:\SQLServerFull" `
-Configuration $config `
-verbose
# Post-deployment configuration
Get-DbaService "DEMO-SQL-0.contoso.local" -Instance "NAMED" -Type Engine, Agent |
Update-DbaServiceAccount -ServiceCredential (Get-Credential)
Set-DbaPrivilege -ComputerName "DEMO-SQL-0\NAMED" -Type "IFI", "LPIM"
Set-DbaMaxDop -SqlInstance "DEMO-SQL-0\NAMED" -MaxDop 1
Set-DBAMaxMemory -SQLInstance "DEMO-SQL-0\NAMED" `
-Max $((Get-DbaMaxMemory -SQLInstance "DEMO-SQL-0").Total - 3072)
# OR #
Set-DBAMaxMemory -SQLInstance "DEMO-SQL-0\NAMED" `
-Max (Test-DbaMaxMemory -SqlInstance "DEMO-SQL-0").RecommendedValue
# Close transcript
Stop-Transcript
code .\transcript.txt
# Enable SQL Auth - using SMO
$sqlNamedInst = Connect-DbaInstance -sqlInstance "DEMO-SQL-0\NAMED"
$sqlNamedInst.Settings.LoginMode = [Microsoft.SqlServer.Management.SMO.ServerLoginMode]::Mixed
# Make the changes
$sqlNamedInst.Alter()
Restart-DbaService -ComputerName "DEMO-SQL-0" -Instance "NAMED"
# New user database and sql login
$userDb = New-DbaDatabase -name "UserDatabase" -SqlInstance "DEMO-SQL-0\NAMED"
# Create a table and add some sample data
$col1 = @{
Name = 'filename'
Type = 'nvarcharmax'
Nullable = $true
}
$col2 = @{
Name = 'size'
Type = 'bigint'
Nullable = $true
}
New-DbaDbTable -SqlInstance "DEMO-SQL-0\NAMED" `
-Database $userDb.Name `
-Schema "dbo" `
-Name "filelist" `
-ColumnMap $col1, $col2
Get-ChildItem -File | select Name, Length | Export-Csv .\TableContent.csv -NoTypeInformation
code .\TableContent.csv
Import-DbaCsv -Path ".\TableContent.csv" `
-SqlInstance "DEMO-SQL-0\NAMED" `
-Database "UserDatabase" `
-Schema "dbo" `
-Table "filelist"
$sqlLogin = New-DbaLogin -Name "sqlLogin" -SqlInstance "DEMO-SQL-0\NAMED"
$sqlLogin.GetType().FullName
# Set sqlLogin as db_datareader on new database
$dbUser = New-DbaDbUser -Database "UserDatabase" `
-SqlInstance "DEMO-SQL-0\NAMED" `
-Login $sqlLogin.Name
Add-DbaDbRoleMember -Database "UserDatabase" `
-SqlInstance "DEMO-SQL-0\NAMED" `
-User $dbUser.Name `
-Role "db_datareader" `
-Confirm:$false
# Test the new sql login and its role
# Get sql login credential
$sqlCred = Get-Credential
# or
$sqlCred = New-Object System.Management.Automation.PSCredential ('sqlLogin', (ConvertTo-SecureString "Passw0rd.123" -AsPlainText -Force))
$sqlCred
Invoke-DbaQuery -SqlInstance "DEMO-SQL-0\NAMED" `
-Database "userdatabase" `
-sqlCredential $sqlCred `
-query "SELECT * FROM dbo.filelist"
Invoke-DbaQuery -SqlInstance "DEMO-SQL-0\NAMED" `
-Database "userdatabases" `
-sqlCredential $sqlCred `
-query "CREATE TABLE DemoTable (ID INT)"
# Install community tools
$maintenanceDb = New-DbaDatabase -SqlInstance "DEMO-SQL-0\NAMED" -Name "DBAMaintenance"
Install-DbaFirstResponderKit -SqlInstance "DEMO-SQL-0\NAMED" -Database $maintenanceDb.Name
Install-DbaWhoIsActive -SqlInstance "DEMO-SQL-0\NAMED" -Database $maintenanceDb.Name
$backupFolder = New-DbaDirectory -SqlInstance "DEMO-SQL-0\NAMED" -Path "F:\DbaBackup"
Install-DbaMaintenanceSolution -SqlInstance "DEMO-SQL-0\NAMED" `
-Database $maintenanceDb.Name `
-BackupLocation $backupFolder.Path `
-CleanupTime 24 `
-InstallJobs
# Schedule full backup jobs
$fullBackupJob = Get-DbaAgentJob -sqlInstance "DEMO-SQL-0\NAMED" `
-Category "Database Maintenance" |
Where-Object {
$_.Name -like '*backup*full*' `
-and $_.JobSchedules.count -eq 0
}
$fullBackupJob
Get-DbaAgentSchedule -SqlInstance "DEMO-SQL-0\NAMED"
$schedule = New-DbaAgentSchedule -SqlInstance "DEMO-SQL-0\NAMED" `
-Schedule "Daily at midnight" `
-FrequencyType Daily `
-FrequencyInterval 24 `
-StartTime "000000" `
-Force
$fullBackupJob | Set-DbaAgentJob -ScheduleId $schedule.ID
Get-DbaAgentJob -sqlInstance "DEMO-SQL-0\NAMED" -Category "Database Maintenance" |
Where-Object Name -like '*backup*full*' | Select-Object Name, JobSchedules
# Massive backup example
Backup-DbaDatabase -SqlInstance "DEMO-SQL-0\NAMED" -BackupDirectory "F:\DbaBackup" -CopyOnly
# Migrate contents between instances
# Source is DEMO-SQL-0\Named
# Items will be copied to DEMO-SQL-0
# DBs will be joined to Always On AGs
# Items will be synched between replicas
Copy-DbaLogin -Source "DEMO-SQL-0\NAMED" -Destination "DEMO-SQL-0" -ExcludeSystemLogins
Copy-DbaDatabase -Source "DEMO-SQL-0\NAMED" `
-Destination "DEMO-SQL-0" `
-BackupRestore `
-SharedPath "F:\DbaBackup" `
-AllDatabases
Copy-DbaAgentJobCategory -Source "DEMO-SQL-0\NAMED" -Destination "DEMO-SQL-0"
Copy-DbaAgentJob -Source "DEMO-SQL-0\NAMED" -Destination "DEMO-SQL-0"
# Availability group management
# Add a new DB to existing AG
Get-DbaAvailabilityGroup -SqlInstance "DEMO-SQL-0"
# Check if local node is primary replica for each AG, otherwise failover
$ags = Get-DbaAvailabilityGroup -SqlInstance "DEMO-SQL-0"
foreach($ag in $ags) {
if($ag.PrimaryReplica -ne $env:COMPUTERNAME) {
$ag | Invoke-DbaAgFailover
}
}
# Create a share on local DB folder
$acl = Get-Acl "F:\DbaBackup"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("CONTOSO\sqlsvc", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl "F:\DbaBackup"
New-SmbShare -Path "F:\DbaBackup" -Name "DBABackup" -FullAccess "EveryOne"
# Add UserDatabase to AG
Add-DbaAgDatabase -SqlInstance "DEMO-SQL-0" `
-AvailabilityGroup "demo-sql-ag" `
-Database "UserDatabase" `
-SeedingMode Manual `
-SharedPath "\\DEMO-SQL-0\DBABackup"
Get-DbaAgDatabase -SqlInstance "DEMO-SQL-0" | Out-GridView
# Add a new DB to a new AG
New-DbaDatabase -SqlInstance "DEMO-SQL-0" -Name "UserDatabase2"
Backup-DbaDatabase -SqlInstance "DEMO-SQL-0" `
-Database "UserDatabase2" `
-BackupDirectory "F:\DbaBackup"
New-DbaAvailabilityGroup -Primary "DEMO-SQL-0" `
-Secondary "DEMO-SQL-1" `
-Name "demo-sql-ag2" `
-ClusterType Wsfc `
-AvailabilityMode SynchronousCommit `
-FailoverMode Automatic `
-Database "UserDatabase2" `
-SeedingMode Manual `
-SharedPath "\\DEMO-SQL-0\DBABackup" -verbose
Get-DbaAvailabilityGroup -SqlInstance "DEMO-SQL-0"
Get-DbaAgDatabase -SqlInstance "DEMO-SQL-0" | Out-GridView
# Sync logins, agent jobs and other relevant items between replicas
Sync-DbaAvailabilityGroup -Primary "DEMO-SQL-0" -AvailabilityGroup "demo-sql-ag"
Sync-DbaAvailabilityGroup -Primary "DEMO-SQL-0" -AvailabilityGroup "demo-sql-ag2"
#endregion