首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SQLite 备份我不会,Down机了怎么办 SQLite 五脏俱全系列 (3)

SQLite 备份我不会,Down机了怎么办 SQLite 五脏俱全系列 (3)

作者头像
AustinDatabases
发布2026-04-22 20:05:41
发布2026-04-22 20:05:41
900
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

去年SQLlite的几个文章爆火,我都没有想到几万的阅读量。今年我们也新开一个系列叫SQLite知多少,我们继续深入到SQLite的使用问题的探究中.

我们此次选择的版本是3.45.3,这个版本在适应的系统的广泛性都要比新的版本要好,并且一些我们需要的核心技术的更新也都做了,BUG的FIX也做了。所以这个版本将作为我们的研究和使用的核心版本。

接上期,我们本期应该继续讨论SQL的撰写和优化,以及探索查询分析器的处理,不过这些我们下期说我们本期来说说 SQLite的备份和数据恢复的事情。咱们每期穿插,程序和运维两个方面来。

在这里我们先对之前SQLite 特性说一下,数据库写入的时候是单进程,也就是数据库中任意一个表写入一条数据,整个文件,也就是整个库加锁。那么这样的情况,Sqlite的备份其实异常的简单,只要业务不进行数据的写入的状态下,直接拷贝数据文件就可以了。

这里我们在次提醒 .wal .shm 以及SQLite的数据文件一起拷贝走。不懂的看前面的文章。 不过如果你的数据文件频繁的写入数据,那么你的备份有有几率是损坏的备份的文件

所以只有停机的时候,进行文件的拷贝才是安全的。

那么我们必须有一个方案,和其他的数据库一样进行在线的数据备份。SQLite提供了一个Online Backup API 在进入sqlite总通过 .backup 命令来进行数据库的备份。

下面我们给大家演示一下

代码语言:javascript
复制
root@sqllite ~]# sqlite3 test.sql -init init.sql 
-- Loading resources from init.sql
wal
5000
SQLite version 3.46.0 2024-04-15 20:43:21
Enter ".help" for usage hints.
sqlite> .backup test.backup
sqlite> 

那么我们不想进入到系统中,想在外面进行

代码语言:javascript
复制
[root@sqllite ~]# 
[root@sqllite ~]# sqlite3 test.sql -init init.sql ".backup 'backuptest.backup'"
-- Loading resources from init.sql
wal
5000
[root@sqllite ~]# ls
anaconda-ks.cfg    init.sql  sqlite-20240415204321-6b21cccdee  sqlite-3.45.zip  sqlite3_analyzer                test.backup
backuptest.backup  sqldiff   sqlite3                           sqlite-3.46.zip  sqlite-dll-win-x64-3450300.zip  test.sql
[root@sqllite ~]# 

这样备份的好处是,保证在备份的时候,数据是一致的,保证了数据库的数据一致性。

那么这里备份的命令就结束了吗,并没有,在大多数数据库备份的时候有一个命令都没有,但是SQLite有这个命令,就是在备份的时候,清理数据库文件的碎片,相当于备份后,备份的数据里面的文件是没有碎片的。

所以,所以这也是一种碎片整理的方案。备份后替换原文件。

代码语言:javascript
复制
Enter ".help" for usage hints.
sqlite> vacuum into 'backup_file.db';
sqlite> exit 
   ...> .exit 
   ...> ^C^CProgram interrupted.
[root@sqllite ~]# 
[root@sqllite ~]# 
[root@sqllite ~]# ls
anaconda-ks.cfg  backuptest.backup  sqldiff                           sqlite3          sqlite-3.46.zip   sqlite-dll-win-x64-3450300.zip  test.sql      test.sql-wal
backup_file.db   init.sql 

那么有人说,这还不够,我需要的是流式备份,这里推荐要给工具,Litestream: 这是一个专门为 SQLite 设计的开源工具。它通过模拟 Checkpoint 进程,将 WAL 日志实时同步到 S3(对象存储)。https://litestream.io/install/linux/ 通过这个工具你的SQLite可以实时的进行备份,你的数据只要同步到S3就不会丢失。

另外你还可以在一些服务器级别的磁盘上进行快照进行数据的备份。

最后我们给大家一个带有自动清理功能的简单shell脚本来对你的SQLITE进行数据库的备份

代码语言:javascript
复制
#!/bin/bash

# 配置变量
DB_PATH="/data/my_app/production.db"     # 源数据库路径
BACKUP_DIR="/data/backups/sqlite"       # 备份存放目录
KEEP_DAYS=7                             # 备份保留天数
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.db"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 执行备份
# -batch: 非交互模式
# -init /dev/null: 避免加载用户自定义的 .sqliterc
sqlite3 -batch -init /dev/null "$DB_PATH""VACUUM INTO '$BACKUP_FILE';"

# 检查执行结果
if [ $? -eq 0 ]; then
    echo"[$(date)] 备份成功: $BACKUP_FILE"
    # 清理 7 天前的旧备份
    find "$BACKUP_DIR" -name "backup_*.db" -mtime +$KEEP_DAYS -exec rm {} \;
    echo"[$(date)] 旧备份清理完成"
else
    echo"[$(date)] 备份失败!"
    exit 1
fi
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档