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;