• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 数据库备份与恢复 (C/C++)
2<!--Kit: ArkData-->
3<!--Subsystem: DistributedDataManager-->
4<!--Owner: @baijidong-->
5<!--Designer: @widecode; @htt1997-->
6<!--Tester: @yippo; @logic42-->
7<!--Adviser: @ge-yafang-->
8
9## 场景介绍
10
11当应用在处理一项重要的操作,不能被打断的。例如:写入多个表关联的事务。此时,每个表的写入都是单独的,但是表与表之间的事务关联性不能被分割。
12
13如果操作过程中出现问题,使用恢复功能将数据库恢复到之前状态,重新操作数据库。
14
15在数据库被篡改、删除、或者设备断电场景下,数据库可能会因为数据丢失、数据损坏、脏数据等而不可用,可以通过数据库的备份恢复能力将数据库恢复至可用状态。
16
17当前仅支持使用关系型数据库(C/C++)进行备份与恢复。
18
19## 开发步骤
20
21数据库操作或者存储过程中,有可能会因为各种原因发生非预期的数据库异常的情况,可以根据需要使用关系型数据库的备份能力,以便在数据库异常时,可靠高效地恢复数据保证业务数据正常使用。
22
231. CMakeLists.txt中添加以下lib。
24
25    ```txt
26    libnative_rdb_ndk.z.so
27    ```
28
292. 导入头文件。
30
31    ```c
32    #include "database/rdb/relational_store.h"
33    ```
34
353. 调用OH_Rdb_Backup接口实现数据库备份。
36
37    ```c
38    OH_Rdb_ConfigV2* config = OH_Rdb_CreateConfig();
39    OH_Rdb_SetDatabaseDir(config, "/data/storage/el2/database");
40    OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL2);
41    OH_Rdb_SetStoreName(config, "RdbTest.db");
42    OH_Rdb_SetSecurityLevel(config, OH_Rdb_SecurityLevel::S3);
43    OH_Rdb_SetBundleName(config, "com.example.nativedemo");
44
45    int errCode = 0;
46    OH_Rdb_Store *store = OH_Rdb_CreateOrOpen(config, &errCode);
47
48    // 备份数据库
49    int result = OH_Rdb_Backup(store, "/data/storage/el2/database/RdbTest_bak.db");
50    OH_Rdb_CloseStore(store);
51    ```
52
534. 调用OH_Rdb_Restore接口实现数据库恢复。
54
55    ```c
56    OH_Rdb_ConfigV2* config2 = OH_Rdb_CreateConfig();
57    OH_Rdb_SetDatabaseDir(config2, "/data/storage/el2/database");
58    OH_Rdb_SetArea(config2, RDB_SECURITY_AREA_EL2);
59    OH_Rdb_SetStoreName(config2, "RdbRestoreTest.db");
60    OH_Rdb_SetSecurityLevel(config2, OH_Rdb_SecurityLevel::S3);
61    OH_Rdb_SetBundleName(config2, "com.example.nativedemo");
62    int errCode2 = 0;
63    OH_Rdb_Store *store2 = OH_Rdb_CreateOrOpen(config2, &errCode2);
64
65    // 恢复数据库
66    int result2 = OH_Rdb_Restore(store2, "/data/storage/el2/database/RdbTest_bak.db");
67    OH_Rdb_CloseStore(store2);
68    ```