SQLite学习(六) - SQLite的临时文件

前端之家收集整理的这篇文章主要介绍了SQLite学习(六) - SQLite的临时文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

@H_301_1@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时,不创建日志文件,也就是说它不支持回滚


@H_301_1@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,如果有一项不满足,只保证单个数据库的原子性。

...

@H_301_1@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;
原文链接:https://www.f2er.com/sqlite/201223.html

猜你在找的Sqlite相关文章