前言

由于之前我是Halo 1.0 时代的, 1.0时代的某一个版本和前一个版本的备份是不互通的。

所以我之前花了很长一段时间把文章全部搬运了过来。但是现在又有一个问题,就是文章的时间其实无所谓,但是心情/瞬间的时间是需要精确的,因为这个代表了当时我的心情是如何如何的,但是文章这件事情,其实说实话,时间没有那么有所谓。

于是乎,只能够动用一些歪点子了。

看看后台数据库能不能改~!

答案是,可以改!

正文

主要流程:

现在web后台创建 -> 去数据库找到 -> 更改 -> 成功!

其实和CE的很像,就是在可以看见的地方改数据,然后去找数据。

1. 后台创建瞬间

在 Halo 后台:

  • 正常发布一条瞬间

  • 内容写一个容易识别的,比如:

c

2. 在terminal找到这条记录

进入数据库:

docker exec -it halo-halodb-1 bash
psql -U halo -d halo

查:

SELECT name, version, convert_from(data, 'UTF8')
FROM extensions
WHERE convert_from(data, 'UTF8') ILIKE '%补档-2020-05-01%';

记住:

name = /registry/moment.halo.run/moments/xxxx

3. 先备份

SELECT convert_from(data, 'UTF8')
FROM extensions
WHERE name = '刚刚查到的 name';

4. 修改时间

我们要修改 3 个字段:

4.1 releaseTime

"releaseTime":"2020-05-01T08:30:00Z"

4.2 creationTimestamp

"creationTimestamp":"2020-05-01T08:30:01Z"

4.3 approvedTime

"approvedTime":"2020-05-01T08:30:02Z"

4.4 SQL通用模板

UPDATE extensions
SET data = convert_to(
  replace(
    replace(
      replace(
        convert_from(data, 'UTF8'),
        '"releaseTime":"原时间"',
        '"releaseTime":"目标时间"'
      ),
      '"creationTimestamp":"原时间"',
      '"creationTimestamp":"目标时间+1秒"'
    ),
    '"approvedTime":"原时间"',
    '"approvedTime":"目标时间+2秒"'
  ),
  'UTF8'
)
WHERE name = '你的moment name';

5. 对齐 version(最关键防坑)

先查当前:

SELECT name, version, convert_from(data, 'UTF8')
FROM extensions
WHERE name = '你的moment name';

你会看到:

  • 外层 version = X

  • JSON 里 "version": Y


对齐方法:

把 JSON 里的 version 改成和外层一致:

UPDATE extensions
SET data = convert_to(
  replace(
    convert_from(data, 'UTF8'),
    '"version":旧值',
    '"version":外层version值'
  ),
  'UTF8'
)
WHERE name = '你的moment name';

6. 重启 Halo

docker restart halo-halo-1

7. 检查是否报错

7.1 日志

grep -i "Optimistic locking failure" ~/halo/halo2/logs/halo.log | tail -n 10

没有新报错 = 成功


7.2 数据库锁

SELECT * FROM pg_locks WHERE NOT granted;

空 = 没锁

8. 完成!

然后应该就可以看见在 6年前的位置显示了。

总结

如何通过邪修! 重新把瞬间上传回自己的blog~!

参考

[1] ChatGPT

[2] 自己

立志做一个有趣的碳水化合物。