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. 头像
    frankilla
    降级成功了,但是S3搞不定了,上传图片ok,就是显示不出来。😅
    7月前
  2. 头像
    平安家属子痕 Lv7.志趣相投
    居然从TG来到了这篇文章。
    1年前
  3. 头像
    找不到老数据库文件,还有救么?
    1年前
    1. 头像
      老张 博主
      @Elizen 应该先把老的数据库文件备份呀。
      1年前
  4. 头像
    piter
    刚看到,之前没有安装过,那怎么下载老版本啊,直接第一个代码吗,宝塔面板上的不用部署了吗,求
    1年前
    1. 头像
      老张 博主
      @piter 是的,直接那一行代码就可以了!
      1年前
  5. 头像
    Mr.He Lv4.常来常往
    张老师,这条安装命令运行后显示Unable to find image 'ghcr.io/usememos/memos:0.18.2' locally,怎么办呀?
    1年前
    1. 头像
      老张 博主
      @Mr.He 没有问题呀,正常的呀!
      1年前
  6. 头像
    Chlorine Lv1.萍水相逢
    我试着直接操纵了一下 `memos_prod.db`,的确报错了。应该是 `uid` 那一列存在一个唯一约束,而 SQLite 在处理带唯一约束的列的时候行为非常抽象,不能直接删除。
    1年前
    1. 头像
      Chlorine Lv1.萍水相逢
      @Chlorine 严格来说,是不能直接删除任何列。
      1年前
      1. 头像
        老张 博主
        @Chlorine 老版本数据库没有这一列,从新版降到老版后,这一列就需要删掉了,删了之后才和老版本数据库结构一致! 如果不删,就按我的方法,把新版数据库里数据导出导入到老版本数据库里即可。
        1年前
        1. 头像
          Chlorine Lv1.萍水相逢
          @老张 我写了个脚本,把那两张表其余的列复制出来就可以了。现在也加入 18 版本养老大军了。 想看看有没有什么替代品,感觉这个项目已经让我失望太多次了。
          1年前
          1. 头像
            老张 博主
            @Chlorine 是什么脚本?可以分享下嘛!我是代码小白,新旧数据库我是全手动复制的!
            1年前
            1. 头像
              Chlorine Lv1.萍水相逢
              @老张 我这边大概用的是这个:https://gist.dusays.com/chlorine/9c7b71ab8e094ce286ce924b993c9014,直接改原本的数据库会有问题,就新建了一个空白的。如果是其他表的话,需要根据表的结构改一下表名和列数。 但是我的情况特殊,因为没几条 memos,资源文件也非常少,设置也几乎是空的,所以我记得我没费劲琢磨通用方案,直接把 `id` 列重编码之后改了一下 resource 表的内容,设置就直接丢弃了。所以这个脚本肯定没有普适性,希望能有点用……
              1年前
              1. 头像
                老张 博主
                @Chlorine 不过手动复制也还好,表不多、结构也不复杂,即使手动导出导入,也十几分钟就可以搞定。
                1年前
    2. 头像
      老张 博主
      @Chlorine 从高版本降到低版,那个就要那一例就要删掉,
      1年前
  7. 头像
    sul
    同感,不过我不是搞接口开发,只是要和其他自建应用保持相同域名,把memos放在base url下面,用caddy的response replace插件做的,也是升级个版本就各种替换要变化,现在是固定在0.19.0不动了。
    1年前
  8. 头像
    肖寒武 Lv3.点头之交
    每次动memos我都要人工确认一下数据库文件,太不稳定了,生怕搞丢
    1年前
    1. 头像
      老张 博主
      @肖寒武 每天做好备份就好了,不怕丢。
      1年前
  9. 头像
    keyle Lv2.初识寒暄
    memos 的api设计真的是很糟糕。
    1年前
    1. 头像
      老张 博主
      @keyle 关键是他升级后会乱改!
      1年前
  10. 头像
    大大的小蜗牛 Lv3.点头之交
    虽然我平时不用 Memos,但是我的 Demo 站实时保持更新最新版,也没什么问题。
    1年前
    1. 头像
      老张 博主
      @大大的小蜗牛 你是技术牛呀!
      1年前
😊