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