<hr style="height:1px;border:none;color:#333;"> <h1 align="center">Stateful Application Backup/Restore - MySQL</h1> <h2 align="center">Using an AWS s3 Bucket and AWS EBS Snapshot</h2> ### Prerequisites * OADP operator, a credentials secret, and a DataProtectionApplication (DPA) CR are all created. Follow [these steps](/docs/install_olm.md) for installation instructions. - Make sure your DPA CR is similar to below in the install step. * Information on `backupLocations` and `snapshotLocations` specs can be found [here](/docs/config/bsl_and_vsl.md). ``` apiVersion: oadp.openshift.io/v1alpha1 kind: DataProtectionApplication metadata: name: dpa-sample spec: configuration: velero: defaultPlugins: - openshift - aws nodeAgent: enable: true uploaderType: restic backupLocations: - name: default velero: provider: aws default: true objectStorage: bucket: my-bucket prefix: my-prefix config: region: us-east-1 profile: "default" credential: name: cloud-credentials key: cloud snapshotLocations: - name: default velero: provider: aws config: region: us-west-2 profile: "default" ``` <hr style="height:1px;border:none;color:#333;"> ### Create the MySQL deployment config: This is an example only, please use the appropriate storage class for your PVC. `oc create -f docs/examples/manifests/mysql/mysql-persistent-template.yaml -f pvc/[aws.yaml, azure.yaml, gcp.yaml, ibmcloud.yaml]` This example will create the following resources: * **Namespace** * **Secret** * **Service** * **Route** * **PersistentVolumeClaim** * **Deployment** ### Verify application resources: `oc get all -n mysql-persistent` Should look similar to this: ``` NAME READY STATUS RESTARTS AGE pod/mysql-6bb6964964-x4s8d 1/1 Running 0 54s pod/todolist-1-59jqk 1/1 Running 0 51s pod/todolist-1-deploy 0/1 Completed 0 54s NAME DESIRED CURRENT READY AGE replicationcontroller/todolist-1 1 1 1 54s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/mysql ClusterIP 172.30.73.117 <none> 3306/TCP 55s service/todolist ClusterIP 172.30.92.118 <none> 8000/TCP 55s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/mysql 1/1 1 1 55s NAME DESIRED CURRENT READY AGE replicaset.apps/mysql-6bb6964964 1 1 1 55s NAME REVISION DESIRED CURRENT TRIGGERED BY deploymentconfig.apps.openshift.io/todolist 1 1 1 config ``` ### Add data to application Visit the route location provided in the `HOST/PORT` section following this command: `oc get routes -n mysql-persistent` Here you will see a table of data. Enter additional data and save. Once completed, it's time to begin a backup. ### Check the data It is good practice to check the data in the database prior to taking the backup. ``` export TODOHOST=`oc get route -n mysql-persistent -o jsonpath='{range .items[*]}{.spec.host}'` curl $TODOHOST/todo-incomplete curl $TODOHOST/todo-completed ``` output: ``` curl $TODOHOST/todo-incomplete [{"Id":1,"Description":"time to make the donuts","Completed":false},{"Id":3,"Description":"westest1","Completed":false},{"Id":4,"Description":"westest2","Completed":false}] curl $TODOHOST/todo-completed [{"Id":2,"Description":"prepopulate the db","Completed":true}] ``` ### Create application backup `oc create -f docs/examples/manifests/mysql/mysql-backup.yaml` ### Verify the backup is completed `oc get backup -n openshift-adp mysql-persistent -o jsonpath='{.status.phase}'` should result in `Completed` ### Delete the application Once we have ensured the backup is completed, we want to test the restore process. First, delete the `mysql-persistent` project: `oc delete namespace mysql-persistent` ### Create the restore for the application `oc create -f docs/examples/manifests/mysql/mysql-restore.yaml` ### Verify the restore is completed `oc get restore -n openshift-adp mysql-persistent -o jsonpath='{.status.phase}'` Should result in `Completed` ### Verify all resources have been recreated in the restore process `oc get all -n mysql-persistent` Should look similar to this: ``` NAME READY STATUS RESTARTS AGE pod/mysql-6bb6964964-x4s8d 1/1 Running 0 54s pod/todolist-1-59jqk 1/1 Running 0 51s pod/todolist-1-deploy 0/1 Completed 0 54s NAME DESIRED CURRENT READY AGE replicationcontroller/todolist-1 1 1 1 54s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/mysql ClusterIP 172.30.73.117 <none> 3306/TCP 55s service/todolist ClusterIP 172.30.92.118 <none> 8000/TCP 55s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/mysql 1/1 1 1 55s NAME DESIRED CURRENT READY AGE replicaset.apps/mysql-6bb6964964 1 1 1 55s NAME REVISION DESIRED CURRENT TRIGGERED BY deploymentconfig.apps.openshift.io/todolist 1 1 1 config ``` ### Verify the data previously entered in the mysql table `oc get routes -n mysql-persistent` Check the data in the table previously entered is present. ### Once again check the data after the restore output: ``` curl $TODOHOST/todo-incomplete [{"Id":1,"Description":"time to make the donuts","Completed":false},{"Id":3,"Description":"westest1","Completed":false},{"Id":4,"Description":"westest2","Completed":false}] curl $TODOHOST/todo-completed [{"Id":2,"Description":"prepopulate the db","Completed":true}]