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

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

⚠️ 风险提醒: 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() 即可

【免责声明】

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

  • 思源笔记

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

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

    26568 引用 • 110545 回帖
  • 代码片段

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

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

    215 引用 • 1520 回帖
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 回复
  • JeffreyChen 1 1 评论

    关闭笔记的内容在 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
正在努力开发 wilsons 工具箱中 🛠️ 目前已正式入驻爱发电啦!💖 想催更、提需求?欢迎访问 👉 https://afdian.com/a/wilsons

推荐标签 标签

  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 158 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 358 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 651 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 42 关注
  • Follow
    4 引用 • 12 回帖 • 6 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 262 关注
  • 自由行
    2 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 45 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 543 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 112 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 641 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 8 关注
  • 开源中国

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

    7 引用 • 86 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    119 引用 • 321 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 267 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注