严重错误:用户名已更改,用户数据损坏

我刚刚应某人要求将其用户名从 xxx 进行了更改。他们希望获取一个不活跃的用户名 yyy。因此,我首先将不活跃的用户名 yyy 更改为其他名称(例如 yyy1),然后将该用户的用户名从 xxx 更改为 yyy

此时,该用户无法发布任何内容,我在日志中看到了以下错误:

Job exception: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_username_lower" DETAIL: Key (username_lower)=(mina) already exists.

我尝试将用户名改回之前的状态,但现在他们的所有历史记录都消失了。究竟哪里出了问题?

你能重现这个问题吗 @tshenry

现在我甚至无法打开他们的个人资料页面。在此期间,有什么办法可以解决这个问题吗?

我正在按你 outlined 的步骤进行操作。我会告诉你我发现的情况。

顺便说一句,我不知道为什么这个用户(username_lower)=(mina) 会报错。我从未对它做过任何更改,而且它似乎是一个不活跃的用户。然而,我在他们的个人资料上也看到了一些奇怪的行为。如果我打开他们的通知页面,会收到 404 错误。

好的,我已经按步骤操作了一遍。如果我有任何与你的操作不同的地方,请告诉我。

目前有两个用户:

  • xxx(活跃账户)
  • yyy(非活跃账户)
  1. yyy 改为 yyy1
    xxx 改为 yyy
    :white_check_mark: 对我有效)

  2. 尝试使用新的 yyy 账户发帖
    :white_check_mark: 对我有效)

  3. yyy 改回 xxx
    :white_check_mark: 对我有效,用户历史记录未丢失)

整个过程我没有遇到任何问题。需要注意的是,在用户管理页面修改用户名后,你需要刷新页面,才能使“显示公开资料”按钮正确跳转到对应用户。

你可以检查一下 /admin/logs/staff_action_logs,确认所有记录的用户名更改是否合理。点击列出的用户名头像,应该能跳转到他们当前正确的用户页面。

是的,点击头像确实会跳转到他们的页面。不过,我觉得他们的页面似乎有些“不活跃”。例如,我无法查看他们的邮箱或冒充其账户:

这是我目前所做的操作:

根据我在该报告中看到的情况,我首先将 fatemeh 改为 fatemeh12,然后将 fatemeh_baghdadi 改为 fatemeh。过了一会儿,该用户告诉我他们无法发布任何内容。因此,我怀疑在更改用户名的过程中可能出现了问题,于是尝试将用户名更改为一个尚未使用过的名称。于是我将 fatemeh(此前为 fatemeh_baghdadi)改为 fatemeh74。随后我发现他们的历史记录被完全清空了,这让我感到十分紧张。于是我又尝试将用户名改回最初的状态,即从 fatemeh74 改回 fatemeh_baghdadi,接着又从 fatemeh_baghdadi 改为 fatemeh_baghdadi5,但情况并未好转。现在我有两个不同的用户:fatemeh74fatemeh_baghdadi5。理论上他们应该是同一个人,但实际上却是两个人,其中一人似乎无法正常工作。

我已经在尽力跟进这里的情况了。听起来这确实是个非常奇怪的状况!

能否请您澄清一下,当您说他们的历史记录被完全清空时具体是什么意思?fatemeh_baghdadi5 的档案“活动”部分是否应该列出各种主题和回复?

如果是这样,那些帖子现在是否已关联到 fatemeh74 账户?它们应该仍存在于网站的某个地方,并与特定用户关联。从匿名用户的角度来看,我无法在您的网站上找到用户名为 fatemeh74 的账户。

有一个名为 EnsureDbConsistency 的后台任务每 12 小时运行一次。也许可以尝试从 Sidekiq 手动触发它,或者等待看看是否会在接下来的 12 小时内自动修复所有问题。

如果您最终发现有两个本应合并的账户,您应该可以 将它们合并。不过,在执行此操作之前,我强烈建议您先进行备份。

在没有直接访问所有相关内容的情况下,很难完全理解发生了什么,但希望我们最终能弄清楚!

在我更改用户名的那一刻,我查看了他们的个人资料,发现没有任何帖子等内容,但过了一会儿问题就解决了。不过现在,fatemeh74(这看起来确实是正确的人)似乎有些 inactive。我的意思是,正如你所见,我们无法看到他们的个人资料页面,而他们的帖子和其他内容却仍然存在。就像这样:

https://talk.zabanshenas.com/t/topic/29066/3?u=hnaseri

它们实际上并不是同一个账户。我检查了他们的邮箱和 ID,发现它们完全不同。然而,根据我更改用户名的步骤,它们本应该是相同的,而且我实际上不应该在这里有两个用户。

这个任务具体在哪里?

感谢你提供这个示例。这确实令人担忧。

你可以在 /sidekiq/scheduler 中找到相关列表。不妨一试,但根据你刚才发布的内容,听起来可能存在更深层的问题。

不幸的是,你说得对。这并没有解决我的问题。

@tshenry 我是否可以拥有两个用户名完全相同,仅首字母大小写不同的账户?

我认为这可能与该问题有关。

这是一个有趣的观察!

用户名实际上是不区分大小写的,因此您不应该能够拥有两个用户名相同的用户。然而:

您可以看到,在搜索 fatemeh12 时似乎返回了两个不同的用户名。这本来不应该发生(我无法复现此问题)。看起来它们都指向同一个个人资料。

我现在不知该如何继续。如果到明天这个时候还没有人回应,我会尝试找一些有新想法的人来协助。如果您在此期间发现任何您认为相关的额外信息,请发布出来。

目前我的理解是这样的:在第一步中,我试图将 fatemeh 改为 fatemeh12,以使该用户名可用。然而,系统中已经存在 Fatemeh12 这个用户名,因此实际上我不应该被允许将 fatemeh 改为 fatemeh12。但奇怪的是系统却允许我这样操作,而从那时起数据库就出现了问题。

@tshenry 你找到什么了吗?目前用户 fatemeh74 之前已经消失,但不知为何又恢复了。不过我还不确定具体原因。我想确保今后不再发生这种情况,所以我需要弄清楚为什么会出现用户名仅大小写不同的情况,以及为什么 Discourse 没有阻止这种情况。我的 Discourse 已经更新过了。

你好 :wave: 听到这个消息太好了。我原本希望后台任务在一段时间后能发挥作用,看来确实如此。

我还没有机会进一步调查这个问题。由于我们无法访问您网站的数据库,只能为托管客户提供深入排查,因此能提供的帮助非常有限。

这是我们首次收到此类情况的报告,我也无法复现该行为。我怀疑这是您实例中的一个边缘情况。我们当然会在未来留意是否出现类似情况。如果您想格外谨慎,建议在更改用户名之前,先确认没有其他用户拥有相同的用户名。

如果发送我的数据库副本有助于查找问题,我可以提供。

我什么都没做,但用户又出问题了 :|。我的数据库肯定出了问题。

我们长期以来也一直遇到同样的问题——当然,无法复现数据库是如何进入这种状态的,但每隔一段时间,就会出现用户在重命名宽限期将自身重命名为重复名称的情况,管理员重命名时也会出现此问题。

我们不使用 Unicode 用户名,这有时相当棘手,因为它会导致 Patreon 插件的同步任务偶尔失败,而我们严重依赖该任务来执行外部策略服务。