1# 数据库备份与恢复 2 3 4## 场景介绍 5 6当应用在处理一项重要的操作,显然是不能被打断的。例如:写入多个表关联的事务。此时,每个表的写入都是单独的,但是表与表之间的事务关联性不能被分割。 7 8如果操作的过程中出现问题,开发者可以使用恢复功能,将数据库恢复到之前的状态,重新对数据库进行操作。 9 10在数据库被篡改、删除、或者设备断电场景下,数据库可能会因为数据丢失、数据损坏、脏数据等而不可用,可以通过数据库的备份恢复能力将数据库恢复至可用状态。 11 12 13键值型数据库和关系型数据库均支持对数据库的备份和恢复。另外,键值型数据库还支持删除数据库备份,以释放本地存储空间。 14 15 16## 键值型数据库备份、恢复与删除 17 18键值型数据库,通过backup接口实现数据库备份,通过restore接口实现数据库恢复,通过deletebackup接口删除数据库备份。具体接口及功能,可见[分布式键值数据库](../reference/apis/js-apis-distributedKVStore.md)。 19 201. 创建数据库。 21 22 (1) 创建kvManager。 23 24 (2) 配置数据库参数。 25 26 (3) 创建kvStore。 27 28 29 ```js 30 import distributedKVStore from '@ohos.data.distributedKVStore'; 31 32 let kvManager; 33 let context = getContext(this); 34 const kvManagerConfig = { 35 context: context, 36 bundleName: 'com.example.datamanagertest' 37 } 38 try { 39 kvManager = distributedKVStore.createKVManager(kvManagerConfig); 40 console.info('Succeeded in creating KVManager.'); 41 } catch (e) { 42 console.error(`Failed to create KVManager. Code:${e.code},message:${e.message}`); 43 } 44 let kvStore; 45 try { 46 const options = { 47 createIfMissing: true, 48 encrypt: false, 49 backup: false, 50 autoSync: true, 51 kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, 52 securityLevel: distributedKVStore.SecurityLevel.S2 53 }; 54 kvManager.getKVStore('storeId', options, (err, store) => { 55 if (err) { 56 console.error(`Fail to get KVStore. Code:${err.code},message:${err.message}`); 57 return; 58 } 59 console.info('Succeeded in getting KVStore.'); 60 kvStore = store; 61 }); 62 } catch (e) { 63 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 64 } 65 ``` 66 672. 使用put()方法插入数据。 68 69 ```js 70 const KEY_TEST_STRING_ELEMENT = 'key_test_string'; 71 const VALUE_TEST_STRING_ELEMENT = 'value_test_string'; 72 try { 73 kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => { 74 if (err !== undefined) { 75 console.error(`Fail to put data. Code:${err.code},message:${err.message}`); 76 return; 77 } 78 console.info('Succeeded in putting data.'); 79 }); 80 } catch (e) { 81 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 82 } 83 ``` 84 853. 使用backup()方法备份数据。 86 87 ```js 88 let file = 'BK001'; 89 try { 90 kvStore.backup(file, (err) => { 91 if (err) { 92 console.error(`Fail to backup data.code:${err.code},message:${err.message}`); 93 } else { 94 console.info('Succeeded in backupping data.'); 95 } 96 }); 97 } catch (e) { 98 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 99 } 100 ``` 101 1024. 使用delete()方法删除数据(模拟意外删除、篡改场景)。 103 104 ```js 105 try { 106 kvStore.delete(KEY_TEST_STRING_ELEMENT, (err) => { 107 if (err !== undefined) { 108 console.error(`Fail to delete data. Code:${err.code},message:${err.message}`); 109 return; 110 } 111 console.info('Succeeded in deleting data.'); 112 }); 113 } catch (e) { 114 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 115 } 116 ``` 117 1185. 使用restore()方法恢复数据。 119 120 ```js 121 let file = 'BK001'; 122 try { 123 kvStore.restore(file, (err) => { 124 if (err) { 125 console.error(`Fail to restore data. Code:${err.code},message:${err.message}`); 126 } else { 127 console.info('Succeeded in restoring data.'); 128 } 129 }); 130 } catch (e) { 131 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 132 } 133 ``` 134 1356. 当本地设备存储空间有限或需要重新备份时,还可使用deleteBackup()方法删除备份,释放存储空间。 136 137 ```js 138 let kvStore; 139 let files = ['BK001']; 140 try { 141 kvStore.deleteBackup(files).then((data) => { 142 console.info(`Succeed in deleting Backup. Data:filename is ${data[0]},result is ${data[1]}.`); 143 }).catch((err) => { 144 console.error(`Fail to delete Backup. Code:${err.code},message:${err.message}`); 145 }) 146 } catch (e) { 147 console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`); 148 } 149 ``` 150 151 152## 关系型数据库备份与恢复 153 154关系型数据库,通过backup接口实现数据库备份,通过restore接口实现数据库恢复。具体接口及功能,可见[关系型数据库](../reference/apis/js-apis-data-relationalStore.md)。 155 1561. 使用getRdbStore()方法创建关系型数据库。 157 158 ```js 159 import relationalStore from '@ohos.data.relationalStore'; 160 161 let store; 162 let context = getContext(this); 163 const STORE_CONFIG = { 164 name: 'RdbTest.db', 165 securityLevel: relationalStore.SecurityLevel.S1 166 }; 167 relationalStore.getRdbStore(context, STORE_CONFIG, (err, rdbStore) => { 168 store = rdbStore; 169 if (err) { 170 console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`); 171 return; 172 } 173 store.executeSql("CREATE TABLE IF NOT EXISTS EMPLOYEE (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary INTEGER, codes Uint8Array);", null); 174 console.info('Succeeded in getting RdbStore.'); 175 }) 176 ``` 177 1782. 使用insert()方法插入数据。 179 180 ```js 181 const valueBucket = { 182 'NAME': 'Lisa', 183 'AGE': 18, 184 'SALARY': 100.5, 185 'CODES': new Uint8Array([1, 2, 3, 4, 5]) 186 }; 187 store.insert('EMPLOYEE', valueBucket, relationalStore.ConflictResolution.ON_CONFLICT_REPLACE, (err, rowId) => { 188 if (err) { 189 console.error(`Failed to insert data. Code:${err.code},message:${err.message}`); 190 return; 191 } 192 console.info(`Succeeded in inserting data. rowId:${rowId}`); 193 }) 194 ``` 195 1963. 使用backup()方法备份数据。 197 198 ```js 199 store.backup('dbBackup.db', (err) => { 200 if (err) { 201 console.error(`Failed to backup data. Code:${err.code},message:${err.message}`); 202 return; 203 } 204 console.info(`Succeeded in backuping data.`); 205 }) 206 ``` 207 2084. 使用delete()方法删除数据(模拟意外删除、篡改场景)。 209 210 ```js 211 let predicates = new relationalStore.RdbPredicates('EMPLOYEE'); 212 predicates.equalTo('NAME', 'Lisa'); 213 let promise = store.delete(predicates); 214 promise.then((rows) => { 215 console.info(`Delete rows: ${rows}`); 216 }).catch((err) => { 217 console.error(`Failed to delete data. Code:${err.code},message:${err.message}`); 218 }) 219 ``` 220 2215. 使用restore()方法恢复数据。 222 223 ```js 224 store.restore('dbBackup.db', (err) => { 225 if (err) { 226 console.error(`Failed to restore data. Code:${err.code},message:${err.message}`); 227 return; 228 } 229 console.info(`Succeeded in restoring data.`); 230 }) 231 ``` 232