Protecting Oracle Cloud Infrastructure with Veeam: A Build-It-Yourself Walkthrough for VMs, Databases & Storage

Field Implementation Guide · Backup & Recovery


Protecting Oracle Cloud Infrastructure with Veeam

a build-it-yourself walkthrough for VMs, databases & storage



๐Ÿ“… July 07, 2026
๐Ÿท️ Veeam · OCI · RMAN · SOBR ⏱ 30 min read

What this walkthrough gets you

A working Veeam Data Platform deployment that protects three distinct estates on Oracle Cloud Infrastructure: native OCI Compute instances (agent-based), Oracle Cloud VMware Solution guest VMs (agentless, image-level), and Oracle Database (RMAN-driven). It ends with a tiered repository built on OCI's own storage services, so nothing here depends on a foreign cloud's object store.




Stack & versions used in this write-up

Veeam Backup & Replication 12.3Veeam Plug-in for Oracle RMAN 6.xVeeam Agent for Linux/Windows 6.xOCI Compute · VM.Standard.E5OCI Object Storage (S3-compatible endpoint)OCI File Storage (NFS)Oracle DB 19c / 23aiTerraform 1.7 · Ansible 2.16
Section 01

Why OCI needs a different playbook

Veeam's agentless magic on VMware and Hyper-V comes from talking directly to the hypervisor's snapshot API. OCI Compute doesn't expose an equivalent for native instances, so the same "point Veeam at the cluster and walk away" workflow doesn't exist there. What does exist, and what this guide is built around, is a three-part pattern that's been proven in production:

  • A Veeam Agent installed inside each OCI Compute VM, managed centrally by the backup server as if it were a physical box.
  • The Veeam Plug-in for Oracle RMAN, which hands the DBA's own rman commands a fast, deduplicated, encrypted landing zone.
  • Genuinely agentless, image-level protection wherever Oracle Cloud VMware Solution (OCVS) is in the picture, since OCVS is a real vSphere SDDC underneath.
Before you commit to a designCmdlet names, supported storage tiers, and immutability behavior have shifted across recent Veeam releases and OCI Object Storage updates. Cross-check the current Veeam Ready listing and the Veeam community forums against your target versions before finalizing an architecture.
SECTION 02

Reference architecture

One Veeam Backup & Replication server sits in an isolated management network. It reaches out to three protected estates and writes into a two-tier repository — fast storage for recent restore points, OCI Object Storage underneath for everything older.

Section 03

Sizing & prerequisites

ComponentFloorComfortableNotes
Veeam Backup & Replication12.112.3.xRuns on a dedicated OCI Windows Compute VM
Veeam Plug-in for Oracle RMAN4.x6.xInstalled alongside the Oracle client on the DB host
Veeam Agent (Linux/Windows)5.x6.xApplication-aware mode for Oracle detection
Oracle Database19c (19.3)19c latest RU / 23aiARCHIVELOG mode is mandatory
OCI Object StorageStandard tierStandard + Infrequent AccessAccessed via its S3-compatible endpoint
OCI File StorageMount target in a private subnetServes as the performance-tier repository
Terraform / OCI provider1.5 / 5.x1.7+ / 6.xFor a repeatable build
Identity & access baselineCarve out a dedicated backup compartment, create a dynamic group that matches the Veeam server's instance OCID, and scope its policy to object-family, volume-family, and file-family inside that compartment only — never grant it rights in the production compartment.
SECTION 04

Standing up the Veeam server

1
Provision the management VMAn 8-OCPU / 64 GB VM.Standard.E5.Flex Windows Server 2022 instance, private subnet, no public IP unless a bastion requires one.
bash — provision the Veeam server and its catalog volume
# Launch the Veeam Backup & Replication server
oci compute instance launch \
  --compartment-id ocid1.compartment.oc1..aaaaaaaabackupcmp \
  --availability-domain "AD-1" \
  --shape "VM.Standard.E5.Flex" \
  --shape-config '{"ocpus":8,"memoryInGBs":64}' \
  --display-name "veeam-vbr-mgmt-01" \
  --image-id ocid1.image.oc1..aaaaaaaawin2022std \
  --subnet-id ocid1.subnet.oc1..aaaaaaaabackupsub \
  --assign-public-ip false \
  --hostname-label veeam-vbr-mgmt-01

