Memos完美降级到Memos0.18.2版

前几天一直都在折腾Memos,原因就是我的Docker容器是利用《如何优雅的一键升级宝塔面板多个Docker容器》的watchtower项目,通过计划任务每周定时检测Docker版本并完成自动更新。所以我的所有Docker版本都是一直保持着最新。也就是这点,违背了"求稳不求新"的原则,导致出现了一些问题。最为严重是Memos,作者更新很随意导致新版本的数据库结构、API接口都发生了改变,与目前使用的"哔哔点啥"的memos页面出现不兼容。

国庆节前,折腾把《完美解决Memos页评论与博客哔哔页面评论互不显示问题。》的问题解决了,方法就是备份数据库文件后直接删除新版Memos容器,安装Memos0.18.2版老板容器,并恢复数据库文件。安装后并没有经过大久测试,结果新的问题出现了。降级后Memos不能发布内容了,乖乖,这可是个大问题。

经过分析,不能发布内容的原因就是新老版本的Memos的数据库结构发生了改变,那么解决的思路也就是把新版数据库数据结构修改为与memos0.18.2保持一致即可。

备份数据库、删除新版安装memos0.18.2版

我在《无需代码,宝塔面板Docker部署便签工具Memos》提到过,当初我们在部署Memos时,已经把Docker内的数据库文件memos_prod.db映射到服务器上,找到新版数据库文件下载到本地后,可以另存为其他名称后删除最新版本memos容器。这次我是直接使用代码安装的0.18.2版,代码如下:

docker run -d --init --name memos --publish 5230:5230 --volume /docker-data/memos/:/var/opt/memos ghcr.io/usememos/memos:0.18.2

利用Navicat Premium工具导出-修改-导入数据库文件

安装好0.18.2版之后,到/docker-data/memos/下同样把memos_prod.db文件下载到本地。

这个时候我们请出今天的主角,Navicat Premium,直接到官网下载即可,14天的试用时间,完全够你折腾了。利用Navicat Premium同时连接打开新、老数据库文件。

经过比较你就会发现新版数据库文件中表名为memo的字段比0.18.2版本多一列uid字段。第一思路就是在新版表memo的uid字段上直接右键点删除,结果报错,只能另寻思路,如果这一步哪位大神有什么方法,一定要分享出来,因为正面我的方法比较繁琐。

那简单方法行不通,只能通过繁琐的方法了,把数据库表的内容导出成可编辑的文件,在相应软件里把memos的uid字段删除后再导入0.18.2版的数据库。具体方法如下:

选中新版数据库memo表,选择工具-导出,这里我选择的是excel数据表(*.xls),导出后用ecxel打开你导出的表格,直接把uid这一列删除即可。注意,这个时候我们再连接0.18.2数据库的memo表,再选择工具导入,注意一定要选对文件类型把修改后的excel文件导入。这个时候,我们就完美地把memo这个表导入了。

其他表的内容按上步方法导出-修改-导入,其实也就是memo和表resource两个表需要删除uid字段,其他像标签、用户、用户设置、系统设置等表只需要把内容导出成excel文件后再直接导到0.18.2的数据库即可。这样就完成了所有的数据迁移工作。

停止容器,恢复数据,完美降级

在服务器上把Memos这个容器先停止,把0.18.2版数据库文件上传到你映射的目录,覆盖旧文件即可。再重新启动容器,OK,十分完美地把Memos0.22.2降到Memos0.18.2版。

经过这一周多时间的测试,再无任何问题,Memos降级完美完成!

评论区

共 47 条评论
  1. 头像
    满心 Lv5.熟稔有加
    感觉memos加载还是有点慢
    1年前
    1. 头像
      老张 博主
      @满心 慢的原因应该是CDN吧。
      1年前
  2. 头像
    Liudon Lv2.初识寒暄
    你这假期也不闲着呀 😂
    1年前
    1. 头像
      老张 博主
      @Liudon 都是在折腾memos了。
      1年前
  3. 头像
    粽叶加米 Lv5.熟稔有加
    折腾也得有技术,话说memos更新这么玄学吗。
    1年前
    1. 头像
      老张 博主
      @粽叶加米 是的,更新后会有很多问题。
      1年前
  4. 头像
    秋风于渭水 Lv4.常来常往
    Memos这玩意是绝对不更新的,完全是个人自用项目的形状,功能说删就删,API刷刷改,数据库结构直接做不兼容升级。
    1年前
    1. 头像
      老张 博主
      @秋风于渭水 是的,选一个稳定的版本算了,不能升。
      1年前
  5. 头像
    obaby Lv8.把酒言欢
    技术流。
    1年前
    1. 头像
      老张 博主
      @obaby 都是瞎折腾,没有你“代码流”厉害!
      1年前
  6. 头像
    klcdm Lv3.点头之交
    memo是绝对不升级的,升级改了一大把东西,老版本足以了,我是自己单独弄了一个内嵌的页面
    1年前
    1. 头像
      老张 博主
      @klcdm 是的,我现在停留在0.18.1上,
      1年前
  7. 头像
    落落vici Lv1.萍水相逢
    我的memos版本还停留在0.17.0,够用好用就OK了,不去折腾了。
    1年前
    1. 头像
      老张 博主
      @落落vici 能稳定运行就行,现在我也不求新了,求稳。
      1年前
  8. 头像
    萧瑟 Lv6.推心置腹
    Docker我一般都是求稳不求新
    1年前
    1. 头像
      老张 博主
      @萧瑟 主要是之前我用了自动更新功能,把所有的Docker都保持了最新版本,才导致出现了不少问题。
      1年前
  9. 头像
    电脑星人 Lv1.萍水相逢
    Memos 我用了一年多,期间搞过多次 breaking change,有些时候第三方 APP(MoeMemos)和浏览器扩展更新稍慢,未来得及兼容新版本的 Memos,以及 Memos 本身新版本的问题,导致了许多不便。后来我打定主意锁定在一个版本,如非必要就不更新了。 这里 Memos 的数据库最好定期备份一下,用 SQLite 的话直接备份文件也不麻烦。 另外,Memos 在跨版本升级数据库的时候,是有编排 SQL 的(https://github.com/usememos/memos/tree/main/store/migration/sqlite/prod),如果升级变更数据库的路径上只有表结构变更的操作,且没有删除数据的操作,可以反推得到降级的 SQL(应该可以用 GPT 协助编写)并执行,实现无损降级。 (但很不幸有一次我想降级版本的时候恰巧无法无损降级,升级的时候有一个表的字段直接被删除,无法恢复)
    1年前
    1. 头像
      老张 博主
      @电脑星人 现在,很多用memos的伙伴们都选择不升级,目前还有人用0.14.X的呢。不过听说0.18.X最为稳定,所以我就降到了0.18.1了。
      1年前
  10. 头像
    Chlorine Lv1.萍水相逢
    张叔这个方法好啊,想起我之前一点点写逆向 SQL,累得够呛。
    1年前
    1. 头像
      老张 博主
      @Chlorine 因为不会代码,所以只能想到最为笨的方法。虽然麻烦了点,但是也还是解决了。
      1年前
😊