非常教程

Sqlite参考手册

其他 | Miscellaneous

Powersafe Overwrite

“Powersafe覆盖”是SQLite团队用来描述某些文件系统和磁盘控制器在断电期间与数据保存相关的行为的术语。Powersafe覆盖是一个布尔属性:存储系统拥有它或不存在。

如果以下语句成立,我们说系统具有powersafe覆盖属性:

 When an application writes a range of bytes in a file, no bytes outside of that range will change, even if the write occurs just before a crash or power failure. 

powersafe覆盖属性没有说明写入的字节的状态。这些字节可能包含旧值,新值,随机值或这些值的组合。powersafe覆盖属性仅仅表明写入不能改变写入字节范围之外的字节。

换句话说,动力安全覆盖意味着在书写时发生断电时不会有“附带损害”。只有实际写入的字节可能会被损坏。

实际上,powersafe写属性的意思是,当磁盘控制器检测到即将发生的功率损耗时,它会在停放磁头之前完成正在处理的任何扇区。这意味着即使存在电力损耗,单个扇区写入也会一次完成。

考虑一下如果磁盘扇区写入被断电中断会发生什么。如果应用程序在某个文件的中间写入两个或三个字节,操作系统将通过首先读取包含这些字节的整个扇区,在内存中更改扇区,然后将整个扇区写回到磁盘来实现此目的。如果在回写过程中发生断电并且扇区未完全写入,则在重新启动后的下一次读取时,扇区中的纠错码可能会检测到无法挽回的损坏,并且磁盘控制器将读出该扇区为全零或全部为零。因此,值将在应用程序级别写入的两个或三个字节范围之外发生更改 - 这违反了powersafe覆盖属性。

SQLite Assumptions About Powersafe Overwrite

所有版本的SQLite直到并包括版本3.7.9(2011-11-01)假定文件系统不提供powersafe覆盖。SQLite传统上认为,当一个文件的任何一个字节发生变化时,该字节同一扇区内的所有其他字节都有可能在功率损失时被破坏。写入时,SQLite确保将任何修改的相同扇区中的所有字节记入日志文件,并将日志文件填充到下一个扇区边界,以便随后追加到该日志中不会损坏先前的记录。SQLite将扇区大小理解为VFS中xSectorSize方法返回的值。SQLite团队经常将xSectorSize返回的值作为写入的“爆炸半径”,因为它表示在写入期间发生掉电时可能损坏的字节范围。

较新的磁盘驱动器已开始使用4096字节的扇区。从SQLite 版本3.7.10(2012-01-16)开始,SQLite开发团队尝试更改xSectorSize以报告4096字节作为爆炸半径。这会增加许多数据库的写入开销。对于PRAGMA page_size为1024的数据库(非常普遍的选择),对数据库中的单个页面进行更改现在需要SQLite将其他三个相邻页面备份到回滚日志中,而以前它只需要备份一个页面正在改变。在WAL模式下,每个事务都必须填充到WAL文件中的下一个4096字节边界,而不是下一个512字节边界,从而导致每个事务写入数千个额外的字节。

额外的写入开销促使人们重新审视有关powersafe覆盖的假设。使用现代化的磁盘驱动器,容量变得如此之大,数据密度如此之大以至于单个扇区很小,编写单个扇区所需的时间很少。我们知道,磁盘驱动器可以检测即将发生的功率损耗,并在剩余能量上继续运行一段时间,因为这些驱动器能够在停转之前停放磁头。因此,如果磁盘控制器检测到即将发生的功率损耗,控制器在停止磁头之前首次检测到即将发生的功率损耗时将完成当前正在工作的任何扇区的写入是合理的,只要这样做不会太长,这不应该与小而密集的部门。因此,假设powersafe覆盖现代磁盘似乎是合理的。事实上,我们被告知,伯克利已经做了几十年的这个假设。尽管谨慎,正如Roger Binns在SQLite开发人员邮件列表中指出的那样:“'写得不好'应该是驱动器固件的主要假设。”

Torn Pages

当数据库页面大于磁盘扇区时,会出现破损页面,数据库页面会写入磁盘,但在写入数据库页面的所有扇区之前会发生断电。然后,恢复时,部分数据库页面将包含旧内容,而页面的其他部分将包含新内容。一些数据库引擎假设页面写入是原子的,因此页面破损是不可恢复的错误。

SQLite从不假定数据库页面写入是原子的,不管PSOW的设置如何。(1)因此,SQLite总是能够从崩溃导致的破损页面中自动恢复。启用PSOW不会降低SQLite从破损页面恢复的能力。

Changes In SQLite Version 3.7.10

SQLite 版本3.7.10(2012-01-16)的VFS 添加了名为SQLITE_IOCAP_POWERSAFE_OVERWRITE的新设备特征。报告此特征的数据库文件假定驻留在具有powersafe覆盖属性的存储系统上。如果使用-DSQLITE_POWERSAFE_OVERWRITE = 1编译SQLite,则默认的unix和windows VFS现在报告SQLITE_IOCAP_POWERSAFE_OVERWRITE,或者如果使用-DSQLITE_POWERSAFE_OVERWRITE = 0进行编译,他们会假定存储没有powersafe覆盖属性。目前,默认情况下powersafe覆盖是打开的,虽然我们可能会在将来重新访问并将其默认关闭。

可以指定单个数据库的powersafe覆盖属性,因为使用具有URI文件名的“psow”查询参数打开数据库。例如,要始终假定文件的powersafe覆盖(可能为了确保最大写入性能),请将其打开为

file:somefile.db?psow=1

或者为了使数据库更安全,并强制SQLite假定数据库缺少powersafe覆盖,请使用它打开它

file:somefile.db?psow=0

对于sqlite3_file_control(),还有一个新的SQLITE_FCNTL_POWERSAFE_OVERWRITE操作码,它允许应用程序查询数据库文件的powersafe覆盖属性。

Notes:

  1. SQLite从不会假定其默认配置中的原子页面写入。但是自定义VFS可以在xDeviceCharacteristic()方法的结果中设置SQLITE_IOCAP_ATOMIC位中的一个位,然后SQLite将假定页写入是原子的。但是,应用程序必须提供自定义VFS才能完成此操作,因为没有任何标准VFS将设置xDeviceCharacteristics()向量中的任何原子位。
 SQLite is in the Public Domain.

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Architecture of SQLite
6.Atomic Commit In SQLite
7.Automatic Undo/Redo With SQLite
8.Benefits of SQLite As A File Format
9.Change in Default Page Size in SQLite Version 3.12.0
10.Clustered Indexes and the WITHOUT ROWID Optimization
11.Compile-time Options
12.Constraint Conflict Resolution in SQLite
13.Custom Builds Of SQLite
14.Deterministic SQL Functions
15.Distinctive Features Of SQLite
16.EXPLAIN QUERY PLAN
17.Features Of SQLite
18.File Format Changes in SQLite
19.Full-Featured SQL
20.High Reliability
21.Hints for Debugging SQLite
22.How SQLite Is Tested
23.How To Compile SQLite
24.How To Download Canonical SQLite Source Code
25.Imposter Tables
26.In-Memory Databases
27.Indexes On Expressions
28.Internal Versus External BLOBs
29.Isolation In SQLite
30.Long Term Support
31.Maintaining Private Branches Of SQLite
32.Many Small Queries Are Efficient In SQLite
33.Measuring and Reducing CPU Usage in SQLite
34.Memory-Mapped I/O
35.NULL Handling in SQLite
36.Partial Indexes
37.Pointer Passing Interfaces
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By