Backup of OLAP Database using Powershell


In this article I would like to explain another method to take the backup of OLAP databases via PowerShell. It will help out to take the backup of multiple OLAP databases with a specified retention period. In Tsql, XMLA function is applied however it is a bit puzzling to initiate the similar process for more than one database.

###### Configuration ######
# $server_name
  $server_name = "<Server Name>"
# UNC path of share or on-disk location to which backups will be stored.
  $backup_location = "<Full path of Backup location>"
# Array of databases that will be backed-up. If $null then all databases
 # will be backed up.
  $user_requested_databases = $null
# How long backups will be retained
  $retention_period_in_days = 90

###### End Configuration ######
trap [Exception] {
   write-error $("TRAPPED: " + $_.Exception.GetType().FullName)
   write-error $("TRAPPED: " + $_.Exception.Message)
 if ($server) {
 $server.disconnect()
 }
 exit 1
 }
if ($server_name -eq $null) {
 $server_name = "localhost"
 }
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices") | out-null
  $server = New-Object Microsoft.AnalysisServices.Server
 $server.connect($server_name)
# Set the directory for backups to the server property
 # "BackupDir" if it's not otherwise specified
  if ($backup_location -eq $null) {
 $backup_location = ($server.get_ServerProperties() | Where {$_.Name -eq "BackupDir"}).Value}
  elseif (!(Test-Path -path $backup_location)) {
 throw "Specified path ($backup_location) does not exist."
 }
# Generate an array of databases to be backed up
 $available_databases = ($server.get_Databases() | foreach {$_.Name})
 if ($user_requested_databases -eq $null) {
 $databases = $available_databases}
 else {
 $databases = $user_requested_databases.Split(",")
 # Check that all specified databases actually exist on the server.
 foreach ($database in $databases) {
 if ($available_databases -notcontains $database) {
 throw "$database does not exist on specified server."
 }
 }
 }
foreach ($database in ($server.get_Databases() | Where {$databases -contains $_.Name})) {
 $directory_path = $backup_location + "\" + $database.Name
 if (!(Test-Path -Path $directory_path)) {
 New-Item $directory_path -type directory | out-null
 }
 [string] $timestamp = date
   $timestamp = $timestamp.Replace(':','').Replace('/','-').Replace(' ','-')
   $database.Backup("$directory_path\$database-$timestamp.abf")
# Cleanup Old Backups
 Get-ChildItem $directory_path | where {
    $_.LastWriteTime -le (Get-Date).AddDays(-$retention_period_in_days)
 } | remove-item
 }
$server.disconnect()