Toolkit/Public/Get-RscMssqlDatabaseRecoveryPoint.ps1
|
#Requires -Version 3 function Get-RscMssqlDatabaseRecoveryPoint { <# .SYNOPSIS Returns a recovery point in time converted to UTC for a SQL Server database. .DESCRIPTION Determines the exact recovery point in UTC for a SQL Server database. Use -Latest for the most recent available recovery point, -LastFull for the last snapshot time, or -RestoreTime for a specific date/time. The returned value can be passed to other cmdlets like Get-RscMssqlDatabaseFiles or New-RscMssqlRestore. .LINK Schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference .PARAMETER RscMssqlDatabase A SQL Server database object, typically obtained from Get-RscMssqlDatabase. .PARAMETER Latest Use the latest available recovery point. .PARAMETER LastFull Use the most recent snapshot as the recovery point. .PARAMETER RestoreTime A specific date/time to use as the recovery point. Accepts three formats: time only (e.g., "02:00" for 2 AM today), local time ("2024-01-15 08:00:00"), or UTC ("2024-01-15 08:00:00Z"). All values are converted to UTC. .PARAMETER AsQuery Return the query object instead of running the query. Preliminary read-only queries may still run to gather IDs or other data needed to build the main query. .EXAMPLE # Get the latest recovery point $db = Get-RscMssqlDatabase -Name AdventureWorks2019 Get-RscMssqlDatabaseRecoveryPoint -RscMssqlDatabase $db -Latest .EXAMPLE # Get recovery point from the last full snapshot $db = Get-RscMssqlDatabase -Name AdventureWorks2019 Get-RscMssqlDatabaseRecoveryPoint -RscMssqlDatabase $db -LastFull .EXAMPLE # Get recovery point for a specific time $db = Get-RscMssqlDatabase -Name AdventureWorks2019 Get-RscMssqlDatabaseRecoveryPoint -RscMssqlDatabase $db -RestoreTime "2024-01-15 08:37:00.000Z" #> [CmdletBinding()] param( [Parameter( Position = 0, Mandatory = $true, ValueFromPipeline = $true)] [ValidateNotNullOrEmpty()] [RubrikSecurityCloud.Types.MssqlDatabase]$RscMssqlDatabase, [Parameter(ParameterSetName = 'Latest')] [switch]$Latest, [Parameter(ParameterSetName = 'LastFull')] [switch]$LastFull, [Parameter(ParameterSetName = 'RestoreTime')] [datetime]$RestoreTime, [Parameter( Mandatory = $false, ValueFromPipeline = $false, HelpMessage = "Return the query object instead of running the query" )][Switch]$AsQuery ) Process { Write-Debug "- Running Get-RscMssqlDatabase" #region Create Query if ($PSBoundParameters.ContainsKey('Latest')) { $query = New-RscQuery -Gql mssqlRecoverableRanges -AddField Data.BeginTime, Data.EndTime $query.Var.input.id = $RscMssqlDatabase.id if ( $AsQuery ) { return $query } $result = $query.Invoke() $LatestRecoveryRange = $result.Data | Sort-Object -Descending -Property EndTime $RecoveryDateTime = $LatestRecoveryRange[0].EndTime.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ') } if ($PSBoundParameters.ContainsKey('LastFull')) { $RubrikSnapshot = $RscMssqlDatabase| Get-RscSnapshot | Sort-Object date -Descending | Select-object -First 1 $endBackupTime = [datetime]::UnixEpoch.AddSeconds(($RubrikSnapshot.MssqlAppMetadata.EndBackupTimestampMs / 1000)) $RecoveryDateTime = $(Get-Date $endBackupTime).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ') } if ($PSBoundParameters.ContainsKey('RestoreTime')) { $RawRestoreDate = (get-date -Date $RestoreTime) Write-Verbose ("RawRestoreDate is: $RawRestoreDate") $Now = (Get-Date).ToUniversalTime() if ($RawRestoreDate -ge $Now) { $RecoveryDateTime = $RawRestoreDate.AddDays(-1) Write-Verbose ("RecoveryDateTime is: $RecoveryDateTime") } else { $RecoveryDateTime = $RawRestoreDate } $RecoveryDateTime = $RecoveryDateTime.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ') } #endregion return $RecoveryDateTime } } |