# Attach a volume to hold the Veeam configuration/catalog database
oci bv volume create \
  --compartment-id ocid1.compartment.oc1..aaaaaaaabackupcmp \
  --availability-domain "AD-1" \
  --size-in-gbs 500 \
  --display-name "veeam-catalog-vol"
PS C:\Users\administrator> Get-Service VeeamBackupSvc, VeeamCatalogSvc, VeeamCloudSvc Status   Name           DisplayName ------   ----           ----------- Running VeeamBackupSvc  Veeam Backup Service Running VeeamCatalogSvc Veeam Guest Catalog Service Running VeeamCloudSvc   Veeam Cloud Connect Service

Fig 2. Core services up and running on the OCI-hosted Veeam server.

2
Scope its OCI identity narrowlyA dynamic group tied to the server's own OCID, and a policy that only reaches into the backup compartment.
hcl — dynamic group + least-privilege policy
resource "oci_identity_dynamic_group" "veeam_dg" {
  compartment_id = var.tenancy_ocid
  name           = "veeam-vbr-dynamic-group"
  description    = "Matches the Veeam server instance so it can reach backup storage"
  matching_rule  = "ANY {instance.id = '${oci_core_instance.veeam_vbr.id}'}"
}

resource "oci_identity_policy" "veeam_policy" {
  compartment_id = var.tenancy_ocid
  name           = "veeam-backup-policy"
  description    = "Scopes the Veeam server to backup-compartment storage only"
  statements = [
    "Allow dynamic-group veeam-vbr-dynamic-group to manage object-family in compartment backup-compartment",
    "Allow dynamic-group veeam-vbr-dynamic-group to use volume-family in compartment backup-compartment",
    "Allow dynamic-group veeam-vbr-dynamic-group to use file-family in compartment backup-compartment",
    "Allow dynamic-group veeam-vbr-dynamic-group to read instances in compartment production-compartment",
  ]
}
SECTION 05

Native Compute: agent-based VM backup

Every production VM runs the Veeam Agent, and the backup server treats the fleet as a Protection Group of managed computers rather than a hypervisor's inventory.

1
Install and register the agent on an Oracle Linux host
bash — install & register Veeam Agent for Linux
# Add the Veeam repository and install the agent package
curl -1sLf 'https://repo.veeam.com/veeam/veeam-release.repo' | sudo tee /etc/yum.repos.d/veeam.repo
sudo dnf install -y veeam-release veeam

# Point the agent at the central Veeam server (managed mode)
sudo veeamconfig server addinfo \
  --name vbr01.backup.internal.oci \
  --port 10005 \
  --certfile /etc/veeam/vbr01.pem

sudo veeamconfig server list
[opc@ebs-app01 ~]$ sudo veeamconfig server list Server               Port   Status ------------------------ ----  -------- vbr01.backup.internal.oci 10005 Connected

Fig 3. The agent has phoned home and is now a managed member of the backup infrastructure.

2
Create the protection group and jobConsole path: Inventory → Physical & Cloud Infrastructure → Add → Individual Computers, then Home → Backup Job → Linux Computer.
powershell — build the job from the console host
# Register the OCI instance as a protected computer
Import-Module Veeam.Backup.PowerShell
$creds = Get-VBRCredentials -Name "opc-oci-key"
Add-VBRComputer -Name "ebs-app01.oci.internal" -Type Linux -Credentials $creds

# Point a nightly job at the tiered OCI repository built in Chapter 08
Add-VBRComputerBackupJob `
  -Name "OCI-AppTier-Backup" `
  -BackupRepository (Get-VBRBackupRepository -Name "OCI-Tiered-Repository") `
  -Computer (Get-VBRComputer -Name "ebs-app01.oci.internal") `
  -BackupType EntireComputer `
  -ScheduleType Daily `
  -ScheduleTime "22:00"
