• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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