sqlite删除数据

某日, 在使用sqlite的时候发现查询速度极慢, 查看了一下文件大小, sqlite数据库文件已经达到了 22G! 对于一个文件数据库来说, 已经相当致命了,先不说后面如果解决文件过大的问题, 首先手动删除一些文件, 释放一些空间; 本文就释放空间的过程遇到的问题做一个记录

问题一: 删除表后, 数据库文件占用磁盘空间并没有释放

drop table ** 之后, 查看文件占用空间大小, 发现并没有变化

是因为sqlite的机制是, 当你删除表后, sqlite会把释放出来的空间, 放到一个空闲列表中, 用于下次你插入数据的时候用, 并不会把空间返还给操作系统 , 很流氓的做法

这时如果想强制释放空间, 需要用 vacuum; 命令

问题二:db or disk is full

当你执行完 vacuum命令后, 满心欢喜的等待释放空间, 结果等了好久, 最后报了一个这个错, 说磁盘或者数据库空间已满;
这是因为 sqlite执行 vacuum命令释放空间的机制, 是需要把数据库文件拷贝到一个临时文件中, 然后再删除;所以需要两倍于 数据库文件大小 的磁盘空间

问题三:Vacuum命令的临时文件目录, 是哪个

磁盘当然是不够用的, 那这时需要挂载一个硬盘了, 可是, 挂载到哪个目录呢?

在上一步执行 vacuum命令的时候, 观察了一下 磁盘使用情况, 发现 根目录 / 一直在增加使用量;那肯定是临时文件生成到 根目录了, 是根目录的那个目录呢; 要是直接把硬盘挂载到根目录, 那就别玩了;

查了一下谷歌,这个论坛 https://oomake.com/question/6765345 指出了 sqlite vacuum的临时文件目录

粘贴一下 文章内容:

注意到在VACUUM期间,SQLite创建的临时文件大小与原始数据库大小相同。它这样做是为了维护数据库ACID属性。 SQLite使用一个目录来保存执行VACUUM时所需的临时文件。为了确定要使用的目录,它会下降层次结构,查找具有适当访问权限的第一个目录。如果它找到了一个它无权访问的目录,它将忽略该目录并继续下降层次结构,寻找它所执行的目录。我提到这个,以防任何人指定了一个环境变量,而SQLite似乎忽略了它。 在他的回答中,CL给出了Linux的层次结构,并在他的评论中提到层次结构是依赖于操作系统的。为了完整性,这里是层次结构(据我可以从代码中确定它们)。 对于Unix(和Linux),层次结构是:

  1. 无论SQLITE_TMPDIR环境变量指定了什么,
  2. 无论TMPDIR环境变量指定什么,
  3. / var / tmp中,
  4. 的/ usr / TMP,
  5. / tmp,最后
  6. 当前的工作目录。

对于Cygwin,层次结构是:

  1. 无论SQLITE_TMPDIR环境变量指定了什么,
  2. 无论TMPDIR环境变量指定什么,
  3. 无论TMP环境变量指定什么,
  4. 无论TEMP环境变量指定什么,
  5. 无论USERPROFILE环境变量指定了什么,
  6. / var / tmp中,
  7. 的/ usr / TMP,
  8. / tmp,最后
  9. 当前的工作目录。

对于Windows,层次结构是:

  • GetTempPath(),记录为返回:

    1. 无论TMP环境变量指定什么,
    2. 无论TEMP环境变量指定什么,
    3. 无论USERPROFILE环境变量指定了什么,最后
    4. Windows目录。

有了这个, 就可以了, 把硬盘挂载到/ var / tmp 目录, 或者再sqlite交互页面中, 执行临时文件的目录

关于SQLITE_TMPDIR 的指定, 参考官方文档 https://www.sqlite.org/pragma.html#pragma_temp_store_directory 使用 PRAGMA temp_store_directory = 'directory-name'; 命令可以指定 临时文件的目录, 注意一定要保证该目录有写权限

再说一下挂载的问题:

运营给的硬盘的盘符是 xvdg,那么挂载点就是 /dev/xvdg
挂载命令: sudo mount /dev/xvdg /var/tmp/
这样就把 /var/tmp/ 挂载到了新硬盘上了

卸载的命令:

umount /dev/xvdg 或者 umount /var/tmp

