SQLite数据库备份 #
一、备份概述 #
1.1 备份重要性 #
sql
-- 数据库备份的重要性:
-- 1. 防止数据丢失
-- 2. 应对硬件故障
-- 3. 恢复误操作
-- 4. 数据迁移
-- 5. 版本控制
1.2 备份方法 #
text
SQLite 备份方法:
├── 文件复制
├── .dump 命令
├── .backup 命令
├── 在线备份API
└── 导出特定表
二、文件复制 #
2.1 直接复制文件 #
bash
-- SQLite 数据库是单个文件
-- 可以直接复制文件进行备份
-- Linux/macOS
cp myapp.db myapp_backup.db
-- Windows
copy myapp.db myapp_backup.db
-- 注意事项:
-- 1. 确保没有写入操作
-- 2. 或使用排他锁
-- 3. WAL模式需要复制 -wal 和 -shm 文件
2.2 安全复制 #
bash
-- 使用排他锁确保一致性
sqlite3 myapp.db "PRAGMA locking_mode=EXCLUSIVE;"
-- 然后复制文件
cp myapp.db myapp_backup.db
-- 或在SQLite命令行中
sqlite3 myapp.db
sqlite> PRAGMA locking_mode=EXCLUSIVE;
sqlite> .quit
-- 复制文件
cp myapp.db myapp_backup.db
三、.dump命令 #
3.1 导出SQL脚本 #
bash
-- 导出整个数据库
sqlite3 myapp.db .dump > backup.sql
-- 在SQLite命令行中
sqlite3 myapp.db
sqlite> .output backup.sql
sqlite> .dump
sqlite> .output stdout
3.2 导出特定表 #
bash
-- 导出单个表
sqlite3 myapp.db ".dump users" > users_backup.sql
-- 导出多个表
sqlite3 myapp.db ".dump users orders" > tables_backup.sql
3.3 导出格式选项 #
bash
-- 导出INSERT语句
sqlite3 myapp.db ".dump --inserts" > backup.sql
-- 导出带列名的INSERT
sqlite3 myapp.db ".dump --inserts --column-inserts" > backup.sql
3.4 从SQL脚本恢复 #
bash
-- 从SQL脚本恢复
sqlite3 new.db < backup.sql
-- 或在SQLite命令行中
sqlite3 new.db
sqlite> .read backup.sql
四、.backup命令 #
4.1 在线备份 #
bash
-- .backup 命令创建一致性备份
-- 不阻塞其他操作
-- 基本语法
sqlite3 myapp.db ".backup 'backup.db'"
-- 在SQLite命令行中
sqlite3 myapp.db
sqlite> .backup backup.db
4.2 备份附加的数据库 #
sql
-- 备份主数据库
.backup main 'main_backup.db'
-- 备份附加的数据库
.backup users_db 'users_backup.db'
五、在线备份API #
5.1 Python备份 #
python
import sqlite3
def backup_database(source_db, dest_db):
source = sqlite3.connect(source_db)
dest = sqlite3.connect(dest_db)
# 执行在线备份
source.backup(dest)
dest.close()
source.close()
# 使用
backup_database('myapp.db', 'backup.db')
5.2 增量备份 #
python
import sqlite3
def incremental_backup(source_db, dest_db):
source = sqlite3.connect(source_db)
dest = sqlite3.connect(dest_db)
# 增量备份(每次备份100页)
def progress(status, remaining, total):
print(f"Copied {total - remaining} of {total} pages...")
source.backup(dest, pages=100, progress=progress)
dest.close()
source.close()
六、定时备份 #
6.1 Shell脚本 #
bash
#!/bin/bash
# backup_sqlite.sh
DB_PATH="/path/to/myapp.db"
BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/myapp_$DATE.db"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
sqlite3 $DB_PATH ".backup '$BACKUP_FILE'"
# 压缩备份
gzip $BACKUP_FILE
# 删除30天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
echo "Backup completed: $BACKUP_FILE.gz"
6.2 Cron定时任务 #
bash
# 编辑crontab
crontab -e
# 每天凌晨2点备份
0 2 * * * /path/to/backup_sqlite.sh
# 每小时备份
0 * * * * /path/to/backup_sqlite.sh
七、备份验证 #
7.1 检查备份完整性 #
bash
-- 检查备份文件
sqlite3 backup.db "PRAGMA integrity_check;"
-- 检查表数量
sqlite3 backup.db "SELECT COUNT(*) FROM sqlite_master WHERE type='table';"
-- 检查数据量
sqlite3 backup.db "SELECT COUNT(*) FROM users;"
7.2 测试恢复 #
bash
-- 创建测试数据库
sqlite3 test_restore.db < backup.sql
-- 或复制备份文件
cp backup.db test_restore.db
-- 验证数据
sqlite3 test_restore.db "SELECT COUNT(*) FROM users;"
-- 清理测试文件
rm test_restore.db
八、恢复操作 #
8.1 从备份恢复 #
bash
-- 方法1:直接使用备份文件
cp backup.db myapp.db
-- 方法2:从SQL脚本恢复
sqlite3 myapp.db < backup.sql
-- 方法3:恢复到新数据库
sqlite3 new_myapp.db < backup.sql
8.2 部分恢复 #
bash
-- 从备份中提取特定表
sqlite3 backup.db ".dump users" > users.sql
-- 恢复到当前数据库
sqlite3 myapp.db
sqlite> DELETE FROM users; -- 清空原表
sqlite> .read users.sql
九、备份策略 #
9.1 备份类型 #
text
备份策略:
├── 完全备份 - 备份整个数据库
├── 增量备份 - 只备份变化的数据
└── 差异备份 - 备份自上次完全备份后的变化
9.2 备份计划示例 #
text
备份计划示例:
├── 每日完全备份(凌晨)
├── 每小时增量备份
├── 保留7天每日备份
├── 保留4周每周备份
└── 保留12月每月备份
十、总结 #
备份方法对比 #
| 方法 | 优点 | 缺点 |
|---|---|---|
| 文件复制 | 简单快速 | 需要停写 |
| .dump | 可读性强 | 较慢 |
| .backup | 在线备份 | 需要命令行 |
| API备份 | 灵活可控 | 需要编程 |
最佳实践 #
- 定期自动备份
- 验证备份完整性
- 保留多个备份版本
- 测试恢复流程
- 异地备份存储
下一步,让我们学习性能优化!
最后更新:2026-03-27