Job liveOCI-AppTier-Backup now runs nightly at 22:00, capturing the whole VM with application-aware processing for any Oracle Database it finds, landing in OCI-Tiered-Repository.
SECTION 06

OCVS: agentless image-level backup

Where Oracle Cloud VMware Solution is part of the estate, Veeam behaves exactly as it would against any on-premises vSphere cluster — no agent, full Changed Block Tracking, image-level restore points.

powershell — register OCVS vCenter, create the image-level job
# Add the OCVS vCenter as a managed virtualization server
Add-VBRServer -Type VC -Name "ocvs-vcenter.oci.internal" `
  -Credentials (Get-VBRCredentials -Name "ocvs-svc-account")

# Image-level job across the OCVS cluster's guest VMs
Add-VBRViBackupJob `
  -Name "OCVS-GuestVM-Backup" `
  -Entity (Find-VBRViEntity -Name "OCVS-Cluster-01") `
  -BackupRepository (Get-VBRBackupRepository -Name "OCI-Tiered-Repository") `
  -CompressionLevel Optimal `
  -EnableCBT $true
ocvs-vcenter.oci.internal → Backup Infrastructure → Managed Servers
ServerTypeStatus
ocvs-vcenter.oci.internalVMware vCenterConnected
vbr01.backup.internal.ociBackup ServerThis Server

Fig 4. OCVS's vCenter registered as a managed server — the same trust relationship you'd build on-premises.

SECTION 07

Oracle Database via the RMAN plug-in

The DBA keeps driving rman. The plug-in supplies an SBT_TAPE library that streams every backup piece into a Veeam-managed repository, picking up dedup, compression, encryption, and retention along the way.


1
Install the plug-in on the database host
bash — install & test the RMAN plug-in
sudo dnf install -y veeam-plugin-oracle-rman-6.0.rpm

sudo /opt/veeam/oracleplugin/rmanplugin \
  --set-server vbr01.backup.internal.oci --port 10005

sudo /opt/veeam/oracleplugin/rmanplugin --test-connection
oracle@ebs-db01:~$ /opt/veeam/oracleplugin/rmanplugin --test-connection Connecting to vbr01.backup.internal.oci:10005 ... OK Repository: OCI-Tiered-Repository ... Reachable License: Enterprise Plus ... Valid

Fig 6. Connectivity and licensing both check out before the first real backup runs.

2
Configure the channel and run a full backup
sql — RMAN channel configuration & backup
rman target /

CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE'
  PARMS="SBT_LIBRARY=/opt/veeam/oracleplugin/libveeamsbt.so,
         ENV=(VEEAM_SERVER=vbr01.backup.internal.oci,
              VEEAM_REPOSITORY=OCI-Tiered-Repository,
              VEEAM_JOB_NAME=EBSPROD-RMAN-Nightly)";

CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;

RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE 'SBT_TAPE';
  ALLOCATE CHANNEL c2 DEVICE TYPE 'SBT_TAPE';
  ALLOCATE CHANNEL c3 DEVICE TYPE 'SBT_TAPE';
  ALLOCATE CHANNEL c4 DEVICE TYPE 'SBT_TAPE';

  BACKUP AS COMPRESSED BACKUPSET
    DATABASE
    PLUS ARCHIVELOG
    TAG 'EBSPROD_NIGHTLY'
    FORMAT 'db_%d_%U';

  BACKUP CURRENT CONTROLFILE;

  RELEASE CHANNEL c1;
  RELEASE CHANNEL c2;
  RELEASE CHANNEL c3;
  RELEASE CHANNEL c4;
}

LIST BACKUP SUMMARY;
Starting backup at 07-JUL-2026 22:15:03 allocated channel: c1 channel c1: SBT_TAPE device type... connecting to repository OCI-Tiered-Repository channel c1: starting compressed full datafile backup set channel c1: finished piece 1 at 07-JUL-2026 22:47:19 ... Finished backup at 07-JUL-2026 22:51:44

Fig 7. Four parallel channels streaming straight into the OCI-backed repository.

