Como fazer upload de um backup SQL Server para OCI Bucket.

A segurança dos backups é um dos principais pilares na administração de bancos de dados. Ter uma cópia externa garante a recuperação dos dados em caso de falhas. Neste artigo, vamos demonstrar como configurar o backup do SQL Server utilizando o Rclone para enviar os arquivos para um bucket da Oracle Cloud.

Criando o Bucket na Oracle Cloud

  1. Acesse a Oracle Cloud: https://cloud.oracle.com
  2. Navegue até a seção de Armazenamento e crie um Bucket

3. Salve o namespace gerado, pois ele será necessário para configuração

Gerando as Chaves de Acesso

  1. Acesse a Oracle Cloud e crie uma Secret Key e Access Key

Anote a Secret Key no momento da geração, pois não será exibida novamente

Instalando e Configurando o Rclone no Windows

1. Download do Rclone

Baixe a versão mais recente do Rclone para Windows: https://rclone.org/downloads/

2. Configuração Inicial do Rclone

  1. Abra o Prompt de Comando (CMD)
  2. Digite rclone.exe config e siga os passos abaixo:
    • Escolha n para criar uma nova configuração
    • Nomeie a configuração como oci_s3
    • Escolha s3 como tipo de armazenamento
    • Selecione Other como provedor
    • Escolha 1 para inserir manualmente as credenciais
    • Insira sua Access Key e Secret Key
    • Informe a região (exemplo: sa-saopaulo-1)
    • Configure o endpoint no formato: https://NAMESPACE.compat.objectstorage.REGION.oraclecloud.com
    • O restante da configuração pode manter default, apenas pressionando enter.

3. Teste a sua configuração

Criando o Script PowerShell para Backup Automático

Agora que o Rclone está configurado, podemos criar um script PowerShell para automatizar o backup e o envio para a Oracle Cloud.

Exemplo de Script PowerShell:

Este script tem como entrada:

  • backupFolder : Para o local onde está o backup
  • RcloneConfig: Onde está o config do Rclone, caso deseje mudar.
  • bucketName: Caminho do Bucket a ser criado
  • remote: Qual configuração irá utilizar do Rclone, lembra aquele oci_s3?
  • logDir: Diretorio de logs.
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# Diretório de backup
$backupFolder = "K:\BACKUPS\LOG"
$RcloneConfig = "C:\zabbix\scripts\rclone.conf"

# Nome do bucket na OCI
$bucketName = "BACKUP-MSSQL-OCI/LOG"

# Nome do remote configurado no Rclone
$remote = "oci_s3"

# Diretório de logs
$logDir = "C:\zabbix\scripts\logs"

# Criar diretório de logs se não existir
if (!(Test-Path -Path $logDir)) {
    New-Item -ItemType Directory -Path $logDir | Out-Null
}

# Criar nome do log por dia
$logFile = "$logDir\backup_LOG_$(Get-Date -Format 'yyyyMMdd_HHmm').log"

# Data e hora atual
$date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Output "[$date] Iniciando verificação e sincronização..." | Out-File -Append -Encoding utf8 $logFile

# Função para verificar se um arquivo está em uso
function Test-FileInUse {
    param([string]$filePath)
    try {
        $file = [System.IO.File]::Open($filePath, 'Open', 'Read', 'None')
        if ($file) { $file.Close() }
        return $false  # Arquivo não está em uso
    } catch {
        return $true   # Arquivo está em uso
    }
}

# Definir os diretórios do dia atual e do dia anterior
$today = Get-Date -Format 'yyyyMMdd'
$yesterday = (Get-Date).AddDays(-1).ToString('yyyyMMdd')
$todayDir = Join-Path $backupFolder $today
$yesterdayDir = Join-Path $backupFolder $yesterday

# Lista de diretórios válidos
$validDirs = @()
if (Test-Path $todayDir) { $validDirs += $todayDir }
if (Test-Path $yesterdayDir) { $validDirs += $yesterdayDir }

# Criar uma lista de arquivos prontos para upload
$filesToSync = @()
foreach ($dir in $validDirs) {
    Get-ChildItem -Path $dir -Recurse -File | ForEach-Object {
        $filePath = $_.FullName
        if (-not (Test-FileInUse $filePath)) {
            $filesToSync += $filePath
        } else {
            Write-Output "[$date] Ignorando (arquivo ainda em uso): $filePath" | Out-File -Append -Encoding utf8 $logFile
        }
    }
}

# Se houver arquivos prontos, enviar para o OCI
if ($filesToSync.Count -gt 0) {
    Write-Output "[$date] Enviando $( $filesToSync.Count ) arquivos para OCI..." | Out-File -Append -Encoding utf8 $logFile

    # Criar diretório no bucket
    $bucketPathToday = "$remote`:$bucketName/$today"
    $bucketPathYesterday = "$remote`:$bucketName/$yesterday"

    # Enviar arquivos com Rclone
    if (Test-Path $todayDir) {
        & "C:\Program Files\Rclone\rclone.exe" copy "$todayDir" "$bucketPathToday" --config "$RcloneConfig" --progress --transfers 8 --checkers 16 --fast-list --log-file="$logFile" --log-level DEBUG
    }
    if (Test-Path $yesterdayDir) {
        & "C:\Program Files\Rclone\rclone.exe" copy "$yesterdayDir" "$bucketPathYesterday" --config "$RcloneConfig" --progress --transfers 8 --checkers 16 --fast-list --log-file="$logFile" --log-level DEBUG
    }

    Write-Output "[$date] Sincronização concluída!" | Out-File -Append -Encoding utf8 $logFile
} else {
    Write-Output "[$date] Nenhum arquivo disponível para sincronização." | Out-File -Append -Encoding utf8 $logFile
}

Agendando o Backup no SQL Server Agent

  1. Abra o SQL Server Management Studio (SSMS)
  2. Navegue até SQL Server Agent > Jobs
  3. Abra o Job de Backup que é necessário criar o upload.
  4. Escolha CmdExec como tipo de comando e insira o script acima (Ajustado ao seu ambiente).
  5. Insira a chamada do script powershell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "C:\scripts\furushima_send_oci_log.ps1"
  6. Defina um agendamento adequado (diário, horário, etc.)

E Então…. estão nossos backups feito upload para o OCI S3, de forma automatizada pós backup! 🙂

Que tal resolver agora?