数据库备份和恢复
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 }