从3.0.0更新到3.0.1时出现问题

您好,

今天我将 Discourse 应用更新到了 3.0.1。更新在处理 postgres 迁移时失败了。
具体如下:

2023-01-27 04:50:48.628 UTC [483] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 04:50:48.628 UTC [483] discourse@discourse DETAIL:  Key (name)=(e-mail) already exists.
2023-01-27 04:50:48.628 UTC [483] discourse@discourse STATEMENT:  UPDATE tags t
	SET public_topic_count = x.topic_count
	FROM (
	  SELECT
	    COUNT(topics.id) AS topic_count,
	    tags.id AS tag_id
	  FROM tags
	  INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
	  INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
	  INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
	  GROUP BY tags.id
	) x
	WHERE x.tag_id = t.id
	AND x.topic_count <> t.public_topic_count;
	
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

似乎有些标签有重复。我连接到 postgres 并修正了这些标签。之后迁移和更新就成功了。

我的问题是,我直接操作数据库是否正确?我只更改了重复标签的名称。
我无法确定重复标签是如何创建的。它们是在过去 2 到 3 年左右插入的。
我不确定这种情况是否会再次发生。

1 个赞

我遇到了同样的问题

你遇到了完全相同的症状吗?

ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(e-mail) already exists.
1 个赞

是的。这也归因于重复的标签/index_tags_on_name。
在我的例子中,标签的命名只是不同。

目前正在尝试弄清楚:

  • 如何将 ruby 升级到 3.0.0,因为它抱怨 web-push 是 2.6.7,所以我甚至无法进入 rails c,来执行修复标签的命令
  • 如何安全地从 postgres 数据库中删除标签,但还没有线索
1 个赞

请发布显示您案例中错误的日志片段!

如果有人要找出这些重复键值是如何产生的,他们会欣赏更多的细节。

抱歉,我无法帮助数据库修复。

关于 Ruby 问题,我认为您需要进行命令行升级(*)。请参阅例如

(*)编辑:但请看下面,由于数据库现状,升级失败。糟糕。

