SQLite3 如果突发断电,关机,数据会丢还是不会丢?
❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
SQLLite是一个小型的数据库产品,但是其中的运维命令并不像想象的简单,这里核心的运维命令是PRAGMA,PRAGMA 语句是特定于 SQLite 的 SQL 扩展,用于修改 SQLite 库的操作或查询 SQLite 库的内部(非表)数据。PRAGMA 语句使用与其他 SQLite 命令.
这里有一个注意的地方,也就是PRAGMA命令本身,会进行更迭,同时在系统中使用错误的PRAGMA命令不会报错,这点是需要注意的。
下面以数据库运维中的重要性和系统性能的重要性来进行关键命令的描述
1 synchronous 这里有一个表,关于sqlite3的性能和数据安全性之间的比率
| OFF | 0 | |||
| NORMAL | 1 | |||
| FULL | 2 | |||
| EXTRA | 3 |
这里在进入SQLite的时候需要考虑你的SQLite适用于哪种模型
[root@localhost data]# sqlite3 test.db
SQLite version 3.47.1 2024-11-25 12:07:48
Enter ".help"for usage hints.
sqlite>
sqlite>
sqlite> PRAGMA synchronous = FULL;
sqlite>
sqlite> PRAGMA synchronous;
2
sqlite>
关键业务我们推荐FULL模式。
WAL日志刷新是SQLite一个关键的数据库运维项目,这里我们可以管控的是在断电后,到底需要多长时间数据库可以恢复工作的问题,这里就牵扯我们之前学习到了SQLlite的工作模式,必须是wal 然后我们的数据刷新上面提到的同步模式要是full 那么现在我们要决定的是数据页面的刷新率,也就是我们产生多少数据页面后,进行数据页面刷新的问题。
[root@localhost data]# sqlite3 test.db
SQLite version 3.47.1 2024-11-25 12:07:48
Enter ".help"for usage hints.
sqlite>
sqlite>
sqlite> PRAGMA synchronous = FULL;
sqlite>
sqlite> PRAGMA synchronous;
2
sqlite>
sqlite>
sqlite> PRAGMA wal_autocheckpoint;
1000
sqlite> PRAGMA wal_autocheckpoint = 200;
200
sqlite> PRAGMA wal_autocheckpoint;
200
sqlite> PRAGMA wal_checkpoint;
0|10179839|10179839
sqlite> PRAGMA wal_checkpoint(TRUNCATE);
0|0|0
sqlite> PRAGMA wal_autocheckpoint;
1000
sqlite> PRAGMA wal_checkpoint;
0|0|0
这里我们注意几个命令
PRAGMA autocheckpoint; 这个命令查看当前数据页面多少,才产生一次checkpoint 的工作。键入命令后会显示当前的配置是多少。
如果对数据页面触发值想进行改动,可以使用 PRAGMA wal_autocheckpint = 200; 这个意思是产生了200个页面就进行数据的刷新到磁盘的工作。
同时需要注意每次启动数据库都需要带有一个配置的文件的脚本,来加载配置否则SQLlite是不会加载正确的预设配置给你。
所以你的JAVA程序在启动SQLite的时候,应该将这些写入,或者写一个脚本如下
PRAGMA journal_mode = WAL;
PRAGMA synchronous = FULL;
PRAGMA wal_autocheckpoint = 200;
把这些存储在一个.sql文件中,然后启动的时候,但是在操作中我发现了一个新的问题,关于一些配置可以固化,一些不可以,这里我们总结了一个表。
SQLite PRAGMA 持久化 vs 非持久化
🟩 一、持久化 PRAGMA(Persistent)
这些 PRAGMA 会写入数据库文件,对所有连接永久生效。
journal_mode | ||
auto_vacuum | ||
encoding | ||
application_id | ||
page_size | ||
user_version |
🟥 二、会话级 PRAGMA(Non-persistent)
这些只影响当前 连接 或 事务,不会写入数据库文件。
synchronous | ||
wal_autocheckpoint | ||
checkpoint_fullfsync | ||
analysis_limit | ||
cache_size | ||
cache_spill | ||
busy_timeout | ||
automatic_index | ||
foreign_keys | ||
foreign_key_check | ||
integrity_check | ||
defer_foreign_keys | ||
incremental_vacuum | ||
data_version | ||
database_list | ||
index_listindex_info / index_xinfo | ||
学到这里,那就出现一个问题,一个库或者一个SQLite的数据库要进行哪些初始化设置
1 对新库的初始化包含了如下的设置
1.1 数据库存储文本的编码
1.2 数据库页面的大小
1.3 设置文件身份标识
1.4 设置数据文件的版本
1.5 控制SQLite是否进行磁盘空间的回收
1.6 设置数据库运行的模式
下面是这六项,在LINUX 和WINDOWS 中的比对异同点
SQLite 在 Linux 与 Windows 下的关键 PRAGMA 差异说明
🟩 1.1 数据库存储文本的编码(PRAGMA encoding)
chcp 65001 |
结论: SQLite 行为完全一致,主要差异来自 Windows 终端默认不是 UTF-8。
🟩 1.2 数据库页面大小(PRAGMA page_size)
结论: 两平台行为一致,4K 页通常最佳。
🟩 1.3 文件身份标识(PRAGMA application_id)
示例:sql PRAGMA application_id = 0x1234ABCD;
PRAGMA incremental_vacuum | |||
| 最大差异:锁实现不同 |
下面是这些命令的几种集合,可以将这些进行一个标准化的设置
-- 1. 设置数据库编码(仅空库且未建表时有效)
PRAGMA encoding = 'UTF-8';
-- 2. 设置数据库页面大小(仅空库有效)
PRAGMA page_size = 4096;
-- 3. 设置 database file 的 application id(应用识别)
PRAGMA application_id = 0x1234ABCD;
-- 4. 设置数据库 schema 版本(供程序使用)
PRAGMA user_version = 20240101;
-- 5. 设置自动回收空间模式(写入数据库文件结构)
-- NONE / FULL / INCREMENTAL PRAGMA auto_vacuum = FULL;
-- 6. 设置日志模式(journal_mode)
-- DELETE / TRUNCATE / PERSIST / MEMORY / WAL PRAGMA journal_mode = WAL;
-- 7. 设置同步级别(磁盘安全等级)
-- OFF / NORMAL / FULL / EXTRA PRAGMA synchronous = NORMAL;
-- 8. WAL 模式下自动 checkpoint 间隔(不持久化,每次连接需设置)
PRAGMA wal_autocheckpoint = 200;
-- 9. 可选:严格表(类似强类型)
-- CREATE TABLE t(a INTEGER, b TEXT) STRICT;
-- 10. 可选:快速收缩空间
-- PRAGMA incremental_vacuum;
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase Hybrid search 能力测试,平换MySQL的好选择
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究
OceanBase 6大学习法--OBCA视频学习总结第六章
OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计
OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 新版本就一定好--由培训现象让我做的实验
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
MySQL相关文章
一篇为MySQL用户,分析版本核心差异的文章--8.028-8.4的差异
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师