Created
October 2, 2019 04:11
-
-
Save sqldeployhelmet/468f046c63228aff289472462d99d7c6 to your computer and use it in GitHub Desktop.
Powershell to backup a CosmosDB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
This script will call the cosmos db migration tool with the correct parameters based | |
on a list of databases that need to be backed up. It depends on a json param file that | |
contains the list of cosmos db services that have databases that require backup. | |
This script has a couple of dependencies: | |
(1) the dt.exe that it runs (the cosmos db migration tool and we assume the associated files/dlls | |
in the compiled folder) needs to be locally available. | |
(2) A configured json file to list out the cosmos services and databases that require backups. | |
Care should be taken (encrypt the file and provide access to the keys to a limited set of users) | |
as the read-only keys for the cosmos-db service will be stored here. | |
#> | |
$retentionDays = 14 | |
$backupList = "C:\temp\CosmosBackup.json" # point these at the appropriate folders | |
$backupPath = 'C:\temp\' | |
$pathtoEXE = 'C:\temp\drop\dt.exe' | |
$backups = Get-Content -Raw -Path $backupList | ConvertFrom-Json | |
foreach($s in $backups.service) | |
{ | |
$sName = $s.name | |
Write-Output "Processing service $sName..." | |
$cosmosConnectString = $s.connectString | |
foreach($d in $s.databases) | |
{ | |
$database = $d.name | |
if ($d.backupFlag -eq $true) | |
{ | |
Write-Output " Backing up collections in $database..." | |
foreach($c in $d.collections) | |
{ | |
$collection = $c.name | |
Write-Output " Backing up collection $collection." | |
<# configure export arguments #> | |
$connectString = "$cosmosConnectString;Database=$database" | |
$date = Get-Date | |
$dateString = $date.ToString('yyyyMMdd') | |
$dateString = $dateString + '_' + $date.ToString('hhmm') | |
$targetFile = "$collection`_$dateString.json" | |
$args = "/ErrorLog:" + "$backupPath\backups\$sName\$database\$collection`_$dateString`_log.csv /OverwriteErrorLog" | |
$args = $args + " /ErrorDetails:Critical /s:DocumentDB /s.ConnectionString:$connectString" | |
$args = $args + " /s.ConnectionMode:Gateway /s.Collection:$collection /s.Query:`"SELECT * FROM c`"" | |
$args = $args + " /t:JsonFile /t.File:$backupPath\backups\$Name\$database\$targetFile /t.Prettify /t.Overwrite" | |
<# now we are all configured: run the collection backup #> | |
Start-Process -FilePath $pathtoEXE -ArgumentList $args -Wait | |
} | |
} | |
else { | |
Write-Output " Skipping $dName backupFlag <> true." | |
} | |
} | |
} | |
$purgeDate = (Get-Date).AddDays(-1 * ($retentionDays + 1)) | |
<# remove old logs and backups #> | |
Get-ChildItem -Path $backupPath -Recurse -Include *.json -Exclude *cosmosBackup.json | Where-Object {$_.CreationTime -lt $purgeDate} | Remove-Item | |
Get-ChildItem -Path $backupPath -Recurse -Include *.csv | Where-Object {$_.CreationTime -lt $purgeDate} | Remove-Item |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment