关闭SQLite3中的journal暂存档
2015-12-19 15:10
253 查看
最近经常碰到类似的sqlite文件损坏的问题,由于使用的是非WAL模式,而且是PRAGMA journal_mode = DELETE。对于这种临时的备份文件如何影响的,这里摘一篇作为资料收集。
摘自:http://www.it165.net/database/html/201310/4691.html
相信很多使用SQLite3当做数据库的人都会一个现象,那就是当SQLite3有做写入的动作时,SQLite3会自动产生一个名为"数据库名称-journal"的暂存档。这是做什么用的呢?
答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有journal档案的存在,便会对数据库做Rollback 动作(还原)(详细内容:http://www.sqlite.org/atomiccommit.html)。但是有时候系统(主机)电力不稳或突然断电会导致journal档案损毁,因而造成SQLite数据库无法开启[问题1]。必须(手动)删除journal档案,SQLite数据库才能再度开启。
目前所知的方法有两种:
第一种方法:
在系统开机后第一次开启或每一次使用SQLite数据库时,先检查是否已经存在journal档案了,如果是则透过程序自动去删除该journal档案。
但是这有个问题,因为自动删除该journal档案,导致没有Rollback (还原)作用,无法保障数据完整与一致性。缺点二:有时候会发生程序无法自动删除(如:journal档案严重损毁),而导致上面的问题(无法开启数据库)[问题1]再度发生。
第二种方法:
使用"PRAGMA journal_mode = OFF"指令,这个指令能关闭自动产生journal暂存档动作。
但是如此一来当在写入数据库的过程,一旦发生意外状况,将会导致SQLite数据库无法保障数据完整与一致性。缺点二:journal_mode设定为OFF时,无法使用交易模式(Transaction)进行操作。
第二种方法的缺点二在如果需要使用交易模式(Transaction)进行操作时,可以透过"PRAGMA journal_mode = DELETE"指令,修改回原本的journal模式(journal_mode),就可以使用交易模式(Transaction)。
view
sourceprint?
摘自:http://www.it165.net/database/html/201310/4691.html
相信很多使用SQLite3当做数据库的人都会一个现象,那就是当SQLite3有做写入的动作时,SQLite3会自动产生一个名为"数据库名称-journal"的暂存档。这是做什么用的呢?
答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有journal档案的存在,便会对数据库做Rollback 动作(还原)(详细内容:http://www.sqlite.org/atomiccommit.html)。但是有时候系统(主机)电力不稳或突然断电会导致journal档案损毁,因而造成SQLite数据库无法开启[问题1]。必须(手动)删除journal档案,SQLite数据库才能再度开启。
目前所知的方法有两种:
第一种方法:
在系统开机后第一次开启或每一次使用SQLite数据库时,先检查是否已经存在journal档案了,如果是则透过程序自动去删除该journal档案。
但是这有个问题,因为自动删除该journal档案,导致没有Rollback (还原)作用,无法保障数据完整与一致性。缺点二:有时候会发生程序无法自动删除(如:journal档案严重损毁),而导致上面的问题(无法开启数据库)[问题1]再度发生。
第二种方法:
使用"PRAGMA journal_mode = OFF"指令,这个指令能关闭自动产生journal暂存档动作。
但是如此一来当在写入数据库的过程,一旦发生意外状况,将会导致SQLite数据库无法保障数据完整与一致性。缺点二:journal_mode设定为OFF时,无法使用交易模式(Transaction)进行操作。
第二种方法的缺点二在如果需要使用交易模式(Transaction)进行操作时,可以透过"PRAGMA journal_mode = DELETE"指令,修改回原本的journal模式(journal_mode),就可以使用交易模式(Transaction)。
view
sourceprint?
01.
//请先引用 using System.Data.SQLite;
02.
03.
const
string
path = @
"C:\testDB.db3"
;
04.
if
(File.Exists(path))
//判断档案是否存在。是
05.
{
06.
File.Delete(path);
07.
}
08.
09.
SQLiteConnection.CreateFile(path);
//建立SQLite数据库档案
10.
11.
using
(SQLiteConnection conn =
new
SQLiteConnection(
"Data Source="
+ path +
";Version=3;"
))
//建立联机
12.
{
13.
14.
using
(SQLiteCommand comm = conn.CreateCommand())
15.
{
16.
conn.Open();
//开启数据库
17.
18.
comm.CommandText =
"PRAGMA journal_mode=Off;"
;
//journal mode 设定为 OFF(关闭journal模式)
19.
comm.ExecuteNonQuery();
20.
//---下面便只能以journal_mode=Off方式,进行操作-----
21.
22.
//---做一些操作-------------------------------------
23.
comm.CommandText =
"CREATE TABLE text_table(id int, value text);"
;
//建立'text_table'数据表
24.
comm.ExecuteNonQuery();
25.
26.
for
(
int
i = 0; i < 10; ++i)
27.
{
28.
//新增一笔(列)数据到数据表
29.
comm.CommandText =
"Insert INTO text_table (id, value) VALUES (0, 'Hello World')"
;
30.
comm.ExecuteNonQuery();
31.
}
32.
//---------------------------------------------------
33.
}
34.
}
相关文章推荐
- MySQL学习总结
- mybatis-generator相关问题
- Golang SQL Server 数据库 stmt使用
- PHP程序中使用adodb连接不同数据库的代码实例
- 用BCP命令将TSV,CSV等包含日期数据的字段导入SqlServer数据库
- 数据库DDL语句
- mysql 排序 /tmp被撑爆
- mysql创建数据库和删除数据库
- 深入解析MySQL的事务隔离及其对性能产生的影响
- Mongodb的安装(Mac)以及相关宝贵资料
- mysql 的 find_in_set函数使用方法
- 新版数据库分页方法(Sql server2012)
- golang SQLDriverConnect: {IM005} [Microsoft][ODBC 驱动程序管理器] 驱动程序的 SQLAllocHandle on SQL_HANDLE_DBC 失败
- 数据库_Mysql_mysql中char,varchar与text类型的区别和选用
- redis String类型的操作
- Oracle归档日志总结
- redis中key的操作和数据库的选择
- Redis配置集群二(window)
- 《Sams Teach Yourself SQL in 10 Minutes》学习笔记
- Oracle中是用case...when语句进行判断