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