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. OpenGL入门1.3:着色器 GLSL

    前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一 ...

  2. WPF toolkit AutoCompleteBox

    checked http://www.broculos.net/2014/04/wpf-autocompletebox-autocomplete-text.html#.WGNnq4N95aQ. 1.S ...

  3. MVC三层架构搭建

    MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...

  4. 面试官都叫好的Synchronized底层实现,这工资开多少一个月?

    本文为死磕Synchronized底层实现第三篇文章,内容为重量级锁实现. 本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁.轻量级锁.重量级锁的加锁.解锁.锁 ...

  5. 开发技术--Python核心知识A

    开发|Python核心知识A A篇,主要介绍Python基础中列表,元祖,字典,集合,字符串,I/O,条件与循环,异常处理的底层知识与使用的注意事项. 希望大家对于Python会有新的收获,本篇不同于 ...

  6. 阿里云 centos7 安装MySQL8.0.13

    1.下载MySQL安装包(这里是有技巧的,说不定我这时写这个的时候版本还是你看到时的旧版本了,如果已经不是8.0了,可以根据这样来 下新版本) 先进入官网 再将这两者一结合,就是最新版本的了 所以 [ ...

  7. [b0016] python 归纳 (二)_静态方法和类方法

    # -*- coding: UTF-8 -*- """ 测试 类的静态方法,类方法 @staticmethod @classmethod 总结: 1. self 指向类对 ...

  8. flask uwsgi和nginx配置信息

    1. 安装 pip3 install uwsgi 2. uwsgi配置信息 创建一个uwsgi.ini文件 [uwsgi] socket=/opt/script/uwsgi.sock #启动程序时所使 ...

  9. 多个python版本共存时的pip配置

    两种方法来配置pip Func1: 1.1 找到python环境的安装包,将python.exe文件重命名,如:将python2.7版本的python.exe重命名为Python2.exe,将pyth ...

  10. 以太网PHY寄存器分析【转】

    转自:https://blog.csdn.net/Firefly_cjd/article/details/79825869 以太网PHY寄存器分析    1 1.以太网PHY标准寄存器分析    2 ...