SQLite教程(十一):临时文件


本文整理自网络,侵删。

一、简介:

    尽管SQLite的数据库是由单一文件构成,然而事实上在SQLite运行时却存在着一些隐含的临时文件,这些临时文件是出于不同的目的而存在的,对于开发者而言,它们是透明的,因此在开发的过程中我们并不需要关注它们的存在。尽管如此,如果能对这些临时文件的产生机制和应用场景有着很好的理解,那么对我们今后应用程序的优化和维护都是极有帮助的。在SQLite中主要产生以下七种临时文件,如:

    1). 回滚日志。
    2). 主数据库日志。
    3). SQL语句日志。
    4). 临时数据库文件。
    5). 视图和子查询的临时持久化文件。
    6). 临时索引文件。
    7). VACUUM命令使用的临时数据库文件。
   
二、具体说明:

    1. 回滚日志:

    SQLite为了保证事物的原子性提交和回滚,在事物开始时创建了该临时文件。此文件始终位于和数据库文件相同的目录下,其文件名格式为: 数据库文件名 + "-journal"。换句话说,如果没有该临时文件的存在,当程序运行的系统出现任何故障时,SQLite将无法保证事物的完整性,以及数据状态的一致性。该文件在事物提交或回滚后将被立刻删除。

    在事物运行期间,如果当前主机因电源故障而宕机,而此时由于回滚日志文件已经保存在磁盘上,那么当下一次程序启动时,SQLite在打开数据库文件的过程中将会发现该临时文件的存在,我们称这种日志文件为"Hot Journal"。SQLite会在成功打开数据库之前先基于该文件完成数据库的恢复工作,以保证数据库的数据回复到上一个事物开始之前的状态。

    在SQLite中我们可以通过修改journal_mode pragma,而使SQLite对维护该文件采用不同的策略。缺省情况下该值为DELETE,即在事物结束后删除日志文件。而PERSIST选项值将不会删除日志文件,而是将回滚日志文件的头部清零,从而避免了文件删除所带的磁盘开销。再有就是OFF选项值,该值将指示SQLite在开始事物时不产生回滚日志文件,这样一旦出现系统故障,SQLite也无法再保障数据库数据的一致性。

    2. 主数据库日志:

    在SQLite中,如果事物的操作作用于多个数据库,即通过ATTACH命令附加到当前连接中的数据库,那么SQLite将生成主数据库日志文件以保证事物产生的改变在多个数据库之间保持原子性。和回滚日志文件一样,主数据库日志文件也位于当前连接中主数据库文件所处的目录内,其文件名格式为:主数据库文件名 + 随机的后缀。在该文件中,将包含所有当前事物将会改变的Attached数据库的名字。在事物被提交之后,此文件亦被SQLite随之删除。

    主数据库日志文件只有在某一事物同时操作多个数据库时(主数据库和Attached数据库)才有可能被创建。通过该文件,SQLite可以实现跨多个数据库的事物原子性,否则,只能简单的保证每个单一的数据库内的状态一致性。换句话说,如果该事物在执行的过程中出现系统崩溃或主机宕机的现象,在进行数据恢复时,若没有该文件的存在,将会导致部分SQLite数据库处于提交状态,而另外一部分则处于回滚状态,因此该事物的一致性将被打破。

    3. SQL语句日志:

    在一个较大的事物中,SQLite为了保证部分数据在出现错误时可以被正常回滚,所以在事物开始时创建了SQL语句日志文件。比如,update语句修改了前50条数据,然而在修改第51条数据时发现该操作将会破坏某字段的唯一性约束,最终SQLite将不得不通过该日志文件回滚已经修改的前50条数据。

    SQL语句日志文件只有在INSERT或UPDATE语句修改多行记录时才有可能被创建,与此同时,这些操作还极有可能会打破某些约束并引发异常。但是如果INSERT或UPDATE语句没有被包含在BEGIN...COMMIT中,同时也没有任何其它的SQL语句正在当前的连接上运行,在这种情况下,SQLite将不会创建SQL语句日志文件,而是简单的通过回滚日志来完成部分数据的UNDO操作。

    和上面两种临时文件不同的是,SQL语句日志文件并不一定要存储在和数据库文件相同的目录下,其文件名也是随机生成。该文件所占用的磁盘空间需要视UPDATE或INSERT语句将要修改的记录数量而定。在事物结束后,该文件将被自动删除。

    4. 临时数据库文件:

    当使用"CREATE TEMP TABLE"语法创建临时数据表时,该数据表仅在当前连接内可见,在当前连接被关闭后,临时表也随之消失。然而在生命期内,临时表将连同其相关的索引和视图均会被存储在一个临时的数据库文件之内。该临时文件是在第一次执行"CREATE TEMP TABLE"时即被创建的,在当前连接被关闭后,该文件亦将被自动删除。最后需要说明的是,临时数据库不能被执行DETACH命令,同时也不能被其它进程执行ATTACH命令。
   
    5. 视图和子查询的临时持久化文件:

阅读剩余部分

相关阅读 >>

android Sqlite基本用法详解

python使用sqlalchemy操作mysql

android开发教程之listview显示Sqlite数据

Sqlite教程(六):表达式详解

Sqlite时间戳转时间语句(时间转时间戳)

ios开发系列--详细介绍数据存取

详解android数据存储—使用Sqlite数据库

android bdflow数据库神器的使用

深入Sqlite多线程的使用总结详解

python sqlalchemy的mapping与declarative详解

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...