---
title: Backing up and restoring CSI snapshots data movement
---

# Backing up and restoring CSI snapshots data movement {#oadp-backup-restore-csi-snapshots}

You can back up and restore persistent volumes by using the OADP 1.3 Data Mover.

## Backing up persistent volumes with CSI snapshots {#oadp-1-3-backing-csi-snapshots_oadp-backup-restore-csi-snapshots}

You can use the OADP Data Mover to back up Container Storage Interface (CSI) volume snapshots to a remote object store.

**Prerequisites**

- You have access to the cluster with the `cluster-admin` role.
- You have installed the OADP Operator.
- You have included the CSI plugin and enabled the node agent in the `DataProtectionApplication` custom resource (CR).
- You have an application with persistent volumes running in a separate namespace.
- You have added the `metadata.labels.velero.io/csi-volumesnapshot-class: "true"` key-value pair to the `VolumeSnapshotClass` CR.

**Procedure**

1. Create a YAML file for the `Backup` object, as in the following example:

   ```yaml
   kind: Backup
   apiVersion: velero.io/v1
   metadata:
     name: backup
     namespace: openshift-adp
   spec:
     csiSnapshotTimeout: 10m0s
     defaultVolumesToFsBackup:
     includedNamespaces:
     - mysql-persistent
     itemOperationTimeout: 4h0m0s
     snapshotMoveData: true
     storageLocation: default
     ttl: 720h0m0s
     volumeSnapshotLocations:
     - dpa-sample-1
   # ...
   ```

   where:

   `defaultVolumesToFsBackup`
   :   Set to `true` if you use Data Mover only for volumes that opt out of `fs-backup`. Set to `false` if you use Data Mover by default for volumes.

   `snapshotMoveData`
   :   Set to `true` to enable movement of CSI snapshots to remote object storage.
2. Apply the manifest:

   ```terminal
   $ oc create -f backup.yaml
   ```

   A `DataUpload` CR is created after the snapshot creation is complete.

   > [!NOTE]
   > If you format the volume by using XFS filesystem and the volume is at 100% capacity, the backup fails with a `no space left on device` error. For example:
   >
   > ```terminal
   > Error: relabel failed /var/lib/kubelet/pods/3ac..34/volumes/ \
   > kubernetes.io~csi/pvc-684..12c/mount: lsetxattr /var/lib/kubelet/ \
   > pods/3ac..34/volumes/kubernetes.io~csi/pvc-68..2c/mount/data-xfs-103: \
   > no space left on device
   > ```
   >
   > In this scenario, consider resizing the volume or using a different filesystem type, for example, `ext4`, so that the backup completes successfully.

**Verification**

- Verify that the snapshot data is successfully transferred to the remote object store by monitoring the `status.phase` field of the `DataUpload` CR. Possible values are `In Progress`, `Completed`, `Failed`, or `Canceled`. The object store is configured in the `backupLocations` stanza of the `DataProtectionApplication` CR.

  - Run the following command to get a list of all `DataUpload` objects:

    ```terminal
    $ oc get datauploads -A
    ```

    ```terminal {title="Example output"}
    NAMESPACE       NAME                  STATUS      STARTED   BYTES DONE   TOTAL BYTES   STORAGE LOCATION   AGE     NODE
    openshift-adp   backup-test-1-sw76b   Completed   9m47s     108104082    108104082     dpa-sample-1       9m47s   ip-10-0-150-57.us-west-2.compute.internal
    openshift-adp   mongo-block-7dtpf     Completed   14m       1073741824   1073741824    dpa-sample-1       14m     ip-10-0-150-57.us-west-2.compute.internal
    ```
  - Check the value of the `status.phase` field of the specific `DataUpload` object by running the following command:

    ```terminal
    $ oc get datauploads <dataupload_name> -o yaml
    ```

    ```yaml {title="Example output"}
    apiVersion: velero.io/v2alpha1
    kind: DataUpload
    metadata:
      name: backup-test-1-sw76b
      namespace: openshift-adp
    spec:
      backupStorageLocation: dpa-sample-1
      csiSnapshot:
        snapshotClass: ""
        storageClass: gp3-csi
        volumeSnapshot: velero-mysql-fq8sl
      operationTimeout: 10m0s
      snapshotType: CSI
      sourceNamespace: mysql-persistent
      sourcePVC: mysql
    status:
      completionTimestamp: "2023-11-02T16:57:02Z"
      node: ip-10-0-150-57.us-west-2.compute.internal
      path: /host_pods/15116bac-cc01-4d9b-8ee7-609c3bef6bde/volumes/kubernetes.io~csi/pvc-eead8167-556b-461a-b3ec-441749e291c4/mount
      phase: Completed
      progress:
        bytesDone: 108104082
        totalBytes: 108104082
      snapshotID: 8da1c5febf25225f4577ada2aeb9f899
      startTimestamp: "2023-11-02T16:56:22Z"
    ```

    where:

    `phase: Completed`
    :   Indicates that snapshot data is successfully transferred to the remote object store.

