ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

sqlite 内存模式存盘

2022-07-19 20:04:35  阅读:328  来源: 互联网

标签:sqlite 数据库 db 存盘 内存 memory sqlite3 backup


https://database.guide/3-ways-to-backup-sqlite-database/
https://www.w3cschool.cn/doc_sqlite/sqlite-backup.html
https://sqlite.org/backup.html
http://www.sqlite.org/c3ref/backup_finish.html
https://blog.csdn.net/u010168781/article/details/103311340
https://zditect.com/main-advanced/database/sqlite_backup_a_database_to_file.html
https://cloud.tencent.com/developer/news/416062 共享

sqlite> .mode list
sqlite> .stats on
sqlite> .timer on
sqlite> .open test.db
sqlite> select * from tripsummary;

https://blog.51cto.com/u_47917/1398914

不能追加 纯纯的备份

int SQLite3Backup(sqlite3* src_db, sqlite3* dest_db)
{
int rc = SQLITE_ERROR;
sqlite3_backup* db_backup = sqlite3_backup_init(dest_db, "main", src_db, "main");
if(NULL !=db_backup)
{
rc = sqlite3_backup_step(db_backup, -1);
rc = sqlite3_backup_finish(db_backup);
}
return rc;
}

// Open memory database
sqlite3* memory_db;
rc = sqlite3_open(":memory:", &memory_db);

// Open file database
sqlite3* file_db;
rc = sqlite3_open(file_name, &file_db);

// Dump memory database to file
SQLite3Backup(memory_db, file_db);

// Load file database to memory
SQLite3Backup(file_db, memory_db);

sqlite3内存数据库与文件数据库的应用总结
C代码
实现思路:
1.创建文件数据库;
2.创建内存数据库;
3.创建文件数据库表格;
4.创建内存数据库表格(和文件数据表格一致);
5.内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见;
6.将数据写入内存数据表格中;

使用过程中  可以对现有数据库追加  未测试 超级大表追加保存性能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"

