In my last post I showed Get-DbaLastGoodCheckDb from dbatools. This module is a community based project written by excellent, brilliant people in their own time and available to you free. To find out more and how to use and install it visit https://dbatools.io
In a similar fashion to my post about using Pester with Test-DBALastBackup I thought I would write some Pester tests for Get-DbaLastGoodCheckDb as well
Pester provides a framework for running unit tests to execute and validate PowerShell commands from within PowerShell. Pester consists of a simple set of functions that expose a testing domain-specific language (DSL) for isolating, running, evaluating and reporting the results of PowerShell commands.
First we will use Test Cases again to quickly test a number of instances and see if any servers have a database which does not have a successful DBCC Checkdb. We will need to use the -Detailed parameter of Get-DbaLastGoddCheckDb so that we can access the status property. I have filled the $SQLServers variable with the names of my SQLServers in my lab that are running and are not my broken SQL2008 box.
The status property will contain one of three statements
- Ok (This means that a successful test was run in the last 7 days
- New database, not checked yet
- CheckDb should be performed
We want to make sure that none of the results from the command have the second two statements. We can do this by adding two checks in the test and if either fails then the test will fail.
Describe "Testing Last Known Good DBCC" { $SQLServers = (Get-VM -ComputerName beardnuc | Where-Object {$_.Name -like '*SQL*' -and $_.Name -ne 'SQL2008Ser2008' -and $_.State -eq 'Running'}).Name $testCases= @() $SQLServers.ForEach{$testCases += @{Name = $_}} It "<Name> databases have all had a successful CheckDB within the last 7 days" -TestCases $testCases { Param($Name) $DBCC = Get-DbaLastGoodCheckDb -SqlServer $Name -Detailed $DBCC.Status -contains 'New database, not checked yet'| Should Be $false $DBCC.Status -contains 'CheckDb should be performed'| Should Be $false } }
We can save this as a .ps1 file (or we can add it to an existing Pester test file and call it will Invoke-Pester or just run it in PowerShell
As you can see you will still get the same warning for the availability group databases and we can see that SQL2012Ser08AG1 has a database whose status is CheckDB should be performed and SQL2012Ser08AGN2 has a database with a status of New database, not checked yet
That’s good, but what if we run our DBCC Checkdbs at a different frequency and want to test that? We can also test if the databases have had a successful DBCC CheckDb using the LastGoodCheckDb property which will not contain a Null if there was a successful DBCC CheckDb. As Pester is PowerShell we can use
($DBCC.LastGoodCheckDb -contains $null)
and we can use Measure-Object to get the maximum value of the DaysSinceLastGoodCheckdb property like this
($DBCC | Measure-Object -Property DaysSinceLastGoodCheckdb -Maximum).Maximum
Describe "Testing Last Known Good DBCC" { $SQLServers = (Get-VM -ComputerName beardnuc | Where-Object {$_.Name -like '*SQL*' -and $_.Name -ne 'SQL2008Ser2008' -and $_.State -eq 'Running'}).Name $testCases= @() $SQLServers.ForEach{$testCases += @{Name = $_}} It "<Name> databases have all had a successful CheckDB" -TestCases $testCases { Param($Name) $DBCC = Get-DbaLastGoodCheckDb -SqlServer $Name -Detailed ($DBCC.LastGoodCheckDb -contains $null) | Should Be $false } It "<Name> databases have all had a CheckDB run in the last 3 days" -TestCases $testCases { Param($Name) $DBCC = Get-DbaLastGoodCheckDb -SqlServer $Name -Detailed ($DBCC | Measure-Object -Property DaysSinceLastGoodCheckdb -Maximum).Maximum | Should BeLessThan 3 } }
Describe "Testing Last Known Good DBCC" { $SQLServers = (Get-VM -ComputerName beardnuc | Where-Object {$_.Name -like '*SQL*' -and $_.Name -ne 'SQL2008Ser2008' -and $_.State -eq 'Running'}).Name foreach($Server in $SQLServers) { $DBCCTests = Get-DbaLastGoodCheckDb -SqlServer $Server -Detailed foreach($DBCCTest in $DBCCTests) { It "$($DBCCTest.Server) database $($DBCCTest.Database) had a successful CheckDB"{ $DBCCTest.Status | Should Be 'Ok' } It "$($DBCCTest.Server) database $($DBCCTest.Database) had a CheckDB run in the last 3 days" { $DBCCTest.DaysSinceLastGoodCheckdb | Should BeLessThan 3 } It "$($DBCCTest.Server) database $($DBCCTest.Database) has Data Purity Enabled" { $DBCCTest.DataPurityEnabled| Should Be $true } } } }
You can look at my previous posts on using Pester to see examples of creating XML files or HTML reports from the results of the tests.
Hopefully, as you have read this you have also thought of other ways that you can use Pester to validate the state of your environment. I would love to know how and what you do.
NOTE – The major 1.0 release of dbatools due in the summer 2017 may have breaking changes which will stop the above code from working. There are also new commands coming which may replace this command. This blog post was written using dbatools version 0.8.942 You can check your version using
Get-Module dbatools
and update it using an Administrator PowerShell session with
Update-Module dbatools
You may find that you get no output from Update-Module as you have the latest version. If you have not installed the module from the PowerShell Gallery using
Install-Module dbatools
Then you can use
Update-dbatools