数据库备份和恢复

1). 函数sqlite3_backup_init()用于创建sqlite3_backup对象,该对象将作为本次拷贝操作的句柄传给其余两个函数。
2). 函数sqlite3_backup_step()用于数据拷贝,如果该函数的第二个参数为-1,那么整个拷贝过程都将在该函数的一次调用中完成。
3). 函数sqlite3_backup_finish()用于释放sqlite3_backup_init()函数申请的资源,以避免资源泄露。

下面是备份和恢复的接口函数
 1 /**********************************************************************
 2 * 函数名称:loadOrSaveDb
 3 * 功能描述:数据库备份与恢复(一次性拷贝完)
 4 * 输入参数:pInMemory指向内存数据库指针
 5 *          zFilename: 指向文件数据库目录的字符串指针
 6 *          isSave  0: 从文件数据库载入到内存数据库
 7                    1:从内存数据库备份到文件数据库
 8 * 输出参数:无
 9 * 返 回 值:     状态码
10 * 其它说明:
11 ***********************************************************************/
12 int loadOrSaveDb(sqlite3 *pInMemeory, const char *zFilename, int isSave)
13 {
14     int rc;
15     sqlite3 *pFile;
16     sqlite3_backup *pBackup;
17     sqlite3 *pTo;
18     sqlite3 *pFrom;
19     rc = sqlite3_open(zFilename, &pFile);
20     if(rc == SQLITE_OK)
21     {
22         pFrom = (isSave?pInMemeory:pFile);
23         pTo = (isSave?pFile:pInMemeory);
24         pBackup = sqlite3_backup_init(pTo,"main",pFrom,"main");
25         if(pBackup)
26         {
27             (void)sqlite3_backup_step(pBackup,-1);
28             (void)sqlite3_backup_finish(pBackup);
29         }
30         rc = sqlite3_errcode(pTo);
31     }
32 
33     (void)sqlite3_close(pFile);
34 
35     return rc;
36 }

 

数据库的恢复策略:首先检测数据库是否损坏,是则进行恢复
 1 #define DB_PATH  数据库路径
 2 #define DB_BACKUP_PATH  备份路径
 3  
 4 void recoveryDB(void)
 5 {
 6  
 7     int ret = 0;
 8 
 9     sqlite3 *memoryDb;
10 
11     ret = sqlite3_open(DB_PATH, &memoryDb);
12 
13     ret = IntegrityCheck(DB_PATH);
14 
15     if(ret != 0)
16     {
17         loadOrSaveDb(memoryDb, DB_BACKUP_PATH,0); //进行数据库恢复,必须有备份好得数据库
18     }
19 }

 

posted @ 2023-01-31 14:15  dhhu007  阅读(95)  评论(0编辑  收藏  举报