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.
(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;