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备份 灵活可控 需要编程

最佳实践 #

  1. 定期自动备份
  2. 验证备份完整性
  3. 保留多个备份版本
  4. 测试恢复流程
  5. 异地备份存储

下一步,让我们学习性能优化!

最后更新:2026-03-27