几天前,我的一位客户要求我创建一个PowerShell脚本来修补其SQL Server实例。经过一段时间后,第一步是根据SQL Server版本下载最后一个Service Pack和最后一个累积更新,然后将这些修补程序应用于SQL Server实例。在这篇博文中,我将解释我是如何运行这些下载的。
与往常一样,每次我必须处理SQL Server和PowerShell时,我都会查看著名的dbatools页面,以检查是否可以找到有用的cmdlet. Jackpot。
我想下载SQL Server版本2014至2019的最新累积更新和Service pack。我创建了一个包含每个版本的RTM构建的列表:
#List of build for the RTM version from 2014 to 2019
$RTMBuilds = @('12.0.2000','13.0.1601','14.0.1000','15.0.2000');
我还需要一个共享路径来保存SP和CU:
#Path where files will be downloaded
$Path = "\\THOR90\Sources";
我将在每个构建上循环,并使用dbatool cmdlet Test DbaBuild查找循环中RTM版本的最后一次累积更新。此cmdlet与参数-Build with my RTM Build number和-MaxBehind“0CU”一起使用,为我提供SQL Server版本的上次累积更新的目标生成号。SQL Server 2016目前只有一个小例外,即最后一个修补程序是一个Service Pack,目前没有此Service Pack的CU。在这种情况下,我需要检查最后一个SP的版本-1,并找到该SP的最后一个CU,这意味着将参数-MaxBehind更改为“1SP 0CU”。以下是代码:
#Download last CU
$res = Test-DbaBuild -Build $RTMBuild -MaxBehind "0CU";
#$test special case where the last build is a SP, to download the last CU before this SP
if ($res.CUTarget -eq $null) {
$res = Test-DbaBuild -Build $RTMBuild -MaxBehind "1SP 0CU";
}
应用于SQL Server 2016 RTM构建的代码返回:
构建级别:13.0.1601
建设目标:13.0.5888
符合:错误
库列维尔:
CUT目标:CU17
KBLevel:
匹配类型:精确
MaxBehind:1SP 0CU
名称级别:2016
水平:RTM
SPTarget:SP2
支持时间:2018年9月1日上午12:00:00
这意味着SQL Server 2016可用的最后一个CU是CU17。
现在,我需要找到与CU17的构建号对应的KB号。我将使用dbatools cmdlet Get-DbaBuildReference检索它。
一旦我有了知识库,我将使用另一个名为Get-DBAKUpdate的dbatools cmdlet来解析catalog.update.microsoft。com并获取KB文件的详细信息。
我可以有多个链接来下载我的知识库,例如32位版本的链接和64位版本的另一个链接。我将使用64位并仅选择文件名,以便使用本博客中使用的最后一个dbatools cmdlet下载它。
$BuildTarget = $res.BuildTarget;
$kb = (Get-DbaBuildReference $BuildTarget).KBLevel;
$resKB = Get-DbaKbUpdate $kb;
#Find the file name and check that it is the x64
$file = ($resKB.Link | Select-Object -Last 1) -split ('/') | Select-Object -last 1;
if ($file.IndexOf("x64") -eq -1)
{ $file = ($resKB.Link | Select-Object -First 1) -split ('/') | Select-Object -last 1; }
由于我现在有了文件名,我将从Microsoft下载此文件,并使用dbatools cmdlet save dbakupdate将其保存在我的共享中。如果文件已经存在于我的共享中,我将不会下载它。由于我现在有了文件名,我将从Microsoft下载此文件,并使用dbatools cmdlet save dbakupdate将其保存在我的共享中。如果文件已经存在于我的共享中,我将不会下载它。
#Download the file if it is not already done
if (!(Test-Path "$Path\$file" -PathType Leaf)) {
Write-Output "downloading $file"
Save-DbaKbUpdate $kb -Path $Path
}
else {write-output "File $file already exists" }
脚本的第一部分下载最后一个CU,要下载最后一台SPs,当主要构建版本低于或等于13(SQL Server 2016)时,我将使用完全相同的脚本,并将它们保存到我的共享:
################################### SP
#Download the last SP if version <=2016
if ($res.BuildTarget.Major -le 13) {
$res = Test-DbaBuild -Build $RTMBuild -MaxBehind "0SP";
$BuildTarget = $res.BuildTarget;
$kb = (Get-DbaBuildReference $BuildTarget).KBLevel;
$resKB = Get-DbaKbUpdate $kb;
#Find the file name and check that it is the x64
$file = ($resKB.Link | Select-Object -Last 1) -split ('/') | Select-Object -last 1;
if ($file.IndexOf("x64") -eq -1)
{ $file = ($resKB.Link | Select-Object -First 1) -split ('/') | Select-Object -last 1; }
#Download the file if it is not already done
if (!(Test-Path "$Path\$file" -PathType Leaf)) {
Write-Output "downloading $file"
Save-DbaKbUpdate $kb -Path $Path
}
else {write-output "File $file already exists" }
}
最后,我的共享中有我的所有累积更新和服务包。我可以安排每个月的完整脚本,以便在我的共享中始终保留我环境中SQL Server版本的最后可用CU和SP。
下一步是将这些修补程序应用于我的SQL Server实例。
这将是我下一篇博客文章的主题。
原文标题:How to automatically download last SQL Server SP and CU with PowerShell
原文作者:Stéphane Savorgnano
原文链接:https://www.dbi-services.com/blog/how-to-automatically-download-last-sql-server-sp-and-cu-with-powershell/




