执行SQLite VACUUM时报错database or disk full(13) 求助
SQLite VACUUM报错“磁盘满(13)”的排查与解决
检查文件系统预留空间
多数Linux文件系统(如ext4)会为root用户预留5%的磁盘空间,普通用户无法访问这部分资源。可通过以下命令查看并调整:- 查看预留配置:
tune2fs -l /dev/your-disk-device | grep 'Reserved block count' - 调整预留比例(比如改为1%):
tune2fs -m 1 /dev/your-disk-device
- 查看预留配置:
确认临时文件实际占用
VACUUM操作所需临时空间可能大于原数据库体积,因为它会生成完整的数据库副本,再加上日志等额外开销。可通过以下方式验证:- 找到sqlite3进程PID:
ps aux | grep sqlite3 - 查看临时文件大小:
lsof -p [进程PID] | grep /run/media/ghostdog/data/datadir
- 找到sqlite3进程PID:
排查磁盘真实可用空间
- 检查是否存在已删除但未释放的文件(被进程占用):
lsof | grep deleted,若有则重启对应进程释放空间 - 用
du -sh /run/media/ghostdog/data/统计目录实际占用,对比df -kh的结果,确认空间计算是否一致
- 检查是否存在已删除但未释放的文件(被进程占用):
调整VACUUM的临时文件策略
- 若临时目录问题无法解决,可尝试不指定
SQLITE_TMPDIR,让SQLite在数据库所在目录生成临时文件(需确保原目录有足够空间) - 执行VACUUM前设置WAL模式,减少空间需求:
PRAGMA journal_mode = WAL; VACUUM;
- 若临时目录问题无法解决,可尝试不指定
替代方案:导出再导入数据
对于超大数据库,直接用导出导入替代VACUUM,避免临时文件空间瓶颈:# 导出数据库内容到SQL文件 sqlite3 database.db .dump > backup.sql # 创建新数据库并导入数据 sqlite3 new_database.db < backup.sql
内容的提问来源于stack exchange,提问作者GhostDog98
相关产品推荐
相关产品推荐

