本文档风哥主要介绍sqlite数据库PRAGMA指令与运行时参数调优相关知识,包括sqlite数据库PRAGMA指令概述、PRAGMA分类详解、运行时参数机制等内容,风哥教程参考sqlite官方文档PRAGMA Statements等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 sqlite数据库PRAGMA指令概述
PRAGMA是sqlite特有的指令,用于配置数据库连接参数、查询数据库状态和控制数据库行为。更多视频教程www.fgedu.net.cn
1.1.1 PRAGMA指令特点
1. 语法特点
├── 类似SQL语句
├── 不需要分号结尾
├── 可读可写
└── 连接级别生效
2. 作用范围
├── 连接级别:仅当前连接生效
├── 数据库级别:影响整个数据库
└── 持久化:部分可保存到数据库
3. 使用方式
├── 查询:PRAGMA pragma_name;
├── 设置:PRAGMA pragma_name = value;
└── 函数式:pragma_name(value)
4. 注意事项
├── 部分PRAGMA需要特定权限
├── 部分PRAGMA在事务中不可用
├── 设置顺序可能影响效果
└── 建议在连接建立时配置
PRAGMA语法示例:
sqlite> PRAGMA cache_size; — 查询
sqlite> PRAGMA cache_size = 1000; — 设置
1.1.2 PRAGMA指令分类
1. 配置类PRAGMA
├── cache_size 页面缓存大小
├── journal_mode 日志模式
├── synchronous 同步模式
├── locking_mode 锁定模式
└── temp_store 临时存储位置
2. 查询类PRAGMA
├── database_list 数据库列表
├── table_info 表结构信息
├── index_info 索引信息
├── page_count 页面数量
└── page_size 页面大小
3. 维护类PRAGMA
├── integrity_check 完整性检查
├── wal_checkpoint WAL检查点
├── vacuum 清理数据库
└── optimize 优化索引
4. 安全类PRAGMA
├── foreign_keys 外键约束
├── ignore_check_constraints 忽略检查约束
└── secure_delete 安全删除
5. 调试类PRAGMA
├── compile_options 编译选项
├── version 版本信息
└── lock_status 锁状态
1.2 sqlite数据库PRAGMA分类详解
以下是sqlite数据库常用PRAGMA指令的详细说明。学习交流加群风哥微信: itpux-com
1.2.1 核心配置PRAGMA
1. journal_mode(日志模式)
├── DELETE:默认,删除日志文件
├── TRUNCATE:截断日志文件
├── PERSIST:保留日志文件
├── MEMORY:内存日志
├── WAL:预写日志(推荐)
└── OFF:禁用日志
2. synchronous(同步模式)
├── OFF (0):不同步,最快但不安全
├── NORMAL (1):正常同步,推荐
├── FULL (2):完全同步,最安全
└── EXTRA (3):额外同步,最安全最慢
3. cache_size(缓存大小)
├── 正数:页面数量
├── 负数:KB数量
├── 默认:-2000(约2MB)
└── 建议:-64000(约64MB)
4. locking_mode(锁定模式)
├── NORMAL:正常模式
└── EXCLUSIVE:独占模式
5. temp_store(临时存储)
├── DEFAULT (0):默认
├── FILE (1):文件
├── MEMORY (2):内存
└── 建议:MEMORY
6. page_size(页面大小)
├── 范围:512-65536
├── 默认:4096
└── 必须在创建数据库时设置
1.2.2 WAL相关PRAGMA
1. wal_autocheckpoint
├── 自动checkpoint阈值
├── 单位:页面数
├── 默认:1000
└── 建议:500-2000
2. wal_checkpoint
├── 执行checkpoint操作
├── PASSIVE:被动模式
├── RESTART:重启模式
└── TRUNCATE:截断模式
3. journal_size_limit
├── 日志文件大小限制
├── 单位:字节
├── 默认:-1(无限制)
└── 建议:根据磁盘空间设置
WAL配置示例:
sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA wal_autocheckpoint = 500;
sqlite> PRAGMA synchronous = NORMAL;
sqlite> PRAGMA wal_checkpoint(TRUNCATE);
1.3 sqlite数据库运行时参数机制
sqlite的运行时参数决定了数据库的行为和性能,理解这些参数对于调优非常重要。更多学习教程公众号风哥教程itpux_com
1.3.1 参数生效范围
1. 连接级别参数
├── 仅对当前连接生效
├── 连接关闭后失效
├── 示例:cache_size、busy_timeout
└── 需要每次连接时设置
2. 数据库级别参数
├── 对所有连接生效
├── 保存在数据库文件中
├── 示例:page_size、journal_mode
└── 设置后持久化
3. 编译级别参数
├── 编译时确定
├── 运行时不可修改
├── 示例:SQLITE_MAX_PAGE_SIZE
└── 需要重新编译修改
参数设置时机:
┌─────────────────┬──────────────────────────┐
│ 参数类型 │ 设置时机 │
├─────────────────┼──────────────────────────┤
│ page_size │ 创建数据库时 │
│ journal_mode │ 连接建立时 │
│ cache_size │ 连接建立时 │
│ synchronous │ 连接建立时 │
│ busy_timeout │ 连接建立时 │
└─────────────────┴──────────────────────────┘
Part02-生产环境规划与建议
2.1 sqlite数据库PRAGMA配置规划
合理的PRAGMA配置是数据库性能优化的基础。风哥提示:PRAGMA配置需要根据实际场景调整。
2.1.1 生产环境推荐配置
基础配置:
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -64000;
PRAGMA temp_store = MEMORY;
PRAGMA busy_timeout = 5000;
PRAGMA foreign_keys = ON;
WAL配置:
PRAGMA wal_autocheckpoint = 500;
安全配置:
PRAGMA secure_delete = ON;
PRAGMA foreign_keys = ON;
性能配置:
PRAGMA mmap_size = 268435456;
PRAGMA page_size = 4096;
配置脚本示例:
#!/bin/bash
# init_pragma.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
DB=”/sqlite/fgdata/fgedudb.db”
sqlite3 $DB < 性能参数的合理规划可以显著提升数据库性能。学习交流加群风哥微信: itpux-com 1. 缓存配置 2. WAL配置 3. 同步配置 4. 内存映射 5. 临时存储 不同场景配置: 安全参数的合理规划可以保护数据安全。更多学习教程公众号风哥教程itpux_com 1. 外键约束 2. 安全删除 3. 检查约束 4. 数据加密 安全配置脚本: 验证配置: sqlite> PRAGMA secure_delete; 以下是sqlite数据库PRAGMA配置的实际操作。学习交流加群风哥QQ113257174 查看数据库信息: sqlite> PRAGMA page_size; sqlite> PRAGMA page_count; sqlite> PRAGMA database_size; 查看表信息: 查看索引信息: sqlite> PRAGMA journal_mode = WAL; 配置缓存大小: sqlite> PRAGMA cache_size; 配置同步模式: sqlite> PRAGMA synchronous; 配置外键约束: sqlite> PRAGMA foreign_keys; 配置锁超时: sqlite> PRAGMA busy_timeout; 批量配置脚本: DB=”/sqlite/fgdata/fgedudb.db” echo “=== SQLite PRAGMA Configuration ===” sqlite3 $DB < 以下是sqlite数据库性能调优的实际操作。风哥提示:性能调优需要根据实际负载进行。 调整缓存大小: sqlite> PRAGMA cache_status; 内存映射IO: sqlite> PRAGMA mmap_size; 性能测试: DB=”/sqlite/fgdata/fgedudb.db” echo “=== Cache Performance Test ===” # 测试小缓存 # 测试大缓存 执行结果: Large Cache (64MB): 配置自动checkpoint: sqlite> PRAGMA wal_autocheckpoint; 手动checkpoint: sqlite> PRAGMA wal_checkpoint(TRUNCATE); 查看WAL文件: WAL监控脚本: DB=”/sqlite/fgdata/fgedudb.db” echo “=== WAL Monitor ===” 以下是sqlite数据库维护PRAGMA的实际操作。更多视频教程www.fgedu.net.cn 完整完整性检查: 检查特定表: 检查外键约束: 检查外键约束(有问题时): 查看优化建议: 重建索引: sqlite> REINDEX fgedu_users; 清理数据库: 查看数据库信息: sqlite> PRAGMA freelist_count; 数据库维护脚本: DB=”/sqlite/fgdata/fgedudb.db” echo “=== Database Maintenance ===” echo “1. Integrity Check…” echo “2. Foreign Key Check…” echo “3. Optimize…” echo “4. Checkpoint…” echo “5. Database Info…” echo “Maintenance completed”
以下是sqlite数据库配置优化的实际案例。学习交流加群风哥微信: itpux-com 初始配置: 优化配置: 优化后性能: 配置持久化脚本: DB=”/sqlite/fgdata/fgedudb.db” sqlite3 $DB < 以下是sqlite数据库性能调优的实际案例。风哥提示:性能调优需要持续监控和调整。 初始方案: 优化方案: sqlite> BEGIN TRANSACTION; sqlite> PRAGMA journal_mode = WAL; — 耗时:2分钟 性能对比: 批量导入脚本: DB=”/sqlite/fgdata/fgedudb.db” echo “=== Bulk Import ===” sqlite3 $DB < 以下是sqlite数据库问题排查的实际案例。更多学习教程公众号风哥教程itpux_com 排查步骤: 1. 完整性检查: 2. 尝试恢复: 4. 数据对比: sqlite> SELECT COUNT(*) FROM main.fgedu_users; 5. 替换原数据库: 预防措施: 基于多年的实践经验,以下是sqlite数据库PRAGMA的最佳实践总结。学习交流加群风哥QQ113257174 1. 配置时机 2. 推荐配置 3. 性能优化 4. 安全配置 5. 监控维护 以下是sqlite数据库参数调优的技巧总结。from sqlite视频:www.itpux.com 1. 缓存调优 2. WAL调优 3. 同步调优 4. 连接调优 5. 维护调优 综合各种因素,以下是sqlite数据库配置管理的总结。更多视频教程www.fgedu.net.cn 核心配置: 性能配置: 安全配置: 维护配置: 配置管理流程: 本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html2.2 sqlite数据库性能参数规划
2.2.1 性能参数配置建议
├── cache_size:根据内存大小设置
├── 小内存:-2000(2MB)
├── 中内存:-64000(64MB)
├── 大内存:-256000(256MB)
└── 建议:物理内存的10-20%
├── 高写入:wal_autocheckpoint=500
├── 中写入:wal_autocheckpoint=1000
├── 低写入:wal_autocheckpoint=2000
└── 定期手动checkpoint
├── 数据安全优先:synchronous=FULL
├── 性能优先:synchronous=NORMAL
└── 不推荐:synchronous=OFF
├── mmap_size:启用内存映射IO
├── 小文件:268435456(256MB)
├── 大文件:1073741824(1GB)
└── 建议:根据文件大小设置
├── temp_store=MEMORY:临时表在内存
└── 提高临时表操作性能
┌─────────────────┬──────────────────────────┐
│ 场景 │ 推荐配置 │
├─────────────────┼──────────────────────────┤
│ Web应用 │ WAL + NORMAL + 64MB缓存 │
│ 嵌入式设备 │ DELETE + FULL + 2MB缓存 │
│ 数据分析 │ WAL + NORMAL + 256MB缓存 │
│ 批处理 │ WAL + NORMAL + 大缓存 │
└─────────────────┴──────────────────────────┘
2.3 sqlite数据库安全参数规划
2.3.1 安全参数配置建议
├── foreign_keys = ON
├── 保证参照完整性
└── 生产环境必须启用
├── secure_delete = ON
├── 删除时覆盖数据
└── 防止数据恢复
├── ignore_check_constraints = OFF
├── 启用CHECK约束
└── 保证数据有效性
├── 使用SEE扩展
├── 或使用SQLCipher
└── 敏感数据必须加密
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA secure_delete = ON;
sqlite> PRAGMA ignore_check_constraints = OFF;
sqlite> PRAGMA foreign_keys;
foreign_keys
————
1
secure_delete
————-
1
Part03-生产环境项目实施方案
3.1 sqlite数据库PRAGMA配置实战
3.1.1 查看当前配置
sqlite> PRAGMA compile_options;
ENABLE_FTS3
ENABLE_FTS4
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1
sqlite> PRAGMA database_list;
seq name file
— —- ———————–
0 main /sqlite/fgdata/fgedudb.db
page_size
———
4096
page_count
———-
128
database_size
————-
524288
sqlite> PRAGMA table_info(fgedu_users);
cid name type notnull dflt_value pk
— ———— ——- ——- ———- —
0 id INTEGER 0 1
1 username TEXT 1 0
2 email TEXT 0 0
sqlite> PRAGMA index_list(fgedu_users);
seq name unique origin partial
— ————— —— —— ——-
0 idx_users_email 0 c 0
3.1.2 配置PRAGMA参数
sqlite> PRAGMA journal_mode;
journal_mode
————
delete
journal_mode
————
wal
sqlite> PRAGMA cache_size = -64000;
cache_size
———-
-64000
sqlite> PRAGMA synchronous = NORMAL;
synchronous
———–
1
sqlite> PRAGMA foreign_keys = ON;
foreign_keys
————
1
sqlite> PRAGMA busy_timeout = 10000;
busy_timeout
————
10000
#!/bin/bash
# config_pragma.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn3.2 sqlite数据库性能调优实战
3.2.1 缓存优化
sqlite> PRAGMA cache_status;
cache_size lookaside cache_used schema_used
———- ——— ———- ———–
-64000 0 262144 8192
sqlite> PRAGMA cache_size = -128000;
cache_size lookaside cache_used schema_used
———- ——— ———- ———–
-128000 0 524288 8192
sqlite> PRAGMA mmap_size = 268435456;
mmap_size
———
268435456
#!/bin/bash
# cache_test.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “Small Cache (2MB):”
time sqlite3 $DB “PRAGMA cache_size = -2000; SELECT COUNT(*) FROM fgedu_users;”
echo “Large Cache (64MB):”
time sqlite3 $DB “PRAGMA cache_size = -64000; SELECT COUNT(*) FROM fgedu_users;”
$ ./cache_test.sh
=== Cache Performance Test ===
Small Cache (2MB):
COUNT(*)
——–
10004
real 0m0.152s
COUNT(*)
——–
10004
real 0m0.089s
3.2.2 WAL优化
sqlite> PRAGMA wal_checkpoint;
busy log checkpointed
—- — ————
0 50 50
sqlite> PRAGMA wal_autocheckpoint = 500;
wal_autocheckpoint
——————
500
sqlite> PRAGMA wal_checkpoint(PASSIVE);
busy log checkpointed
—- — ————
0 0 0
busy log checkpointed
—- — ————
0 0 0
$ ls -lh /sqlite/fgdata/fgedudb.db-wal
-rw-r–r– 1 sqlite sqlite 0 Apr 8 10:00 /sqlite/fgdata/fgedudb.db-wal
#!/bin/bash
# wal_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
WAL_FILE=”${DB}-wal”
echo “Time: $(date)”
echo “WAL Size: $(ls -lh $WAL_FILE | awk ‘{print $5}’)”
sqlite3 $DB “PRAGMA wal_checkpoint;”
sqlite3 $DB “PRAGMA wal_autocheckpoint;”
3.3 sqlite数据库维护PRAGMA实战
3.3.1 完整性检查
sqlite> PRAGMA quick_check;
quick_check
———–
ok
sqlite> PRAGMA integrity_check;
integrity_check
—————
ok
sqlite> PRAGMA integrity_check(fgedu_users);
integrity_check
—————
ok
sqlite> PRAGMA foreign_key_check;
— 无输出表示无问题
sqlite> PRAGMA foreign_key_check;
table rowid parent fkid
——– ——– ——– —-
fgedu_orders 5 fgedu_users 0
3.3.2 数据库优化
sqlite> PRAGMA optimize;
optimize
——–
ok
sqlite> PRAGMA optimize(0x10000);
— 显示优化建议
sqlite> REINDEX;
sqlite> VACUUM;
sqlite> PRAGMA page_count;
page_count
———-
120
freelist_count
————–
0
#!/bin/bash
# db_maintenance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “Time: $(date)”
sqlite3 $DB “PRAGMA integrity_check;”
sqlite3 $DB “PRAGMA foreign_key_check;”
sqlite3 $DB “PRAGMA optimize;”
sqlite3 $DB “PRAGMA wal_checkpoint(TRUNCATE);”
sqlite3 $DB “SELECT ‘Page Count: ‘ || page_count FROM pragma_page_count;”
sqlite3 $DB “SELECT ‘Free Pages: ‘ || freelist_count FROM pragma_freelist_count;”Part04-生产案例与实战讲解
4.1 sqlite数据库配置优化案例
4.1.1 Web应用配置优化案例
├── journal_mode: delete
├── synchronous: FULL
├── cache_size: -2000
├── busy_timeout: 0
└── 性能:TPS 50
sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA synchronous = NORMAL;
sqlite> PRAGMA cache_size = -64000;
sqlite> PRAGMA busy_timeout = 10000;
sqlite> PRAGMA temp_store = MEMORY;
sqlite> PRAGMA mmap_size = 268435456;
├── TPS: 500
├── 响应时间: 20ms
└── 错误率: 0.01%
#!/bin/bash
# web_config.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn4.2 sqlite数据库性能调优案例
4.2.1 批量导入性能优化
sqlite> INSERT INTO fgedu_data VALUES (…); — 逐条插入
— 耗时:30分钟
sqlite> PRAGMA journal_mode = OFF;
sqlite> PRAGMA synchronous = OFF;
sqlite> PRAGMA cache_size = -256000;
sqlite> INSERT INTO fgedu_data VALUES (…); — 批量插入
sqlite> COMMIT;
sqlite> PRAGMA synchronous = NORMAL;
┌─────────────────┬──────────┬──────────┐
│ 方案 │ 耗时 │ 性能提升 │
├─────────────────┼──────────┼──────────┤
│ 初始方案 │ 30分钟 │ 基准 │
│ 优化方案 │ 2分钟 │ 15倍 │
└─────────────────┴──────────┴──────────┘
#!/bin/bash
# bulk_import.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
DATA_FILE=”/sqlite/data/import.csv”
echo “Start: $(date)”4.3 sqlite数据库问题排查案例
4.3.1 数据库损坏排查
应用报错 “database disk image is malformed”
sqlite> PRAGMA integrity_check;
integrity_check
—————
*** in database main ***
Page 100: btree pointer size mismatch
On tree page 100 cell 5: invalid page number 0
$ sqlite3 fgedudb.db “.recover” > recover.sql
$ sqlite3 fgedudb_recovered.db < recover.sql
3. 验证恢复结果:
sqlite> PRAGMA integrity_check;
integrity_check
—————
ok
sqlite> SELECT COUNT(*) FROM fgedu_users;
COUNT(*)
——–
10004
COUNT(*)
——–
10002
$ cp fgedudb_recovered.db fgedudb.db
├── 定期备份
├── 启用WAL模式
├── 定期完整性检查
├── 监控磁盘空间
└── 使用UPS电源
Part05-风哥经验总结与分享
5.1 sqlite数据库PRAGMA最佳实践
5.1.1 PRAGMA最佳实践总结
├── 连接建立时立即配置
├── 使用初始化脚本
├── 避免运行时频繁修改
└── 保持配置一致性
├── journal_mode = WAL
├── synchronous = NORMAL
├── cache_size = -64000
├── busy_timeout = 5000
├── foreign_keys = ON
└── temp_store = MEMORY
├── 根据内存调整缓存
├── 启用内存映射IO
├── 合理设置checkpoint
└── 定期执行维护
├── 启用外键约束
├── 启用安全删除
├── 定期完整性检查
└── 加密敏感数据
├── 监控关键指标
├── 定期执行优化
├── 记录配置变更
└── 制定恢复计划
5.2 sqlite数据库参数调优技巧
5.2.1 参数调优技巧汇总
├── 小数据量:2-8MB
├── 中数据量:32-64MB
├── 大数据量:128-256MB
└── 监控缓存命中率
├── 高写入:checkpoint=500
├── 中写入:checkpoint=1000
├── 低写入:checkpoint=2000
└── 监控WAL大小
├── 安全优先:FULL
├── 平衡模式:NORMAL
├── 性能优先:NORMAL
└── 不推荐:OFF
├── 设置合理超时
├── 使用连接池
├── 控制并发数
└── 监控锁等待
├── 定期VACUUM
├── 定期ANALYZE
├── 定期checkpoint
└── 定期完整性检查
5.3 sqlite数据库配置管理总结
5.3.1 配置管理总结
├── journal_mode = WAL
├── synchronous = NORMAL
├── cache_size = -64000
├── busy_timeout = 5000
├── foreign_keys = ON
└── temp_store = MEMORY
├── mmap_size = 268435456
├── wal_autocheckpoint = 500
└── cache_size根据内存调整
├── foreign_keys = ON
├── secure_delete = ON
└── 定期完整性检查
├── 定期VACUUM
├── 定期ANALYZE
├── 定期checkpoint
└── 监控告警
├── 1. 分析应用需求
├── 2. 制定配置方案
├── 3. 测试验证效果
├── 4. 生产环境部署
├── 5. 持续监控优化
└── 6. 定期回顾调整
