去年SQLlite的几个文章爆火,我都没有想到几万的阅读量。今年我们也新开一个系列叫SQLite知多少,我们继续深入到SQLite的使用问题的探究中.
我们此次选择的版本是3.45.3,这个版本在适应的系统的广泛性都要比新的版本要好,并且一些我们需要的核心技术的更新也都做了,BUG的FIX也做了。所以这个版本将作为我们的研究和使用的核心版本。
接上期,我们本期应该继续讨论SQL的撰写和优化,以及探索查询分析器的处理,不过这些我们下期说我们本期来说说 SQLite的备份和数据恢复的事情。咱们每期穿插,程序和运维两个方面来。
在这里我们先对之前SQLite 特性说一下,数据库写入的时候是单进程,也就是数据库中任意一个表写入一条数据,整个文件,也就是整个库加锁。那么这样的情况,Sqlite的备份其实异常的简单,只要业务不进行数据的写入的状态下,直接拷贝数据文件就可以了。
这里我们在次提醒 .wal .shm 以及SQLite的数据文件一起拷贝走。不懂的看前面的文章。 不过如果你的数据文件频繁的写入数据,那么你的备份有有几率是损坏的备份的文件
所以只有停机的时候,进行文件的拷贝才是安全的。
那么我们必须有一个方案,和其他的数据库一样进行在线的数据备份。SQLite提供了一个Online Backup API 在进入sqlite总通过 .backup 命令来进行数据库的备份。
下面我们给大家演示一下
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>
那么我们不想进入到系统中,想在外面进行
[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有这个命令,就是在备份的时候,清理数据库文件的碎片,相当于备份后,备份的数据里面的文件是没有碎片的。
所以,所以这也是一种碎片整理的方案。备份后替换原文件。
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进行数据库的备份
#!/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

本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!