Migrating Petabytes of data to OCI Obj Store via Oracle FastConnect.

Recently I transfered large amount of data from the Next Cloud CMS to Oracle Content Management and then migrated off and onto WebCenter Content. It's been a couple months now and I thought I'd pull together a quick blog post to share some of the options you can use on the Oracle Cloud Platform to transfer Petabytes of data from on-prem to the Oracle Cloud.

💡
If you didn't know CM Box - Fishbowl Solutions DXP Platform, can securely control and manage PB of data from the OCI Object store for both Assets and Documents and optionally hook them up directly to Oracle WebCenter Content enabling and syncing corresponding metadata mappings.

In this post we will cover the following:

  1. Options for Transferring Content to Oracle Cloud.
  2. Moving Data via Oracle FastConnect to OCI Obj Store.
  3. Ingesting data to CM Box from OCI Object Store.
  4. Verifying Data transfer

1. Options for transferring content to the Oracle Cloud

There are two options available that I know today to get large datasets into the Oracle Cloud - OCI.

- Oracle FastConnect
- DTS Service

With Fast Connect you transfer over the network and with DTS you ship a hard drive to Oracle - here is a quick comparison this is how long it would take to get the data into the cloud.

Size 10 Mbps 100 Mbps 1 Gbps 10 Gbps DTS
10 TB 92 Days 9 Days 22 Hours 2 Hours 1 Week
100 TB 1,018 Days 101 Days 10 Days 24 Hours 1 Week
1 PB 10,184 Days
(~27.9 years)
1,018 Days
(~2.8 years)
101 Days 2–3 Weeks 2–3 Weeks
20 PB 203,650 Days
(~558 years)
20,365 Days
(~55.8 years)
2,037 Days
(~5.6 years)
5–6 Months 2–3 Months

1) Oracle FastConnect

If you have the bandwidth you can enable VPN access and enable high speed transfers from 1 to 10 Gbps that will allow you to quickly transfer data to the Oracle Cloud.

2) Data Transfer Service

If you don't have the bandwidth and your data center accepts DTS - not all do especially in EMEA regions.

💡
I would recommend this approach there is less that can go wrong with network connectivity issues etc.

You have 2 options when requesting DTS:

2.1)  Data Import - Disk
Ship out your own hard drive to Oracles Transfer Office and they will import the data and send back your hard drive.

The process is fairly straightforward; here is  a high-level flow of what happens:

Check out the FAQ here DTS -Disk

Oracle Data Transfer Disk FAQ
Learn about Oracle Cloud Infrastructure Data Transfer Options (Data Transfer Appliance and Data Transfer Disk) and their usage, features, security and pricing.


2.2) or Data Import - Appliance
the better option if you are transferring a large amount of data is to use the Data Transfer Appliance offering which unless things have changed I believe is free.

However there is limited support on which data centers offer this service:

Data Transfer Appliance service is supported in us-phoenix-1, us-ashburn-1, eu-frankfurt-1, uk-london-1, ap-tokyo-1, ap-osaka-1, sa-saopaulo-1, us-luke-1, us-gov-ashburn-1, ca-toronto-1, Oracle Cloud Infrastructure regions. Note that data originating in EU can be shipped only to Frankfurt.

Check out the FAQ Here DTS-Appliance

Oracle Data Transfer Appliance FAQ
Learn about Oracle Cloud Infrastructure Data Transfer Options (Data Transfer Appliance and Data Transfer Disk) and their usage, features, security and pricing.

2. Moving Data via Oracle FastConnect to OCI Obj Store.

Once you have FastConnect Configured you can use the OCI CLI. There are other options using RClone but for this post I'll cover Oracles OCI Command Line Utility.

Transfer files using the OCI CLI

1. Install & Configure the OCI CLI
Download and install the CLI (available for Windows, macOS, and Linux).

https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm

Configure the CLI with your tenancy information, user credentials, and key files by running:

oci setup config

This will prompt you for region, tenancy OCID, user OCID, fingerprint, and private key path.

2. Create an Object Storage Bucket
In the OCI Console: Object StorageBucketsCreate Bucket.

Provide a Name and choose a Storage Tier (e.g., Standard).

Note the bucket’s name and the compartment.

3. Upload Files
Using the CLI, upload a file to the bucket:

oci os object put \ --bucket-name <your-bucket-name> \ --name <file-name-in-ObjectStorage> \ --file <local-file-path>
For larger files, the CLI automatically performs multipart uploads (in chunks). You can tweak options like --part-size and --parallel-uploads if needed.

To upload multiple files you can use this Bash Script, which will preserve the folder structure.

#!/bin/bash

BUCKET_NAME="your-bucket-name"
SOURCE_DIR="/path/to/local/folder"
PREFIX_PATH="optional/prefix/in/bucket"  # leave blank if not needed

# Recursively find all files and upload them
find "$SOURCE_DIR" -type f | while read -r filepath; do
  # Compute object name by stripping source dir and prepending prefix
  relative_path="${filepath#$SOURCE_DIR/}"
  object_name="$PREFIX_PATH/$relative_path"

  echo "Uploading $filepath → $object_name"

  oci os object put \
    --bucket-name "$BUCKET_NAME" \
    --file "$filepath" \
    --name "$object_name" \
    --force
