SQLite现在使用7中临时文件
    Rollback journals
    Master journals
    Statement journals
    TEMP databases
    Materializations of views and subqueries
    Transient indices
    Transient databases used by VACUUM

1. Rollback journals
回滚日志文件,用于实现数据库的原子提交和回滚。 此文件和数据库文件总是在同一个目录,并且有相同的文件名,但是在文件名中添加了一个-journal 字符串。此文件一般在transaction开始时创建,transaction结束时删除。

如果系统crash,Rollback journals文件将被保留,下次打开数据库文件时,系统会检查有没有Rollback journals文件存在,如果有就用它来恢复数据库。

2种改变日志文件行为的方法
(1)PRAGMA locking_mode=EXCLUSIVE; 日志文件在第一个transaction开始时创建,但是不被删除,直到exclusive access mode is exited。
(2)修改journaling mode pragma的值,
相关命令
sqlite3>PRAGMA journal_mode;
sqlite3>PRAGMA database.journal_mode;
sqlite3>PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
sqlite3>PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
几个解释
(1)DELETE(默认值), 跟上面描述的一样,transaction结束时删除Rollback journals文件。
(2)TRUNCATE, transaction commit后不是delete ,而是truncate Rollback journals文件长度=0,在有些系统上truncate文件比delete快。
(3)PERSIST,不删除也不truncate,只讲文件头中长度设置为0
(4)MEMORY,将rollback journal存在volatile RAM内存中,避免了磁盘I/O, 牺牲了安全性和完整性,如果系统crash,数据库文件可能也crash
(5)WAL, 用write-ahead log代替rollback journal 来实现transactions atomic. A database in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later. 

更多关于WAL的可看这个连接 http://www.sqlite.org/wal.html
(5)OFF时,不创建日志文件,也就是说它不支持回滚


2. Master Journal Files
当一个transaction要作用于多个数据库时,SQLite会创建master hournal file, 用于实现多个数据库transaction的原子性。如果没有master journal file, transaction只能在单个数据库文件中保证原子性。 master journal file总是和数据库文件在同一个目录下。 当master journal file被删除时,transacton提交完成。

多个数据库使用ATTACH DATABASE命令被添加到一个database connection上的。
 
关于ATTACH DATABASE
语法: Attach [database] @filename as @inernal_db_name
几个解释
(1) ATTACH命令将一个database file添加到已有的database connection
(2) database 就是参数@filename, 特殊值, :memory表述内存数据库,  一个空字符串表述temporoary database
(3)attached database中表的使用,@inernal_db_name.table_name, 如果attached database中表名是唯一的,则可以省去“@inernal_db_name.”
(4) Transactions involving multiple attached databases are atomic, assuming that the main database is not ":memory:” and the journal!=WAL, 如果有一项不满足,只保证单个数据库的原子性。

...

7. Transient Database Used By VACUUM
VACUUM命令用于重建数据库文件, 执行VACUUM 时,会拷贝整个数据库到Transient databases临时文件中,然后覆盖写回到原来的数据库文件中。 写回过程中会创建rollback journal or write-ahead log WAL file以保证transaction atomic。单vacuum执行完毕,临时文件被删除。

重建数据库文件的原因有以下几点
(1) 当大量数据被删除后,数据库文件中会有很多空块,空页和碎片,VACUUM rebuild数据库文件,移除这些空块,减少所占的磁盘空间
(2) 频繁的inserts, updates, and deletes 导致数据库文件中很多碎片,VACUUM 重建数据库文件使得表,索引连续的存储, 减少空闲页, 减少所占的磁盘空间
(3) 当page_size 或用pragma auto_vacuum 命令修改这两个值时, SQLite会自动执行VACUMM
(4) VACUUM只对main数据库有效,对ATTACHED数据库无效
(5)如果数据库中还有其他transaction, VACUUM will fail
(6)除了使用VACUUM外,还可以使用PRAGMA auto_vacuum控制vacuum的执行
PRAGMA auto_vacuum;
PRAGMA auto_vacuum = 0 | NONE | 1 | FULL | 2 | INCREMENTAL;