[CmdletBinding()] param ( # Parameter help description [Parameter()] [string]$ServerInstance, # Parameter help description [Parameter()] [string]$DatabaseName, # Parameter help description [Parameter()] [int]$DeviceType = 7, # Parameter help description [Parameter()] [string]$ExtractPath, # Parameter help description [Parameter()] [String]$RubrikServer ) #region Script Parameters For Testing $PSBoundParameters.Add('ServerInstance','am1-chrilumn-w1\sql2019') $PSBoundParameters.Add('DatabaseName','AdventureWorks2016') $PSBoundParameters.Add('DeviceType', 7) $PSBoundParameters.Add('ExtractPath','C:\temp\') $PSBoundParameters.Add('RubrikServer','amer1-rbk01') $ServerInstance = $PSBoundParameters['ServerInstance'] $DatabaseName = $PSBoundParameters['DatabaseName'] $DeviceType = $PSBoundParameters['DeviceType'] $ExtractPath = $PSBoundParameters['ExtractPath'] $RubrikServer = $PSBoundParameters['RubrikServer'] $Token = $Rubrik.token.amer1 $physical_device_name_search_text = '%$($ExtractPath)%' #endregion Script Parameters For Testing #region Rubrik Connection switch($true){ {$RubrikCredentialFile} {$RubrikCredential = Import-CliXml -Path $RubrikCredentialFile $ConnectRubrik = @{ Server = $RubrikServer Credential = $RubrikCredential } } {$Token} { $ConnectRubrik = @{ Server = $RubrikServer Token = $Token } } default { $ConnectRubrik = @{ Server = $RubrikServer } } } Connect-Rubrik @ConnectRubrik #endregion Rubrik Connection # Get database information from Rubrik $RubrikDatabase = Get-RubrikDatabase -Name $DatabaseName -ServerInstance $ServerInstance -DetailedObject #region Get all LSNs from MSDB $Query = @" select bmf.media_set_id, bmf.physical_device_name, bs.first_lsn, bs.last_lsn, bs.backup_start_date, bs.backup_finish_date from msdb.dbo.backupmediafamily bmf, msdb.dbo.backupset bs where bmf.media_set_id = bs.media_set_id and bs.database_name='$DatabaseName' and bs.type='L' and bmf.device_type = $DeviceType --and bs.first_lsn >= '$($StartingLSN)' --and physical_device_name not like '$physical_device_name_search_text' "@ $LogBackups = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $Query #endregion Get all LSNs from MSDB $ItemsToDownload = @() foreach ($LogBackup in $LogBackups |Sort-Object -Property first_lsn) { $LogBackup #region Browse for log backups to download $Body = @{ startPoint = @{ lsnPoint = @{ lsn = "$($LogBackup.first_lsn)" } } endPoint = @{ lsnPoint = @{ lsn = "$($LogBackup.last_lsn)" } } backupType = "Log" } $RubrikRequest = Invoke-RubrikRESTCall -Endpoint "mssql/db/$($RubrikDatabase.id)/browse" -Method POST -Body $body $RubrikRequest.items #endregion Browse for log backups to download #region Create a list of backup IDs to download if ($RubrikRequest.items.Count -gt 0){ $BackupId = $RubrikRequest.items.backupId $ItemsToDownload += $BackupId $NewDeviceType = 102 $PhysicalDeviceName = $ExtractPath + $RubrikRequest.items.path $Query = "UPDATE msdb.dbo.backupmediafamily set device_type = 0, physical_device_name = '$($PhysicalDeviceName)' where media_set_id = $($LogBackup.media_set_id)" Invoke-Sqlcmd -ServerInstance $ServerInstance -Database msdb -Query $Query } #endregion Create a list of backup IDs to download } #region Download all log backup files $Body = @{ items = $ItemsToDownload } $RubrikRequest = Invoke-RubrikRESTCall -Endpoint "mssql/db/$($RubrikDatabase.id)/download_files_by_id" -Method POST -Body $Body $RubrikRequest = Get-RubrikRequest -id $RubrikRequest.id -WaitForCompletion -type mssql $url = ($RubrikRequest.links |Where-Object {$_.rel -eq "result"}).href $url $OutFile = "C:\Temp\" + (Split-Path -Path $url -Leaf) Invoke-WebRequest -Uri $url -OutFile $OutFile -SkipCertificateCheck #end#region Download all log backup files #region Unzip the downloaded files Expand-Archive -LiteralPath $OutFile -DestinationPath "C:\temp\" -Force #endregion Unzip the downloaded files #region Update the MSDB entries to a value that Replicate will be looking for $Query = "UPDATE msdb.dbo.backupmediafamily set device_type = $NewDeviceType where device_type = 0" Invoke-Sqlcmd -ServerInstance $ServerInstance -Database msdb -Query $Query #endregion Update the MSDB entries to a value that Replicate will be looking for