## Restoring CSI volume snapshots {#oadp-1-3-restoring-csi-snapshots_oadp-backup-restore-csi-snapshots}

You can restore a volume snapshot by creating a `Restore` CR.

> [!NOTE]
> You cannot restore Volsync backups from OADP 1.2 with the OAPD 1.3 built-in Data Mover. It is recommended to do a file system backup of all of your workloads with Restic before upgrading to OADP 1.3.

**Prerequisites**

- You have access to the cluster with the `cluster-admin` role.
- You have an OADP `Backup` CR from which to restore the data.

**Procedure**

1. Create a YAML file for the `Restore`  CR, as in the following example:

   ```yaml {title="Example Restore CR"}
   apiVersion: velero.io/v1
   kind: Restore
   metadata:
     name: restore
     namespace: openshift-adp
   spec:
     backupName: <backup>
   # ...
   ```
2. Apply the manifest:

   ```terminal
   $ oc create -f restore.yaml
   ```

   A `DataDownload` CR is created when the restore starts.

**Verification**

- You can monitor the status of the restore process by checking the `status.phase` field of the `DataDownload` CR. Possible values are `In Progress`, `Completed`, `Failed`, or `Canceled`.

  - To get a list of all `DataDownload` objects, run the following command:

    ```terminal
    $ oc get datadownloads -A
    ```

    ```terminal {title="Example output"}
    NAMESPACE       NAME                   STATUS      STARTED   BYTES DONE   TOTAL BYTES   STORAGE LOCATION   AGE     NODE
    openshift-adp   restore-test-1-sk7lg   Completed   7m11s     108104082    108104082     dpa-sample-1       7m11s   ip-10-0-150-57.us-west-2.compute.internal
    ```
  - Enter the following command to check the value of the `status.phase` field of the specific `DataDownload` object:

    ```terminal
    $ oc get datadownloads <datadownload_name> -o yaml
    ```

    ```yaml {title="Example output"}
    apiVersion: velero.io/v2alpha1
    kind: DataDownload
    metadata:
      name: restore-test-1-sk7lg
      namespace: openshift-adp
    spec:
      backupStorageLocation: dpa-sample-1
      operationTimeout: 10m0s
      snapshotID: 8da1c5febf25225f4577ada2aeb9f899
      sourceNamespace: mysql-persistent
      targetVolume:
        namespace: mysql-persistent
        pv: ""
        pvc: mysql
    status:
      completionTimestamp: "2023-11-02T17:01:24Z"
      node: ip-10-0-150-57.us-west-2.compute.internal
      phase: Completed
      progress:
        bytesDone: 108104082
        totalBytes: 108104082
      startTimestamp: "2023-11-02T17:00:52Z"
    ```

    where:

    `phase: Completed`
    :   Indicates that the CSI snapshot data is successfully restored.

## Deletion policy for OADP 1.3 {#oadp-deletion-policy-1-3_oadp-backup-restore-csi-snapshots}

The deletion policy determines rules for removing data from a system, specifying when and how deletion occurs based on factors such as retention periods, data sensitivity, and compliance requirements. It manages data removal effectively while meeting regulations and preserving valuable information.

### Deletion policy guidelines for OADP 1.3 {#oadp-deletion-policy-guidelines-1-3_oadp-backup-restore-csi-snapshots}

Review the following deletion policy guidelines for the OADP 1.3:

- In OADP 1.3.x, when using any type of backup and restore methods, you can set the `deletionPolicy` field to `Retain` or `Delete` in the `VolumeSnapshotClass` custom resource (CR).
