博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据库】sqlite3数据库备份、导出方法汇总
阅读量:4262 次
发布时间:2019-05-26

本文共 3727 字,大约阅读时间需要 12 分钟。

目录

1、直接拷贝数据库

这是最直接、最简单的方法:在linux下用cp直接拷贝数据库,win下直接复制粘贴。

2、使用.backup .clone

1)交互式

在终端上执行[ sqlite3 数据库文件名],进入sqlite环境,然后可以使用.backup .clone备份或克隆数据库。(注:如果新数据库已经存在,克隆时会报错,而备份不会)

$ sqlite3sqlite> .help.backup ?DB? FILE        Backup DB (default "main") to FILE....clone NEWDB             Clone data into NEWDB from the existing database...
2)脚本

可以使用shell脚本执行,这样就能在程序中调用脚本,自动执行。

$ cat sqlte3Backup.sh #!/bin/basholdDB=$1newDB=$2echo ".backup $newDB" | sqlite3 $oldDB

3、导出到csv文件中(其它格式类似)

可以使用select筛选出指定信息,保存到csv中

1)交互式
$ sqlite3 数据库文件名sqlite> .headers on	// 显示列表头,否则在csv中没有表头sqlite> .mode csv	// 选择csv(逗号分隔值类型)sqlite> .once test.csv	// 将下面的SQL语句输出保存到文件中,只保存一次,						// 第二个SQL会恢复输出到终端。sqlite> SELECT * FROM 表;sqlite> .exit;
2)脚本
$ cat sqlte3ToCSV.sh #!/bin/bashfileName=$1dbName=$2echo ".headers on.mode csv.once $fileNameselect * from test;.exit" | sqlite3 $dbName
3)导出成其它格式汇总
a> .mode ascii
id^_name^_age^^1^_XiaoHong^_18^^2^_XiaoMing^_19^^
b> .mode column
id          name        age       ----------  ----------  ----------1           XiaoHong    18        2           XiaoMing    19
c> .mode html
idnameage1XiaoHong182XiaoMing19
d> .mode insert
INSERT INTO "table"(id,name,age) VALUES(1,'XiaoHong',18);INSERT INTO "table"(id,name,age) VALUES(2,'XiaoMing',19);
e> .mode line
id = 1 name = XiaoHong  age = 18   id = 2 name = XiaoMing  age = 19
f> .mode list
id|name|age1|XiaoHong|182|XiaoMing|19
g> .mode tabs
id	name	age1	XiaoHong	182	XiaoMing	19
h> .mode tcl
"id" "name" "age""1" "XiaoHong" "18""2" "XiaoMing" "19"

4、使用SQL语句:VACUUM INTO

注意:这种方法对SQLite版本有要求,SQLite 版本至少3.27.0 (2019-02-07)

1)交互式
$ sqlite3 数据库文件名sqlite> VACUUM INTO 新数据库文件名 // VACUUM 后面省略了数据库名,默认是main, 使用.database查看sqlite> .exit;
2)脚本
$ cat sqlte3Vacuum.sh#!/bin/basholdDB=$1newDB=$2echo "vacuum into '$newDB'" | sqlite3 $oldDB
3)在SQLite提供的C接口中使用SQL语句:vacuum into

注意:如果新数据库存在,使用VACUUM INTO会报错

error: output file already exists!

测试程序如下:

int main(){
sqlite3 *pDB; int rc = sqlite3_open("test.db", &pDB); if( rc==SQLITE_OK ){
printf("open test.db OK!\n"); char *sqlVacuum = "VACUUM INTO 'new.db';"; char *errMsg = 0; rc = sqlite3_exec(pDB, sqlVacuum, NULL, 0, &errMsg); if( rc!=SQLITE_OK ){
printf("VACUUM INTO new.db error: %s!\n", errMsg); sqlite3_free(errMsg); } else {
printf("VACUUM INTO new.db OK!\n"); } } else {
printf("open test.db error!\n"); } sqlite3_close(pDB); return 0;}

5、使用SQLite C接口sqlite3_backup*

涉及的接口如下:

sqlite3_backup_init()sqlite3_backup_step()sqlite3_backup_remaining()sqlite3_backup_pagecount()sqlite3_backup_finish()

测试程序如下:

#include 
#include
void progress(int left, int total){
printf("total = %d; left = %d\n", total, left);}int backupDb(sqlite3 *pDb, const char *zFilename, void(*xProgress)(int, int) ){
int rc; sqlite3 *pFile; sqlite3_backup *pBackup; rc = sqlite3_open(zFilename, &pFile); if( rc==SQLITE_OK ){
pBackup = sqlite3_backup_init(pFile, "main", pDb, "main"); if( pBackup ){
do {
rc = sqlite3_backup_step(pBackup, 5); xProgress( sqlite3_backup_remaining(pBackup), sqlite3_backup_pagecount(pBackup) );// if( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
// sqlite3_sleep(250);// } } while( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED ); (void)sqlite3_backup_finish(pBackup); } rc = sqlite3_errcode(pFile); } (void)sqlite3_close(pFile); return rc;}int main(){
sqlite3 *pDB; int rc = sqlite3_open("test.db", &pDB); if( rc==SQLITE_OK ){
printf("open test.db OK!\n"); rc = backupDb(pDB, "new.db", progress); if( rc==SQLITE_OK ){
printf("backupDb new.db OK!\n"); } else {
printf("backupDb new.db error!\n"); } } else {
printf("open test.db error!\n"); } sqlite3_close(pDB); return 0;}

转载地址:http://bdmei.baihongyu.com/

你可能感兴趣的文章
【数据结构与算法】(四) c 语言静态队列的简单实现
查看>>
[linux] unix domain socket 例子
查看>>
[linux] c 实现简单的web服务器
查看>>
栈--判断回文字符串
查看>>
解决 The `master` repo requires CocoaPods 1.0.0 - (currently using 0.39.0)
查看>>
gdb调试常用命令
查看>>
vim正则表达式批量修改文本
查看>>
【Lintcode】寻找峰值
查看>>
Arduino 串口读写 SD 卡模块
查看>>
基于Flink+ClickHouse打造轻量级点击流实时数仓
查看>>
Flink sink schema 字段设计小技巧
查看>>
Flink 使用 union 代替 join 和 cogroup
查看>>
踩坑记 | Flink 天级别窗口中存在的时区问题
查看>>
用了 History Server,妈妈再也不用担心我的 Flink 作业半夜挂了
查看>>
强烈推荐三本 Spark 新书籍
查看>>
ClickHouse 如何玩转时序数据
查看>>
Flink 在腾讯视频的应用实践
查看>>
Flink SQL 1.11 on Zeppelin 平台化实践
查看>>
通过项目逐步深入了解Mybatis<三>
查看>>
奇怪的Java题:为什么128 == 128返回为False,而127 == 127会返回为True?
查看>>