SQLite學習(五) - SQLite的臨時文件


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM