前言
由于之前我是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/xxxx3. 先备份
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 = XJSON 里
"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-17. 检查是否报错
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] 自己