int main(int argc, const char *argv[])
{
	sqlite3 * filedb=NULL;/*文件数据库描述符指针*/
	sqlite3 * memdb=NULL;/*内存数据库描述符指针*/
	char sqlcmd[512]  =  {0};
	char *errMsg = 0;
	unsigned int i=0;
	char path[50]="/mnt/usb1/test.db";

	while(1)
	{
		//创建文件数据库;
		if(sqlite3_open(path,&filedb) != SQLITE_OK)
		{
			printf("%s\n",sqlite3_errmsg(filedb));
			exit(-1);
		}
		else
		{
			printf("filedb open %s success\n",path);
		}
		//创建内存数据库;
		if (SQLITE_OK  != sqlite3_open(":memory:", &memdb))
		{
			printf("%s\n",sqlite3_errmsg(memdb));
			exit(-1);
		}
		else
		{
			printf("memdb open %s success\n",path);
		}

		//创建数据表,包括内存数据库中和文件数据库中,文件数据库、内存数据库的表结构需要一致。
		sprintf(sqlcmd, "CREATE TABLE testTable(ID TEXT,value);") ;
		if(sqlite3_exec(filedb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("filedb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("filedb creat table suc\n");
		}
		sqlite3_free(errMsg);

		if(sqlite3_exec( memdb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("memdb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("memdb creat table suc\n");
		}
		sqlite3_free(errMsg);


		//内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见;
		snprintf(sqlcmd, sizeof(sqlcmd), "ATTACH '%s' AS %s", path, "filedb");

		if (SQLITE_OK != sqlite3_exec(memdb, sqlcmd, 0, 0, &errMsg))
		{
			printf("Failed to attach, err msg:%s\n",errMsg);
			sqlite3_free(errMsg);
		}
		else
		{
			printf("attach successfully\n");
		}
		sqlite3_free(errMsg);

		//将数据插入内存数据库中
		for(i=0;i<100;i++)
		{
			sprintf(sqlcmd, "INSERT INTO testTable VALUES (%s,%d);","1234",i);  //reset
			if(sqlite3_exec(memdb, sqlcmd, 0, 0, &errMsg) != SQLITE_OK)
			{
				printf("insert err:%s\n",errMsg);
				exit(-1);
			}
			sqlite3_free(errMsg);
		}

		//定时将内存数据库中的内容flush到文件数据库。
		if (SQLITE_OK != sqlite3_exec(memdb, "INSERT OR REPLACE INTO filedb.testTable SELECT * FROM testTable;", 0, 0, &errMsg))
		{
			printf("sync err msg:%s\n",&errMsg);
		}
		else
		{
			printf("sync suc\n");
		}
		sqlite3_free(errMsg);
		//删除内存数据库中的内容
		if (SQLITE_OK != sqlite3_exec(memdb,"DELETE FROM testTable;",0,0,&errMsg))
		{
			printf("delete err:%s\n",errMsg);
		}
		else
		{
			printf("delete suc\n");
		}
		sqlite3_free(errMsg);
		sqlite3_close(memdb);
		sqlite3_close(filedb);
		exit(0);
	}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"

int SQLite3Backup(sqlite3* src_db, sqlite3* dest_db)
{
int rc = SQLITE_ERROR;
sqlite3_backup* db_backup = sqlite3_backup_init(dest_db, "main", src_db, "main");
if(NULL !=db_backup)
{
rc = sqlite3_backup_step(db_backup, -1);
rc = sqlite3_backup_finish(db_backup);
}
return rc;
}

int main(int argc, const char *argv[])
{
	sqlite3 * filedb=NULL;/*文件数据库描述符指针*/
	sqlite3 * memdb=NULL;/*内存数据库描述符指针*/
	char sqlcmd[512]  =  {0};
	char *errMsg = 0;
	unsigned int i=0;
	char path[50]="/home/make1/test.db";

	while(1)
	{
		//创建文件数据库;
		if(sqlite3_open(path,&filedb) != SQLITE_OK)
		{
			printf("%s\n",sqlite3_errmsg(filedb));
			exit(-1);
		}
		else
		{
			printf("filedb open %s success\n",path);
		}
		//创建内存数据库;
		if (SQLITE_OK  != sqlite3_open(":memory:", &memdb))
		{
			printf("%s\n",sqlite3_errmsg(memdb));
			exit(-1);
		}
		else
		{
			printf("memdb open %s success\n",path);
		}

		//创建数据表,包括内存数据库中和文件数据库中,文件数据库、内存数据库的表结构需要一致。
		sprintf(sqlcmd, "CREATE TABLE testTable(ID TEXT,value);") ;
		if(sqlite3_exec(filedb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("filedb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("filedb creat table suc\n");
		}
		sqlite3_free(errMsg);

		if(sqlite3_exec( memdb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("memdb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("memdb creat table suc\n");
		}
		sqlite3_free(errMsg);

		//将数据插入内存数据库中
		for(i=500;i<600;i++)
		{
			sprintf(sqlcmd, "INSERT INTO testTable VALUES (%s,%d);","1234",i);  //reset
			if(sqlite3_exec(memdb, sqlcmd, 0, 0, &errMsg) != SQLITE_OK)
			{
				printf("insert err:%s\n",errMsg);
				exit(-1);
			}
			sqlite3_free(errMsg);
		}
		SQLite3Backup(memdb,filedb);//new

		//删除内存数据库中的内容
		if (SQLITE_OK != sqlite3_exec(memdb,"DELETE FROM testTable;",0,0,&errMsg))
		{
			printf("delete err:%s\n",errMsg);
		}
		else
		{
			printf("delete suc\n");
		}
		sqlite3_free(errMsg);
		sqlite3_close(memdb);
		sqlite3_close(filedb);
		exit(0);
	}
}

https://cloud.tencent.com/developer/news/416062
SQLite 如何变成 内存数据库

SQLite数据库通常存储在单个普通磁盘文件中。但是,在某些情况下,数据库可能存储在内存中。

强制SQLite数据库单纯的存在于内存中的最常用方法是使用特殊文件名“:memory:” 打开数据库。换句话说,不是将真实磁盘文件的名称传递给sqlite3_open(),sqlite3_open16()或 sqlite3_open_v2()函数之一,而是传入字符串“:memory:”。例如:

rc = sqlite3_open(“:memory:”,&db);

调用此接口完成后,不会打开任何磁盘文件。而是在内存中创建一个新的数据库。数据库连接关闭后,数据库就不再存在。每一个memory数据库彼此不同。因此,打开两个数据库连接,每个数据库连接的文件名为“:memory:”,将创建两个独立的内存数据库。

特殊文件名“:memory:”可用于允许数据库文件名的任何位置。例如,它可以被用作文件名中的ATTACH命令:

ATTACH DATABASE ':memory:' AS aux1;

请注意,为了应用特殊的“:memory:”名称并创建纯内存数据库,文件名中不能有其他文本。因此,可以通过添加路径名在文件中创建基于磁盘的数据库,如下所示:"./:memory:"。

使用URI文件名时,特殊的“:memory:”文件名也可以使用。例如:

rc = sqlite3_open(“file :: memory:”,&db);

要么,

ATTACH DATABASE 'file::memory:' AS aux1;

内存数据库和共享缓存

如果使用URI文件名打开内存数据库,则允许它们使用共享缓存。如果使用未加修饰的“:memory:”名称来指定内存数据库,那么该数据库始终具有专用高速缓存,并且仅对最初打开它的数据库连接可见。但是,可以通过两个或多个数据库连接打开相同的内存数据库,如下所示:

rc = sqlite3_open("file::memory:?cache=shared", &db);

要么,

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;

这允许单独的数据库连接共享相同的内存数据库。当然,共享内存数据库的所有数据库连接都需要在同一个进程中。当数据库的最后一个连接关闭时,将自动删除数据库并回收内存。

如果在单个进程中需要两个或多个不同同时可共享的内存数据库,则mode = memory查询参数可与URI文件名一起使用以创建命名的内存数据库:

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);

要么,

ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;

当以这种方式命名内存数据库时,它将仅与使用完全相同名称的另一个连接共享其缓存。

临时数据库

当传递给sqlite3_open()或 ATTACH的数据库文件的名称是空字符串时,则会创建一个新的临时文件来保存数据库。

rc = sqlite3_open("", &db);

ATTACH DATABASE '' AS aux2;

每次都会创建一个不同的临时文件,因此就像使用特殊的“:memory:”字符串一样,两个到临时数据库的数据库连接都有自己的私有数据库。创建它们的连接关闭时,将自动删除临时数据库。

即使为每个临时数据库分配了磁盘文件,实际上临时数据库通常驻留在内存中的pager缓存中,因此“:memory:”创建的纯内存数据库与临时数据库之间的差别很小。由空文件名创建。唯一的区别是“:memory:”数据库必须始终保留在内存中,而如果数据库变大或SQLite受到内存压力,临时数据库的某些部分可能会刷新到磁盘。

前面的段落描述了默认SQLite配置下临时数据库的行为。如果需要,应用程序可以使用 temp_store编译指示和SQLITE_TEMP_STORE编译时参数来强制临时数据库表现为纯内存数据库。

标签:sqlite,数据库,db,存盘,内存,memory,sqlite3,backup
来源: https://www.cnblogs.com/marklove/p/16495416.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有