1e41f4b71Sopenharmony_ci# Database Backup and Restore 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci## When to Use 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ciYou may need to restore a database in any of the following cases: 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci- An important operation being performed by an application is interrupted. 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci- The database is unavailable due to data loss or corruption, or dirty data. 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ciBoth KV stores and RDB stores support database backup and restore. In addition, KV stores allow you to delete database backups to release local storage space. 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci## Backing Up, Restoring, and Deleting a KV Store 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ciYou can use **backup()** to back up a KV store, use **restore()** to restore a KV store, and use **deletebackup()** to delete a KV store backup file. For details about the APIs, see [Distributed KV Store](../reference/apis-arkdata/js-apis-distributedKVStore.md). 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci1. Create a KV store. 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci (1) Create a **kvManager** instance. 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci (2) Set database parameters. 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci (3) Create a **kvStore** instance. 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci ```ts 30e41f4b71Sopenharmony_ci import { distributedKVStore } from '@kit.ArkData'; 31e41f4b71Sopenharmony_ci import { BusinessError } from '@kit.BasicServicesKit'; 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci let kvManager: distributedKVStore.KVManager; 34e41f4b71Sopenharmony_ci let kvStore: distributedKVStore.SingleKVStore | undefined = undefined; 35e41f4b71Sopenharmony_ci let context = getContext(this); 36e41f4b71Sopenharmony_ci const kvManagerConfig: distributedKVStore.KVManagerConfig = { 37e41f4b71Sopenharmony_ci context: context, 38e41f4b71Sopenharmony_ci bundleName: 'com.example.datamanagertest' 39e41f4b71Sopenharmony_ci } 40e41f4b71Sopenharmony_ci try { 41e41f4b71Sopenharmony_ci kvManager = distributedKVStore.createKVManager(kvManagerConfig); 42e41f4b71Sopenharmony_ci console.info('Succeeded in creating KVManager.'); 43e41f4b71Sopenharmony_ci try { 44e41f4b71Sopenharmony_ci const options: distributedKVStore.Options = { 45e41f4b71Sopenharmony_ci createIfMissing: true, 46e41f4b71Sopenharmony_ci encrypt: true, 47e41f4b71Sopenharmony_ci backup: false, 48e41f4b71Sopenharmony_ci autoSync: false, 49e41f4b71Sopenharmony_ci kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, 50e41f4b71Sopenharmony_ci securityLevel: distributedKVStore.SecurityLevel.S3 51e41f4b71Sopenharmony_ci }; 52e41f4b71Sopenharmony_ci kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options, (err, store: distributedKVStore.SingleKVStore) => { 53e41f4b71Sopenharmony_ci if (err) { 54e41f4b71Sopenharmony_ci console.error(`Failed to get KVStore. Code:${err.code},message:${err.message}`); 55e41f4b71Sopenharmony_ci return; 56e41f4b71Sopenharmony_ci } 57e41f4b71Sopenharmony_ci console.info('Succeeded in getting KVStore.'); 58e41f4b71Sopenharmony_ci kvStore = store; 59e41f4b71Sopenharmony_ci }); 60e41f4b71Sopenharmony_ci } catch (e) { 61e41f4b71Sopenharmony_ci let error = e as BusinessError; 62e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 63e41f4b71Sopenharmony_ci } 64e41f4b71Sopenharmony_ci } catch (e) { 65e41f4b71Sopenharmony_ci let error = e as BusinessError; 66e41f4b71Sopenharmony_ci console.error(`Failed to create KVManager. Code:${error.code},message:${error.message}`); 67e41f4b71Sopenharmony_ci } 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci if (kvStore !== undefined) { 70e41f4b71Sopenharmony_ci kvStore = kvStore as distributedKVStore.SingleKVStore; 71e41f4b71Sopenharmony_ci // Perform subsequent operations. 72e41f4b71Sopenharmony_ci //... 73e41f4b71Sopenharmony_ci } 74e41f4b71Sopenharmony_ci ``` 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci2. Use **put()** to insert data to the KV store. 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ci ```ts 79e41f4b71Sopenharmony_ci const KEY_TEST_STRING_ELEMENT = 'key_test_string'; 80e41f4b71Sopenharmony_ci const VALUE_TEST_STRING_ELEMENT = 'value_test_string'; 81e41f4b71Sopenharmony_ci try { 82e41f4b71Sopenharmony_ci kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => { 83e41f4b71Sopenharmony_ci if (err !== undefined) { 84e41f4b71Sopenharmony_ci console.error(`Fail to put data. Code:${err.code},message:${err.message}`); 85e41f4b71Sopenharmony_ci return; 86e41f4b71Sopenharmony_ci } 87e41f4b71Sopenharmony_ci console.info('Succeeded in putting data.'); 88e41f4b71Sopenharmony_ci }); 89e41f4b71Sopenharmony_ci } catch (e) { 90e41f4b71Sopenharmony_ci let error = e as BusinessError; 91e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 92e41f4b71Sopenharmony_ci } 93e41f4b71Sopenharmony_ci ``` 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci3. Use **backup()** to back up the KV store. 96e41f4b71Sopenharmony_ci 97e41f4b71Sopenharmony_ci ```ts 98e41f4b71Sopenharmony_ci let backupFile = 'BK001'; 99e41f4b71Sopenharmony_ci try { 100e41f4b71Sopenharmony_ci kvStore.backup(backupFile, (err) => { 101e41f4b71Sopenharmony_ci if (err) { 102e41f4b71Sopenharmony_ci console.error(`Fail to backup data.code:${err.code},message:${err.message}`); 103e41f4b71Sopenharmony_ci } else { 104e41f4b71Sopenharmony_ci console.info('Succeeded in backupping data.'); 105e41f4b71Sopenharmony_ci } 106e41f4b71Sopenharmony_ci }); 107e41f4b71Sopenharmony_ci } catch (e) { 108e41f4b71Sopenharmony_ci let error = e as BusinessError; 109e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 110e41f4b71Sopenharmony_ci } 111e41f4b71Sopenharmony_ci ``` 112e41f4b71Sopenharmony_ci 113e41f4b71Sopenharmony_ci4. Use **delete()** to delete data to simulate unexpected deletion or data tampering. 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_ci ```ts 116e41f4b71Sopenharmony_ci try { 117e41f4b71Sopenharmony_ci kvStore.delete(KEY_TEST_STRING_ELEMENT, (err) => { 118e41f4b71Sopenharmony_ci if (err !== undefined) { 119e41f4b71Sopenharmony_ci console.error(`Fail to delete data. Code:${err.code},message:${err.message}`); 120e41f4b71Sopenharmony_ci return; 121e41f4b71Sopenharmony_ci } 122e41f4b71Sopenharmony_ci console.info('Succeeded in deleting data.'); 123e41f4b71Sopenharmony_ci }); 124e41f4b71Sopenharmony_ci } catch (e) { 125e41f4b71Sopenharmony_ci let error = e as BusinessError; 126e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 127e41f4b71Sopenharmony_ci } 128e41f4b71Sopenharmony_ci ``` 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci5. Use **restore()** to restore the KV store. 131e41f4b71Sopenharmony_ci 132e41f4b71Sopenharmony_ci ```ts 133e41f4b71Sopenharmony_ci let backupFile = 'BK001'; 134e41f4b71Sopenharmony_ci try { 135e41f4b71Sopenharmony_ci kvStore.restore(backupFile, (err) => { 136e41f4b71Sopenharmony_ci if (err) { 137e41f4b71Sopenharmony_ci console.error(`Fail to restore data. Code:${err.code},message:${err.message}`); 138e41f4b71Sopenharmony_ci } else { 139e41f4b71Sopenharmony_ci console.info('Succeeded in restoring data.'); 140e41f4b71Sopenharmony_ci } 141e41f4b71Sopenharmony_ci }); 142e41f4b71Sopenharmony_ci } catch (e) { 143e41f4b71Sopenharmony_ci let error = e as BusinessError; 144e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 145e41f4b71Sopenharmony_ci } 146e41f4b71Sopenharmony_ci ``` 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ci6. Use **deleteBackup()** to delete the backup file to release storage space. 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci ```ts 151e41f4b71Sopenharmony_ci let files = ['BK001']; 152e41f4b71Sopenharmony_ci try { 153e41f4b71Sopenharmony_ci kvStore.deleteBackup(files).then((data) => { 154e41f4b71Sopenharmony_ci console.info(`Succeed in deleting Backup. Data:filename is ${data[0]},result is ${data[1]}.`); 155e41f4b71Sopenharmony_ci }).catch((err: BusinessError) => { 156e41f4b71Sopenharmony_ci console.error(`Fail to delete Backup. Code:${err.code},message:${err.message}`); 157e41f4b71Sopenharmony_ci }) 158e41f4b71Sopenharmony_ci } catch (e) { 159e41f4b71Sopenharmony_ci let error = e as BusinessError; 160e41f4b71Sopenharmony_ci console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`); 161e41f4b71Sopenharmony_ci } 162e41f4b71Sopenharmony_ci ``` 163e41f4b71Sopenharmony_ci 164e41f4b71Sopenharmony_ci 165e41f4b71Sopenharmony_ci## Backing Up and Restoring an RDB Store 166e41f4b71Sopenharmony_ci 167e41f4b71Sopenharmony_ciYou can use **backup()** to back up an RDB store, and use **restore()** to restore an RDB store. For details about the APIs, see [RDB Store](../reference/apis-arkdata/js-apis-data-relationalStore.md). 168e41f4b71Sopenharmony_ci 169e41f4b71Sopenharmony_ci1. Use **getRdbStore()** to create an RDB store. 170e41f4b71Sopenharmony_ci 171e41f4b71Sopenharmony_ci ```ts 172e41f4b71Sopenharmony_ci import { relationalStore } from '@kit.ArkData'; 173e41f4b71Sopenharmony_ci import { BusinessError } from '@kit.BasicServicesKit'; 174e41f4b71Sopenharmony_ci 175e41f4b71Sopenharmony_ci let store: relationalStore.RdbStore | undefined = undefined; 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci let context = getContext(this); 178e41f4b71Sopenharmony_ci 179e41f4b71Sopenharmony_ci const STORE_CONFIG: relationalStore.StoreConfig = { 180e41f4b71Sopenharmony_ci name: 'RdbTest.db', 181e41f4b71Sopenharmony_ci securityLevel: relationalStore.SecurityLevel.S3 182e41f4b71Sopenharmony_ci }; 183e41f4b71Sopenharmony_ci relationalStore.getRdbStore(context, STORE_CONFIG, (err, rdbStore) => { 184e41f4b71Sopenharmony_ci store = rdbStore; 185e41f4b71Sopenharmony_ci if (err) { 186e41f4b71Sopenharmony_ci console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`); 187e41f4b71Sopenharmony_ci return; 188e41f4b71Sopenharmony_ci } 189e41f4b71Sopenharmony_ci store.executeSql('CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)', (err) => { 190e41f4b71Sopenharmony_ci }) 191e41f4b71Sopenharmony_ci console.info('Succeeded in getting RdbStore.'); 192e41f4b71Sopenharmony_ci }) 193e41f4b71Sopenharmony_ci ``` 194e41f4b71Sopenharmony_ci 195e41f4b71Sopenharmony_ci2. Use **insert()** to insert data to the RDB store. 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci ```ts 198e41f4b71Sopenharmony_ci import { ValuesBucket } from '@kit.ArkData'; 199e41f4b71Sopenharmony_ci 200e41f4b71Sopenharmony_ci let value1 = 'Rose'; 201e41f4b71Sopenharmony_ci let value2 = 18; 202e41f4b71Sopenharmony_ci let value3 = 100.5; 203e41f4b71Sopenharmony_ci let value4 = new Uint8Array([1, 2, 3, 4, 5]); 204e41f4b71Sopenharmony_ci 205e41f4b71Sopenharmony_ci // You can use either of the following: 206e41f4b71Sopenharmony_ci const valueBucket1: ValuesBucket = { 207e41f4b71Sopenharmony_ci 'NAME': value1, 208e41f4b71Sopenharmony_ci 'AGE': value2, 209e41f4b71Sopenharmony_ci 'SALARY': value3, 210e41f4b71Sopenharmony_ci 'CODES': value4, 211e41f4b71Sopenharmony_ci }; 212e41f4b71Sopenharmony_ci const valueBucket2: ValuesBucket = { 213e41f4b71Sopenharmony_ci NAME: value1, 214e41f4b71Sopenharmony_ci AGE: value2, 215e41f4b71Sopenharmony_ci SALARY: value3, 216e41f4b71Sopenharmony_ci CODES: value4, 217e41f4b71Sopenharmony_ci }; 218e41f4b71Sopenharmony_ci const valueBucket3: ValuesBucket = { 219e41f4b71Sopenharmony_ci "NAME": value1, 220e41f4b71Sopenharmony_ci "AGE": value2, 221e41f4b71Sopenharmony_ci "SALARY": value3, 222e41f4b71Sopenharmony_ci "CODES": value4, 223e41f4b71Sopenharmony_ci }; 224e41f4b71Sopenharmony_ci 225e41f4b71Sopenharmony_ci if(store != undefined) { 226e41f4b71Sopenharmony_ci (store as relationalStore.RdbStore).insert('EMPLOYEE', valueBucket1, relationalStore.ConflictResolution.ON_CONFLICT_REPLACE, (err, rowId) => { 227e41f4b71Sopenharmony_ci if (err) { 228e41f4b71Sopenharmony_ci console.error(`Failed to insert data. Code:${err.code},message:${err.message}`); 229e41f4b71Sopenharmony_ci return; 230e41f4b71Sopenharmony_ci } 231e41f4b71Sopenharmony_ci console.info(`Succeeded in inserting data. rowId:${rowId}`); 232e41f4b71Sopenharmony_ci }) 233e41f4b71Sopenharmony_ci } 234e41f4b71Sopenharmony_ci ``` 235e41f4b71Sopenharmony_ci 236e41f4b71Sopenharmony_ci3. Use **backup()** to back up the RDB store. 237e41f4b71Sopenharmony_ci 238e41f4b71Sopenharmony_ci ```ts 239e41f4b71Sopenharmony_ci if(store != undefined) { 240e41f4b71Sopenharmony_ci (store as relationalStore.RdbStore).backup('dbBackup.db', (err) => { 241e41f4b71Sopenharmony_ci if (err) { 242e41f4b71Sopenharmony_ci console.error(`Failed to back up data. Code:${err.code},message:${err.message}`); 243e41f4b71Sopenharmony_ci return; 244e41f4b71Sopenharmony_ci } 245e41f4b71Sopenharmony_ci console.info('Succeeded in backing up data.'); 246e41f4b71Sopenharmony_ci }) 247e41f4b71Sopenharmony_ci } 248e41f4b71Sopenharmony_ci ``` 249e41f4b71Sopenharmony_ci 250e41f4b71Sopenharmony_ci4. Use **delete()** to delete data to simulate unexpected deletion or data tampering. 251e41f4b71Sopenharmony_ci 252e41f4b71Sopenharmony_ci ```ts 253e41f4b71Sopenharmony_ci let predicates = new relationalStore.RdbPredicates('EMPLOYEE'); 254e41f4b71Sopenharmony_ci predicates.equalTo('NAME', 'Lisa'); 255e41f4b71Sopenharmony_ci if(store != undefined) { 256e41f4b71Sopenharmony_ci (store as relationalStore.RdbStore).delete(predicates).then((rows: number) => { 257e41f4b71Sopenharmony_ci console.info(`Delete rows: ${rows}`); 258e41f4b71Sopenharmony_ci }).catch((err: BusinessError) => { 259e41f4b71Sopenharmony_ci console.error(`Failed to delete data. Code:${err.code},message:${err.message}`); 260e41f4b71Sopenharmony_ci }) 261e41f4b71Sopenharmony_ci } 262e41f4b71Sopenharmony_ci ``` 263e41f4b71Sopenharmony_ci 264e41f4b71Sopenharmony_ci5. Use **restore()** to restore the RDB store. 265e41f4b71Sopenharmony_ci 266e41f4b71Sopenharmony_ci ```ts 267e41f4b71Sopenharmony_ci if(store != undefined) { 268e41f4b71Sopenharmony_ci (store as relationalStore.RdbStore).restore('dbBackup.db', (err) => { 269e41f4b71Sopenharmony_ci if (err) { 270e41f4b71Sopenharmony_ci console.error(`Failed to restore data. Code:${err.code},message:${err.message}`); 271e41f4b71Sopenharmony_ci return; 272e41f4b71Sopenharmony_ci } 273e41f4b71Sopenharmony_ci console.info('Succeeded in restoring data.'); 274e41f4b71Sopenharmony_ci }) 275e41f4b71Sopenharmony_ci } 276e41f4b71Sopenharmony_ci ``` 277