sqlite3

退出数据库登录

sqlite> .quit

打开数据库

sqlite3 /var/lib/rancher/k3s/server/db/state.db

或者

sqlite3
sqlite> .open /var/lib/rancher/k3s/server/db/state.db

查看该库中所有表

sqlite> .tables

输出

kine

统计该表数据行数

sqlite> select count(*) from kine;

输出

584856

得到表的完整信息

sqlite> .schema kine

输出

CREATE TABLE kine
			(
				id INTEGER PRIMARY KEY AUTOINCREMENT,
				name INTEGER,
				created INTEGER,
				deleted INTEGER,
				create_revision INTEGER,
				prev_revision INTEGER,
				lease INTEGER,
				value BLOB,
				old_value BLOB
			);
CREATE INDEX kine_name_index ON kine (name);
CREATE INDEX kine_name_id_index ON kine (name,id);
CREATE INDEX kine_id_deleted_index ON kine (id,deleted);
CREATE INDEX kine_prev_revision_index ON kine (prev_revision);
CREATE UNIQUE INDEX kine_name_prev_revision_uindex ON kine (name, prev_revision);

(译文:对于SQLite3.1,可以使用“auto-vacuum模式”代替“VACUUM命令”在删除数据后回收空间,可以通过使用auto_vacuum编译指示来使能auto-vacuum模式。使能auto_vacuum模式之后,一个数据库在删除数据后留下的空闲页就可能会被回收,从而缩小数据库文件,而不用使用VACUUM命令重新构建整个数据库。然而,使用auto_vacuum模式将会导致额外的数据库文件碎片。并且使用auto_vacuum模式不会压缩部分数据库的填充页而VACUUM命令则会(压缩)。)

上面的内容来自SQLite官网:http://www.sqlite.org/lang_vacuum.html,下面做些补充:

(1)VACUUM命令是SQLite的一个扩展功能,模仿PostgreSQL中的相同命令而来。在SQLite早期版本中,若调用VACUUM带一个表名或索引名,则将整理该表或索引。后来VACUUM被重新实现,索引名或表名被忽略。

当数据库中的一个对象(表,索引或触发器)被撤销,会留下空白的空间。它使数据库比需要的大小更大,但能加快插入速度。实时的插入和删除会使得数据库文件结构混乱,减慢对数据库内容访问的速度。VACUUM命令复制主数据库文件到临时数据库并从临时数据库重新载入到主数据库,以整理数据库文件。这将除去空白页,使表数据彼此相邻排列,并整理数据库文件结构。不能对附加数据库文件进行以上操作。

若当前有活动事务,该命令无法起作用。对于in-memory数据库,该命令无效。在SQLite3.1中,可以通过使用auto-vacuum模式作为VACUUM命令的一个替代,使用 auto_vacuum pragma开启该模式。

(2)使用VACUUM命令可以在删除数据后使数据库文件减小,在SQLIte3以后有一个替代的办法是使用PRAGMA auto_vacuum。

查询
PRAGMA auto_vacuum;
设置
PRAGMA auto_vacuum =0|1;

查询或设置数据库的auto-vacuum标记。

sqlite3 state.db VACUUM;

正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中再次使用。这种情况下使用VACUUM命令释放删除后留下的空白空间。

当开启auto-vacuum,并提交一个从数据库中删除数据的事务时,数据库文件自动收缩,(VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得数据库文件比不开启该选项时稍微大一些。

另外,“auto-vacuuming must be turned on before any tables are created. It is not possible to enable or disable auto-vacuum after a table has been created”。大概意思是,当有表创建后就不能对auto-vacuum进行更改。

使用auto_vacuum仅仅是将空闲的页除去,并不会像VACUUM那样对数据库进行碎片整理,或是压缩数据库页。使用auto_vacuum会造成而额外的文件碎片。