[js] 清理未引用的数据库

本贴最后更新于 348 天前,其中的信息可能已经物是人非

⚠️ 风险提醒: 0.0.4 之前的版本,会误删除已关闭的笔记,建议立即更新到 0.0.4 及以上!

感谢 @EmptyLight 发现和提出,感谢 @player 和 @JeffreyChen 大佬的帮助!


最近测试数据库,不小心整出 100 多个数据库,这。。。。

于是就写了这个 js,自测下来没啥问题,而且我的 100 多个数据库都正常删除了。

分享出来让大家帮忙测测 😳 ,刚才说错了,是分享给需要的小伙伴们!!!

默认未引用的数据库文件会删除(移动到)/data/trash/av 目录下,如果误删除了,可以把误删除的数据库文件复制到/data/storage/av 下即可恢复。

代码如下:

https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%B8%85%E7%90%86%E6%9C%AA%E5%BC%95%E7%94%A8%E6%95%B0%E6%8D%AE%E5%BA%93.js

使用方法:

方法一、

思源主菜单底部 -> 清理未引用数据库(如果打开了控制台,可以在控制台查看详情)

image.png

方法二、

在控制台执行 clearUnRefAvs() 即可

【免责声明】

由于涉及文件删除,请严格测试无误后谨慎使用,使用前请做好备份工作,由此带来的任何后果自负!!!均与作者及代码无关!!!

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119783 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    285 引用 • 1986 回帖
2 操作
wilsons 在 2025-07-22 17:57:30 更新了该帖
wilsons 在 2025-07-22 17:57:02 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 默认未引用的数据库文件会删除(移动到)/data/trash/av 目录下,如果误删除了,可以把误删除的数据库文件复制到/data/storage/av 下即可恢复。

    为了以防万一肯定是一直留着,所以清理了,但是又没清理(

    1 回复
  • EmptyLight

    我记得在关闭的笔记本中好像有数据库,这个有做判断处理吗,可以避开笔记本关闭这种情况吗(我改天心血来潮测测

    1 回复
  • wilsons

    为了以防万一肯定是一直留着,所以清理了,但是又没清理

    看个人习惯了,其实不用一直留着,只要定期没发现问题,可以安全删除的。

    这类似于回收站功能,回收站里的数据一般也不会一直保留吧。

    1 操作
    wilsons 在 2025-01-07 22:14:08 更新了该回帖
  • wilsons

    可以,只要在文档中引用了数据库就不会被删除。

  • wilsons

    更新至 0.0.2 增加删除前确认是否删除,防止误触

  • EmptyLight 1 3 评论

    最新反馈来了,在思源 3.2.0 和代码 0.0.2 版本下,删除未引用的数据库会把关闭笔记本的数据库一起删掉。如果打开笔记本就不会删掉了。可以通过关闭含数据库的笔记本点击删除,再打开笔记本点击删除,查看两次删除文件数对比发现这点。

    (是不是后端 API 改了有地方不一样了)

    感谢!我知道原因了,之前测试关闭的笔记,用空数据测试,思源重新打开笔记时会新建一个空数据库。这样就看不出来被删除了。稍后修复。
    wilsons
    @wilsons 同一个块有多个数据库是啥情况?不是只能有一个数据库吗
    JeffreyChen
    @JeffreyChen 你说的对,防御型措施而已,这里其实加不加都一样,因为是按 av 类型自动筛选的,不会出现多个情况。但如果用户复制 id 的情况就有可能,因为用户可能复制的是超级块的 id。
    wilsons
  • player 1 赞同 1 评论

    好久以前我也做了类似的功能

    image.png

    还有闪卡清理

    image.png

    在加上调用,清理图片,清理空间的 api。

    可以做思源 360 清理大师。

    await siyuan.createSnapshot('xx'); 先备份。

    await siyuan.removeUnusedAssets();

    await siyuan.performSync();
    await siyuan.purgeRepo();
    await siyuan.purgeCloudRepo();

    await siyuan.getMissingAssets();提醒用

    
    
    👍
    wilsons
  • 我的方法是,读取所有 .sy .av(好像是,不用 db 好久了) ,过滤里面的 id。 如果有就不删除,否则都删除, 闪卡和 db 一样。这样可以避免误删除一些关闭的笔记本的内容。

    1 回复
  • wilsons

    我用这个从数据库查询

    await querySql(`select * from blocks where type = 'av' limit 999999;`);

    然后 再读取/data/storage/av/下的所有.json 文件

    await requestApi('/api/file/readDir**', {path: '/data/storage/av/'**});

    二者对比,在 db 中的就保留,不在就删除。

    这个不会删除关闭笔记的内容吧,关闭笔记的内容在 db 中也存在的吧。

    2 回复
  • 关闭笔记的内容在 db 中也存在的吧

    关闭的笔记本不参与索引,是不存在的

    我知道原因了,之前测试关闭的笔记,用空数据测试,思源重新打开笔记时会新建一个空数据库。这样就看不出来被删除了。感觉重新打开笔记时,如果目标数据库不存在了,应该不显示数据库吧,而不是新建一个空数据库,先保留意见。
    wilsons
  • EmptyLight 2 评论

    @wilsons 不行啊,我这里测试都是打开的笔记本才算引用

    这个数据库是斜杠菜单直接创建的,没做过什么修改

    这个是 0.0.3,待会修了新版本再提醒我一下,好累了,去歇了
    EmptyLight
    @EmptyLight 0.0.4 已修复
    wilsons
  • player 1

    我读取所有 .sy .av,是因为关闭的笔记本的内容不在 sqlite。

    具体是,读取所有.sy .av,合并为大文本,放到内存。然后识别所有 id。 这些 id 就是认为是有效的 id,不能删除。 当然也有例外,但做到不会误删,但会有小概率保留可以删除的。

    1 回复
  • wilsons 5 评论

    感谢帮助!

    我现在的方案是:

    1)先从数据库查询

    await querySql(`select * from blocks where type = 'av' limit 999999;`);

    2)然后 再读取/data/storage/av/下的所有.json 文件

    await requestApi('/api/file/readDir**', {path: '/data/storage/av/'**});

    3)1 和 2 对比,如果已存在 1 中的保留,否则作为待删除的文件,比如叫 deFiles

    4)然后获取已关闭的笔记列表,并获取已关闭笔记下的所有文件

    5)从 4 的文件中匹配 AttributeViewID 的值,如果匹配到,则保留,然后把 delFiles 中该数据库的 id 删除

    6)这样最后剩下的 delFiles 已经过滤掉了已关闭的笔记中的数据库了

    这样达到性能和稳定的平衡。

    另外,我看了你的源码,发现!bigText.includes(`"AttributeViewID":"${id}"`)这样匹配可能有一点点小问题,就是用户可能会不压缩 json,思源中可以设置的。这样的话,冒号后面就有个空格,上述方法就匹配不到了,建议做个兼容。

    1 回复
    话说在编辑器中已删除数据库还可以通过 id 引用回来吗,还是说需要操作 HTML 了
    EmptyLight
    @EmptyLight 没清理的可以,清理的需要先恢复数据库 json 文件。具体怎样需要更细的描述。
    wilsons
    我记得看过,不压缩的,也是"AttributeViewID":"${id}"
    player
    @wilsons 没清理的数据库,在编辑器中已经彻底移除引用了,后续想要重新在编辑器中引用这个数据库应该怎么操作
    EmptyLight
    @EmptyLight 首先你得知道数据库 id,然后用下面的代码 粘贴到编辑器即可 <div data-type="NodeAttributeView" data-av-id="👉这里是数据库id👈" data-av-type="table"></div> 或者通过文件历史恢复,如果已删除的文件可以从删除中恢复。
    wilsons 1
  • player 1 评论

    你的尝试会提高不少速度。

    我觉得还是扫描所有 id 稳妥。就怕有内容中的引用。

    另外,我扫描所有文本后,可以给闪卡清理也使用。

    嗯嗯,闪卡没有研究,应该也可以二者结合吧。
    wilsons
  • wilsons 1 2 评论

    @player 不清楚,会不老版本没有空格?最好都兼容下,我看的新版本是有空格的。

    image.png

    多谢帮忙找了个 bug。
    player
    @player 也多谢你提供的帮助,让我少走了很多弯路。不过,空格这个是小概率事件。一般普通用户不会改,即使改一般也仅在测试环境使用估计。
    wilsons
请输入回帖内容 ...
wilsons
正式入驻知乎了,以后新贴主要在这里。 欢迎大家订阅关注! 你的关注对我是莫大鼓励,也能让我持续产出优质内容,我们一起成长 🙏 点这里立即关注:https://www.zhihu.com/people/wilsonses

推荐标签 标签

  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    215 引用 • 358 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4602 回帖 • 731 关注
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 693 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 443 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 702 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 646 关注
  • 博客

    记录并分享人生的经历。

    274 引用 • 2393 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 494 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 436 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 577 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 46 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 3 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    950 引用 • 1460 回帖 • 2 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 768 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    40 引用 • 157 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注