done

4. List Objects
Verify uploads by listing objects:

os object list --bucket-name <your-bucket-name>

5. Download Files (if needed)
To retrieve objects from Object Storage:

os object get \ --bucket-name <your-bucket-name> \ --name <file-name-in-ObjectStorage> \ --file <local-download-path>

Looking to Manage and Secure your Cloud Content?

Try out Fishbowl Solutions new CM Box Digital Experience Platform designed for the Oracle Cloud, with an inbuilt CMS, DAM and AI integrations that allow you to secure and find your content faster than before. With Enterprise Search, SSO and ability to securely select and share out content with partners.


3. Ingesting data to CM Box from OCI Object Store.

You can 2 options to connect the data from OCI Object either run the CM Box CLI or (Coming soon!) directly within CM Box WebUI target the assets to hook into a repository.

3.1 CM Box CLI

This allows you to configure the Object store to connect to and map a CSV file for metadata mappings to link the content held within a CM Box repository.

3.2 CM Box Web UI for hybrid object storage

The team are working on a new integration that will allow you directly from the CM Box WebUI to connect and link or import data from any Cloud Object Store.

This then provides users the ability to map their own meta data and choose files to be imported or linked into individual repositories.

4. Verifying Data transfer

Here is an all in one approach that uploads the file and verifies the data by checking the file size and MD5 Checksum of each of the files after they are uploaded and generates a log for you to review any files that have failed to be transfered.

#!/bin/bash

# ----------- Configuration -----------
BUCKET_NAME="your-bucket-name"
SOURCE_DIR="/path/to/your/local/folder"
LOG_UPLOAD="upload.log"
LOG_VERIFY="verify.log"

# Ensure required commands exist
command -v oci >/dev/null 2>&1 || { echo >&2 "OCI CLI not found. Aborting."; exit 1; }
command -v md5sum >/dev/null 2>&1 || { echo >&2 "md5sum not found. Aborting."; exit 1; }
command -v base64 >/dev/null 2>&1 || { echo >&2 "base64 not found. Aborting."; exit 1; }
command -v xxd >/dev/null 2>&1 || { echo >&2 "xxd not found. Aborting."; exit 1; }

# Clean previous logs
> "$LOG_UPLOAD"
> "$LOG_VERIFY"

echo "Starting upload of files in $SOURCE_DIR to bucket $BUCKET_NAME..."
echo "Logging uploads to $LOG_UPLOAD and verifications to $LOG_VERIFY"

find "$SOURCE_DIR" -type f | while read -r FILE; do
    REL_PATH="${FILE#$SOURCE_DIR/}"  # preserve folder structure
    echo "Uploading: $REL_PATH" | tee -a "$LOG_UPLOAD"

    oci os object put \
        --bucket-name "$BUCKET_NAME" \
        --file "$FILE" \
        --name "$REL_PATH" \
        --force >> "$LOG_UPLOAD" 2>&1

    if [ $? -ne 0 ]; then
        echo "[UPLOAD FAIL] $REL_PATH" | tee -a "$LOG_UPLOAD"
        continue
    fi

    # Compute local MD5 in base64
    LOCAL_MD5_HEX=$(md5sum "$FILE" | awk '{print $1}')
    LOCAL_MD5_BASE64=$(echo "$LOCAL_MD5_HEX" | xxd -r -p | base64)

    # Get object metadata from OCI
    META=$(oci os object head \
        --bucket-name "$BUCKET_NAME" \
        --name "$REL_PATH" 2>/dev/null)

    REMOTE_MD5=$(echo "$META" | grep -i 'opc-content-md5' | awk '{print $2}')
    REMOTE_SIZE=$(echo "$META" | grep -i 'content-length' | awk '{print $2}')
    LOCAL_SIZE=$(stat -c%s "$FILE")

    if [[ "$LOCAL_MD5_BASE64" == "$REMOTE_MD5" && "$LOCAL_SIZE" == "$REMOTE_SIZE" ]]; then
        echo "[VERIFY OK] $REL_PATH" | tee -a "$LOG_VERIFY"
    else
        echo "[VERIFY FAIL] $REL_PATH - size or MD5 mismatch" | tee -a "$LOG_VERIFY"
    fi
done

echo "✅ Upload + verification complete."
echo "Check $LOG_UPLOAD and $LOG_VERIFY for full logs."

Conclusion and final thoughts..

In my opinion you should use Oracle Data Transfer Service (DTS) when you need to move large amounts of data (TBs or PBs) to Oracle Cloud but lack fast or reliable internet. It’s ideal for one-time bulk migrations where shipping physical storage devices is more practical.

💡
The Oracle DTS Drives only support 150TB / drive. 

Use Oracle FastConnect when you need a dedicated, high-speed, low-latency connection to Oracle Cloud for ongoing data transfers, hybrid applications, or real-time access. It’s best for consistent, secure, high-performance connectivity that bypasses the public internet.

If you need to securely manage large amounts of data from Oracle Object Storage checkout Fishbowl Solutions Enterprise CM Box Platform or Oracle WebCenter Content.