由于键 (plugin_name, key)=(discourse-data-explorer, q:-1) 重复,还原失败

升级 Discourse 后,我发现它无法正常工作。我可以看到分类页面,但无法阅读首页或最新页面,例如最新页面:

我已经删除了所有插件,包括官方和非官方插件。但问题仍然存在。

因此,我尝试恢复备份,但发现了以下消息。

[2020-07-12 01:16:20] ERROR:  could not create unique index "index_plugin_store_rows_on_plugin_name_and_key"
[2020-07-12 01:16:20] DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.
[2020-07-12 01:16:20] EXCEPTION: psql failed: DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.

[2020-07-12 01:16:20] /var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
/var/www/discourse/lib/backup_restore.rb:188:in `block in start!'

1 个赞

插件商店中存在损坏的数据。

如果您不关心在数据探索器中保存的任何自定义数据,请尝试:

./launcher enter app
rails c
PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
4 个赞
root@HFT-app:/var/www/discourse# rails c
[1] pry(main)> PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
NoMethodError: undefined method `where' for PluginStore:Class
Did you mean?  when
from (pry):1:in `__pry__'
[2] pry(main)>


似乎出了问题。

你能提供一些更多信息吗?

应该是 PluginStoreRow,而不是 PluginStore。试试这个:

./launcher enter app
rails c
PluginStoreRow.where(plugin_name: 'discourse-data-explorer').delete_all

:warning: 这将不可逆地删除您站点中的所有 data-explorer 数据

4 个赞

那我该怎么办?
论坛现在无法阅读了,似乎是 latest.json 丢失了。

我建议尝试重新构建应用。如果这不起作用,请检查 /logs 中的错误。

1 个赞

如何查看日志?

如果您指的是重建过程的日志,那么这是重建时出现的错误信息(所有红色文字均在此处)。


2020/07/14 11:33:39 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory


#------




2020-07-14 11:33:42.023 UTC [49] LOG:  database system is ready to accept connections
I, [2020-07-14T11:33:46.972466 #1]  INFO -- :
I, [2020-07-14T11:33:46.972792 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
2020-07-14 11:33:47.025 UTC [62] postgres@postgres ERROR:  database "discourse" already exists
2020-07-14 11:33:47.025 UTC [62] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2020-07-14T11:33:47.026573 #1]  INFO -- :
I, [2020-07-14T11:33:47.026936 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2020-07-14 11:33:47.083 UTC [73] postgres@discourse ERROR:  role "discourse" already exists
2020-07-14 11:33:47.083 UTC [73] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists


你好,请问如何运行这段代码?

@xiasummer

仅当且仅当(IFF)您已确认拥有当前数据库和上传文件夹的完整备份时,才能将这些备份移出共享目录,例如(请根据您的配置进行调整):

mv  /var/discourse/shared  /tmp

当然,请确保您已首先完成数据库的完整备份。

然后,您可以从头开始重建:

./launcher rebuild app

之后,您可以通过命令行进行恢复:

cp -rf /tmp/shared/backups/default /var/discourse/shared/standalone/backups

接着,您可以使用最新备份,按正常方式通过命令行执行恢复操作。

这将把您的应用程序备份恢复到您最后一次良好且完整备份时的状态。

仅当且仅当您拥有整个数据库和上传文件的完整且最新的备份时,才推荐执行此操作。

如果您执行了不包含上传文件的备份,当然可以在 /tmp/shared/standalone/uploads 中找到它们,并按如下方式复制:

cp -rf /tmp/shared/standalone/uploads/* /var/discourse/shared/standalone/uploads

在所有操作恢复正常,并且您确认恢复过程符合预期后,当然可以删除您的临时目录:

rm -rf /tmp/shared

这是其中一种可行的方法。

可能还有其他方法,但如果您拥有当前且良好的完整备份,我会按上述方式操作。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.