3
Wrap it in a scheduled job
bash — /u01/scripts/rman_veeam_backup.sh
#!/bin/bash
# Nightly full + archivelog backup via the Veeam RMAN plug-in
export ORACLE_SID=EBSPROD
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
LOGFILE=/u01/scripts/logs/rman_$(date +%Y%m%d_%H%M%S).log

rman target / log=$LOGFILE <<EOF
RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE 'SBT_TAPE';
  ALLOCATE CHANNEL c2 DEVICE TYPE 'SBT_TAPE';
  BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG
    TAG 'NIGHTLY_$(date +%Y%m%d)' FORMAT 'db_%d_%U';
  BACKUP CURRENT CONTROLFILE;
  DELETE NOPROMPT OBSOLETE;
  RELEASE CHANNEL c1;
  RELEASE CHANNEL c2;
}
EOF

grep -qi "ORA-\|RMAN-" "$LOGFILE" && \
  mail -s "RMAN Backup FAILED on $(hostname)" dba-team@example.com < "$LOGFILE"
crontab — nightly trigger
0 22 * * * /u01/scripts/rman_veeam_backup.sh >> /u01/scripts/logs/cron.log 2>&1
SECTION 08

Building the tiered repository (SOBR)

The recommended shape is a Scale-Out Backup Repository: fast OCI File Storage for the most recent restore points, tiering out to OCI Object Storage for everything older.

A naming noteObject Storage's wire protocol happens to be S3-compatible, which is why some Veeam builds still expose cmdlets carrying an "AmazonS3Compatible" prefix left over from that protocol's origin. The walkthrough below uses Oracle-facing names throughout (Add-VBRObjectStorageRepository and friends); if your installed version hasn't renamed them yet, run Get-Command *S3* to find the local equivalents.
1
Create the performance-tier file system
bash — OCI File Storage + mount target
oci fs file-system create \
  --compartment-id ocid1.compartment.oc1..aaaaaaaabackupcmp \
  --availability-domain "AD-1" \
  --display-name "veeam-perf-fs"

oci fs mount-target create \
  --compartment-id ocid1.compartment.oc1..aaaaaaaabackupcmp \
  --availability-domain "AD-1" \
  --subnet-id ocid1.subnet.oc1..aaaaaaaabackupsub \
  --display-name "veeam-perf-mt"
2
Create the capacity-tier bucket and its access key
bash — Object Storage bucket + secret key
oci os bucket create \
  --compartment-id ocid1.compartment.oc1..aaaaaaaabackupcmp \
  --name veeam-oci-capacity-tier \
  --storage-tier Standard

oci iam customer-secret-key create \
  --user-id ocid1.user.oc1..aaaaaaaaveeamsvcuser \
  --display-name "veeam-oci-object-key"