查看一个目录的挂载位置: df 文件名

sqlite删除数据的更多相关文章

  1. 解决sqlite删除数据后,文件大小不变问题(VACUUM)

    删除表格的全部数据: DELETE FROM [Name] 当在sqlite中删除了大量数据后,数据库文件的大小还是那样,没有变.原因是:从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的” ...

  2. 解决sqlite删除数据或者表后,文件大小不变的问题

    原因分析: sqlite采用的是变长纪录存储,当你从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的"空闲列表"中用于存储你下次插入的数据,用于提高效率,磁盘空间并没有丢 ...

  3. 解决sqlite删除数据后,文件大小不变问题 转载

    原文地址:http://blog.csdn.net/yangchun1213/article/details/7656146   说了这么多,没进主题,我的主题是给Sqlite在删除数据后擦屁股. 大 ...

  4. android: SQLite删除数据

    删除数据对你来说应该就更简单了,因为它所需要用到的知识点你全部已经学过了. SQLiteDatabase 中提供了一个 delete()方法专门用于删除数据,这个方法接收三个参数,第一 个参数仍然是表 ...

  5. 解决sqlite 删除记录后数据库文件大小不变

    最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M: 原因是:sqlit ...

  6. sqlite学习笔记5:插入数据,查询数据和删除数据

    曾闻:全部的编程都是已数据为中心,觉得很有道理. 所谓数据库数据库,没有数据叫什么数据库,接下来就看看怎样在表中插入数据. 一 插入数据 1 创建一张表 首先为了插入数据,须要先创建一张表: CREA ...

  7. Android 一键直接查看Sqlite数据库数据

    转自:http://www.cnblogs.com/trinea/archive/2012/11/16/2773656.html 本文主要介绍Android开发中如何一键直接查看sqlite数据库中的 ...

  8. SQLite 删除表(http://www.w3cschool.cc/sqlite/sqlite-drop-table.html)

    SQLite 删除表 SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据.索引.触发器.约束和该表的权限规范. 使用此命令时要特别注意,因为一旦一个表被删除,表中所有信息也将永 ...

  9. 使用SQLite存储数据

    一.SQLiteAndroid 为了让我们能够更加方便地管理数据库, 专门提供了一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级. 1.SQLiteOpe ...

随机推荐

  1. dedecms5.7的获取本文章的TAG

    tag调用标签如下: {dede:tag row='10' getall='1' sort='month'} <li><a href='[field:link/]'>[fiel ...

  2. Python - 正则表达式 - 第二十二天

    正则表达式 - 教程 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单 ...

  3. 代码方式给控件添加背景图片(WPF)

    wpf中常常需要给控件添加背景图片,下边以wrapPanel为例,使用代码添加背景图片 WrapPanel xwraPanel = new WrapPanel(); ImageBrush ximgBr ...

  4. openssl生成随机数

    #include <stdio.h> #include <openssl/bn.h> int main() { BIGNUM *bn; bn = BN_new(); //生成一 ...

  5. Microsoft Surface 2019新品发布会汇总

    Microsoft Surface 2019 新品发布会汇总 10月2日晚,微软举行了Microsoft Surface 2019秋季新品发布会,本次发布会涉及如下设备内容等: SurfaceLapt ...

  6. Codeforces Round #304 (Div. 2)(CF546D) Soldier and Number Game(线性筛)

    题意 给你a,b(1<=b<=a<=5000000)表示a!/b!表示的数,你每次可以对这个数除以x(x>1且x为这个数的因子)使他变成a!/b!/x, 问你最多可以操作多少次 ...

  7. error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

    在执行ios 打包的时候,我们通过执行下面的指令来打包ipa: mkdir arch archive_path=arch/${app_name}.xcarchive workspace_name=HP ...

  8. Hello,DTOS!(中)

    org 0x7c00   //主引导程序的入口地址为0x7c00(物理地址),类似于用c或c++程序中的main函数. start:  //定义标签,标签的含义就是mov ax,cs这条指令的地址. ...

  9. 代码审计-ereg正则%00截断

    <?php $flag = "xxx"; if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$&qu ...

  10. @ConfigurationProperties 注解使用

    @ConfigurationProperties 注解使用 依赖和文件 <dependency> <groupId>org.springframework.boot</g ...