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 ```