前言

0.17后的memos变化挺大的,不过因为作者每次发布的版本都是直接推送到了Docker的Latest的分支上,所以这些版本没有经过一定基数的用户测试,自然无可避免的会出现问题。

所以导致了最近的几个版本出现了性能问题,程序可能在作者的系统上跑的还不错,不过在用户们升上去后因为环境的差异出现了一些莫名奇妙的问题。

大部分用户反应内存占用、CPU占用过高,导致服务器死机,而我则是出现了首页数据等五六秒才会加载出数据的情况。

一开始我还以为单纯是我的问题,后来看到TG群组中大量用户都在反应这个问题才知道出了这么一档子事。

目前已经成功从0.19降级到了0.17,因为目前关于Memos如何降级的资料非常少,所以这里分享一下我的操作过程,希望能帮到有需要的小伙伴。

💡
0.19.x后的数据库似乎修改了数据库结构,无法直接在新版本中使用
根据评论区蜗牛大佬的方案,可以直接修改表结构降级,详情查阅评论区或文末 其他方案 部分内容。

不过从0.17后的界面变化能看出作者也在探索Memos未来的发展方向,看样子是有心往更专业的笔记软件靠拢。

不过从目前的修改来说,我并不是非常看好目前的改动方向,不过这时题外话了。

一:恢复旧版本数据库


我之前写过一个VPS文件备份的脚本,保留了我最近的30天每一天所有docker的data文件备份,并用rclone同步到了OneDrive上。

经过我的筛查,上一个没有大改的版本是0.18.1,这个版本发布于2个月前。

所以最简单的方法是找一个没升级之前的数据库版本,并重新起一个对应版本的容器即可。本来我是会丢失这个版本的数据的,但是我去年12月底换了服务器,新服务器还没开始使用之前写的备份脚本,所以OneDrive上有幸可保留了这部分数据。

如果自己没有手动备份,可以看看容器目录下有没有名为 memos_0.10.0_1673066763_backup.db 的自动备份数据库,这是个memos在大版本升级后保留的自动备份。

(为什么最近的Memos大更新不备份数据了呢??这么简单的容错操作都不执行)

如果以上的几个方案你都没有,那就直接新起一个容器,再执行下方的操作是一样的。

二:迁移数据

💡
好像storage表(S3的配置表)默认不会存在,你可能要现在前端新随便增加一个S3服务

利用一些Sqlite的 ATTACH DATABASE 功能,我们可以附加多个数据库到终端或者GUI工具中,此时再编写 INSERT INTO 语法即可搭配查询语法批量插入数据。

比如我这里使用的 sqlitebrowser 这款开源GUI工具完成操作,并用m19指代高版本数据库,低版本数据库没有别名 ,步骤如下,。

  • 用sqlitebrowser打开低版本数据库,并使用 附加数据库 功能附加m19数据库
  • 编写查询语句看得到的数据是否是目标数据,该语句从m19中查询低版本中数据库不存在的数据
SELECT id, creator_id, created_ts, updated_ts, row_status, content, visibility
FROM m19.memo 
WHERE id NOT IN (SELECT id FROM memo);
  • 如果数据没有问题的话则通过以下一句批量插入
INSERT INTO memo (id, creator_id, created_ts, updated_ts, row_status, content, visibility) 
SELECT id, creator_id, created_ts, updated_ts, row_status, content, visibility
FROM m19.memo 
WHERE id NOT IN (SELECT id FROM memo);

其他表使用同样的方式插入数据即可。

其他方案

根据蜗牛大佬提供的方案,也可以通过修改表结构的方式直接用0.19.x的数据库。

DROP INDEX idx_memo_resource_name;
ALTER TABLE memo DROP COLUMN resource_name;

DROP INDEX idx_resource_resource_name;
ALTER TABLE resource DROP COLUMN resource_name;

希望以上内容对你有所帮助。

Enjoy~!