2 个赞
I, [2023-01-27T07:46:34.317438 #1]  INFO -- : \u003e cd /var/www/discourse \u0026\u0026 su discourse -c 'bundle exec rake db:migrate'
2023-01-27 07:46:45.663 UTC [584] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.
2023-01-27 07:46:45.663 UTC [584] discourse@discourse STATEMENT:  UPDATE tags t
        SET public_topic_count = x.topic_count
        FROM (
          SELECT
            COUNT(topics.id) AS topic_count,
            tags.id AS tag_id
          FROM tags
          INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
          INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
          INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
          GROUP BY tags.id
        ) x
        WHERE x.tag_id = t.id
        AND x.topic_count <> t.public_topic_count;

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(hws-connect) already exists.

这个错误出现了3次,因为标签似乎在3个主题中被找到。

如果早知道会这样,我真后悔启用了标签功能,而且为什么前端没有关于此的警告。
我只想删除它们,让我的论坛重新运行起来 :cold_sweat:

1 个赞

我可以根据需要重建应用程序。我收到错误并且它中止了。因此 Ruby 仍未升级。
我基本上卡住了。

1 个赞

您好,

也许可以像这样进行选择:
SELECT * FROM tags WHERE name LIKE '%hws-connect%'

您应该会找到多个同名的标签。这正是我遇到的问题。

1 个赞

我执行了一个选择:

我的问题是,我是否可以在不破坏 discourse 基础设施的情况下重命名数据库中的“hws-connect”标签?
还有……我该如何通过 postgres 重命名它?

好的,有几件事:

  • 当你运行自己安装的、由超级社区支持的、价值数百万美元的软件(你几乎免费使用)时,你必须接受一些奇怪的故障。
  • 我最近更新了两个大量使用标签的网站,并且没有遇到任何问题。
  • 在我运行多个 Discourse 实例的 5 年多时间里,我认为我只遇到过一次类似的问题?

总之,这看起来与此问题非常相似,也许你可以采用类似的策略来解决?:

看起来你已经走在正确的道路上了,你只需要继续下去……

2 个赞

我知道,这与 Discourse 或升级本身无关。它会发生,没关系。
只是希望我不会遇到一个卡住的场景,在那里我必须与如此多的主题(docker、ruby、postgres、discourse)作斗争。这并非我日常工作,需要投入时间。

谢谢你的链接!
我会更新我的状态。

1 个赞

更新:从你的话题中,@merefield 最棒的收获是:

我想我应该勇敢一点

:smiley:
对我来说,在数据库中进行操作总是令人害怕,但这次奏效了。

对于遇到同样问题(重复的标签 / index_tags_on_name)的任何人:

  1. 伸伸懒腰,开始“盗梦空间”第一阶段:
    cd /var/discourse
    sudo ./launcher enter app

如果失败了,出现类似“没有正在运行的 docker 容器”之类的提示,请键入:
sudo docker ps -a --no-trunc
这将列出你可用的 docker 容器和 ID。然后使用它重启容器。
sudo docker restart <container ID>
然后 sudo ./launcher enter app 应该就能工作了。

  1. 访问你的 postgres 数据库,开始“盗梦空间”第二阶段:
    su discourse
    psql
    重建错误日志应该已经告诉你了罪魁祸首的标签名称。在我的例子中是:
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.

所以首先用以下命令搜索你的标签:

select * from tags where name='hws-connect';

这会给你上面我在帖子中看到的表。

  1. 我只是将 hws-connect 标签重命名为 hws-connect1,使用:
UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect';
  1. 以一些后踢的方式离开“盗梦空间”:
    \q 离开 postgres
    exit 离开 docker 容器
  2. 使用 sudo ./launcher rebuild app 再次进行重建。
  3. 为它奏效而感到高兴,并在前端验证你所做的操作:
    访问你的标签页面 https://your-forum/tags

我不知道它是如何发生的,为什么这次升级会如此糟糕——之前的所有升级,无论是通过 Web 还是终端,都工作正常。
我现在要清理我的标签了。

奖励:

  1. 点击重命名的标签。
  2. 将其从所有主题中移除。在我的例子中是 3 个。
  3. 返回标签页面,使用右上角的功能:

全部完成。 :v:
感谢大家的所有帮助。

10 个赞

干得好!做得非常棒!

1 个赞

精彩的解释(以及展示的勇气),谢谢!

我的论坛也使用标签——这里也是,有很多标签:
https://meta.discourse.org/tags

显然,可能会发生罕见且不幸的事情,导致创建重复的键值。

3 个赞

我也被这个问题困扰了。感谢分享你的手动修复方法,我刚刚用它修复了大约 20 个问题。

我的论坛在使用各种混合大小写的标签时,直到升级之前从未出现过问题。似乎存在一个 bug 导致创建了重复条目,而不考虑大小写。

  id   |          name          |         created_at
-------+------------------------+----------------------------
   707 | ParkRide               | 2019-05-21 21:36:53.213993
 18982 | ParkRide               | 2020-06-05 18:43:09.409895

(是的,它们周围的空格有差异)

我现在只剩下一个重复项无法修复:

discourse=> select name from tags group by name having count(*) > 1;
    name
------------
 Bike--Ride
(1 row)

discourse=> UPDATE tags SET name = 'Bike--Ride_2' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_2) already exists.
discourse=> UPDATE tags SET name = 'Bike--Ride_3' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_3) already exists.
discourse=> UPDATE tags SET name = 'something is broken here' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(something is broken here) already exists.

而升级时失败,显示:

2023-02-01 18:56:58.610 UTC [475] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-02-01 18:56:58.610 UTC [475] discourse@discourse DETAIL:  Key (name)=(Bike--Ride) already exists.

有什么办法可以解决这个问题吗?

谢谢。这对我升级很有帮助!

1 个赞

我遇到了同样的错误——无论我使用什么新的标签名称,它都报告说它已经存在了。我通过使用 id 而不是 name 列来更新标签来解决这个问题:

UPDATE tags SET name = 'tag1' WHERE id = 1234

1 个赞