3
Register it all in Veeam
powershell — object storage connection, extents, SOBR
# Register OCI Object Storage as the capacity-tier connection
Add-VBRObjectStorageConnection `
  -Name "OCI-Object-Storage" `
  -Type OCICompatible `
  -ServicePoint "https://axhbwqrfr7pd.compat.objectstorage.me-jeddah-1.oraclecloud.com" `
  -Credentials (Get-VBRObjectStorageAccessKey -AccessKey "OCI_VEEAM_KEY" `
                -SecretKey (ConvertTo-SecureString "***" -AsPlainText -Force))

$ociBucket = Get-VBRObjectStorageBucket `
  -Connection (Get-VBRObjectStorageConnection -Name "OCI-Object-Storage") `
  -Name "veeam-oci-capacity-tier"

Add-VBRObjectStorageRepository `
  -Name "OCI-Capacity-Tier" `
  -ObjectStorageFolder $ociBucket `
  -Bucket $ociBucket

# Performance tier on the File Storage NFS mount
Add-VBRNFSBackupRepository `
  -Name "OCI-Performance-Tier" `
  -Server "veeam-perf-mt.backup.internal.oci" `
  -Path "/veeam-perf-fs"

# Combine both into the Scale-Out Backup Repository
Add-VBRScaleOutBackupRepository `
  -Name "OCI-Tiered-Repository" `
  -Extent (Get-VBRBackupRepository -Name "OCI-Performance-Tier") `
  -CapacityExtent (Get-VBRBackupRepository -Name "OCI-Capacity-Tier") `
  -CapacityTierCopyPolicy `
  -OperationalRestorePeriodDays 14
Repository liveOCI-Tiered-Repository keeps 14 days of restore points on File Storage and copies every one of them to Object Storage for cheaper, longer retention.
SECTION 09

Repeatable deployment: Terraform & Ansible

hcl — core networking, compute, and the capacity bucket
terraform {
  required_providers {
    oci = { source = "oracle/oci", version = ">= 6.0.0" }
  }
}

resource "oci_core_vcn" "backup_vcn" {
  compartment_id = var.backup_compartment_id
  cidr_blocks    = ["10.90.0.0/24"]
  display_name   = "vcn-veeam-backup"
  dns_label      = "veeambkp"
}

resource "oci_core_subnet" "backup_subnet" {
  compartment_id             = var.backup_compartment_id
  vcn_id                     = oci_core_vcn.backup_vcn.id
  cidr_block                 = "10.90.0.0/25"
  display_name               = "subnet-veeam-mgmt"
  prohibit_public_ip_on_vnic = true
}

resource "oci_core_instance" "veeam_vbr" {
  compartment_id      = var.backup_compartment_id
  availability_domain = var.availability_domain
  shape               = "VM.Standard.E5.Flex"
  shape_config {
    ocpus         = 8
    memory_in_gbs = 64
  }
  display_name = "veeam-vbr-mgmt-01"

  create_vnic_details {
    subnet_id        = oci_core_subnet.backup_subnet.id
    assign_public_ip = false
  }

  source_details {
    source_type = "image"
    source_id   = var.windows_2022_image_id
  }
}

resource "oci_objectstorage_bucket" "capacity_tier" {
  compartment_id = var.backup_compartment_id
  namespace      = var.object_storage_namespace
  name           = "veeam-oci-capacity-tier"
  storage_tier   = "Standard"
  versioning     = "Enabled"
}
yaml — Ansible: bootstrap the fleet
---
- name: Configure Veeam Agent and Oracle RMAN plugin across the OCI fleet
  hosts: oci_oracle_hosts
  become: true
  vars:
    veeam_repo: "https://repo.veeam.com/veeam/veeam-release.repo"
    vbr_server: "vbr01.backup.internal.oci"

  tasks:
    - name: Add Veeam yum repository
      get_url:
        url: "{{ veeam_repo }}"
        dest: /etc/yum.repos.d/veeam.repo

    - name: Install Veeam Agent for Linux
      dnf:
        name: veeam
        state: present

    - name: Register agent to the central Veeam server
      command: >
        veeamconfig server addinfo
        --name {{ vbr_server }} --port 10005
      args:
        creates: /etc/veeam/registered.flag

    - name: Install the Oracle RMAN plug-in on database hosts
      dnf:
        name: veeam-plugin-oracle-rman
        state: present
      when: "'oracle_db' in group_names"

    - name: Deploy the nightly RMAN wrapper script
      copy:
        src: files/rman_veeam_backup.sh
        dest: /u01/scripts/rman_veeam_backup.sh
        mode: '0750'
        owner: oracle
        group: oinstall
      when: "'oracle_db' in group_names"

    - name: Schedule the nightly RMAN backup
      cron:
        name: "Veeam RMAN nightly backup"
        user: oracle
        hour: "22"
        minute: "0"
        job: "/u01/scripts/rman_veeam_backup.sh >> /u01/scripts/logs/cron.log 2>&1"
      when: "'oracle_db' in group_names"
SECTION 10

Immutability & the 3-2-1-1-0 rule

Known gap, worth planning aroundOCI Object Storage's bucket-level retention rules aren't yet recognized by Veeam as true S3 Object Lock, so immutability can't be fully enforced on the capacity tier alone today. Compensate with the layers below.
LayerHow it's satisfied here
3 copies of dataProduction + Performance Tier + Capacity Tier
2 different mediaFile Storage (performance) vs. Object Storage (capacity)
1 offsite copyCross-region Object Storage replication
1 immutable / air-gapped copyVeeam Data Cloud Vault, or a hardened Linux repository in immutable mode
0 errorsScheduled SureBackup jobs validating boot and application health
json — deny-all guard rail on the backup compartment
{
  "statements": [
    "Allow group Production-Admins to manage all-resources in compartment production-compartment",
    "Deny group Production-Admins to manage object-family in compartment backup-compartment where request.permission != 'OBJECT_INSPECT'",
    "Allow group Security-Officers to manage object-family in compartment backup-compartment",
    "Allow dynamic-group veeam-vbr-dynamic-group to manage object-family in compartment backup-compartment"
  ]
}
SECTION 11

Troubleshooting field notes

SymptomLikely causeFix
RMAN-06059: expected archived log not foundRMAN's own retention purged a log before the Veeam catalog caught upWiden the recovery window; run CROSSCHECK ARCHIVELOG ALL; before any delete
Agent shows Disconnected in the consoleSecurity list/NSG blocking the management or data portsOpen TCP 2500–3300 (data) and 10005 (agent management) between the VM and the server
ORA-19506: SBT interface failureWrong libveeamsbt.so path, or an unlicensed plug-inRe-run rmanplugin --test-connection; confirm Enterprise Plus licensing
Uploads to Object Storage crawlSingle-threaded upload, small multipart chunk sizeRaise the repository's upload thread count and part size
Capacity tier never receives copiesCopy policy disabled, or offload window mismatchedConfirm -CapacityTierCopyPolicy is set and Copy (not Move) mode is intended
Access denied writing to the bucketIAM policy scoped to the wrong compartmentCheck the dynamic group's matching rule against the bucket's compartment OCID
SECTION 12

Health-check commands

sql — database-side checks
SELECT log_mode FROM v$database;

SELECT session_key, input_type, status, start_time, end_time
FROM   v$rman_backup_job_details
ORDER  BY start_time DESC
FETCH FIRST 10 ROWS ONLY;

RMAN> REPORT OBSOLETE;
RMAN> CROSSCHECK BACKUP;
powershell — Veeam-side checks
Get-VBRBackupSession | Sort-Object CreationTime -Descending |
  Select-Object -First 10 Name, Result, EndTime

Get-VBRBackupRepository | Select-Object Name, `
  @{n='FreeGB';e={[math]::Round($_.GetContainer().CachedFreeSpace/1GB,1)}}
bash — connectivity spot-checks
veeamconfig server list

curl -I https://<namespace>.compat.objectstorage.<region>.oraclecloud.com

ldd /opt/veeam/oracleplugin/libveeamsbt.so
SECTION 13

Wrap-up & where to go next

What's protected nowIAM scoping → the Veeam server itself → agent-based Compute VMs → agentless OCVS guest VMs → RMAN-driven Oracle Database backups → a tiered repository spanning File Storage and Object Storage → Terraform/Ansible to rebuild any of it on demand.
  • Turn on SureBackup so every restore point — VM image or database — gets booted and validated automatically.
  • Layer in Veeam Data Cloud Vault or Cloud Connect as the genuinely immutable, air-gapped fourth copy until Object Storage reaches full lock parity.
  • Script the DR runbook so the Terraform module can redeploy compute in a second region straight from the replicated bucket.
  • Bring in Veeam ONE for fleet-wide monitoring and alerting across the OCI estate.
  • Set Object Storage lifecycle rules to auto-tier restore points from Standard to Infrequent Access once they age past the operational window.

Syed Zaheer

Service Delivery Director · Techvisions · Cloud, AI & Managed Infrastructure

Syed Zaheer is Service Delivery Director at Techvisions, author, speaker, and technology enthusiast with deep expertise in the Oracle landscape covering databases, middleware, Applications, AI and cloud infrastructure. He actively contributes to the Oracle community through technical articles, conference presentations, and knowledge-sharing initiatives, helping organizations modernize and optimize their enterprise technology platforms.



 

Comments

Popular posts from this blog

Installation of Oracle Applications R12.1.1 on Linux and vmware

ntp service in Maintenance mode Solaris 10

Oracle AVDF Installation and Setup Document