修改备份中的数据库以删除重复键标记,以免在还原时失败

andy@ubuntu-s-1vcpu-1gb-ams3-01:/var/discourse/shared/standalone/backups/default$ file public-happiness-2023-07-25-033857-v20220628031850.tar.gz
public-happiness-2023-07-25-033857-v20220628031850.tar.gz: gzip compressed data, was "public-happiness-2023-07-25-033857-v20220628031850.tar", last modified: Tue Aug  8 14:53:40 2023, max speed, from FAT filesystem (MS-DOS, OS/2, NT)

完整的文件内容看起来没问题,尽管信息量很大,很难说清楚:Hastebin

我认为这与文件路径有关。请看

嗯。那可能不是问题所在。我主要不信任 7zip 来创建一个兼容的 tar 文件,但这可能是非理性的。

  -h, --dereference
              Follow symlinks; archive and dump the files they point to.

答案可能在上面的文件中。实际上,它可能在同一目录下的另一个文件中。

1 个赞

谢谢 - 内容是正确的,但我认为名字弄错了。这就是问题所在。
您有

-rwxrwxrwx 0/0        26927534 2023-08-08 14:37 public-happiness-2023-07-25-033857-v20220628031850/dump.sql.gz

但原始文件和任何未修改的备份将是

-rwxrwxrwx 0/0        26927534 2023-08-08 14:37 dump.sql.gz

编辑:所以您需要以稍微不同的方式驱动 7zip 来构建那个 tar.gz 文件。

1 个赞

感谢您的所有帮助。我已解压缩文件,再次编辑了重复的标签,然后非常仔细地重新压缩,特别注意了文件名,现在有了进展!

现在恢复时,我看到了这个错误消息,这似乎更为常见:

[2023-08-25 15:25:21] CREATE INDEX
[2023-08-25 15:25:21] ERROR:  could not create unique index "index_tags_on_lower_name"
[2023-08-25 15:25:21] DETAIL:  Key (lower(name::text))=(socialmedia) is duplicated.
[2023-08-25 15:25:21] EXCEPTION: psql failed: DETAIL:  Key (lower(name::text))=(socialmedia) is duplicated.

我猜这意味着我已经成功更改了标签,但我的数据库中的帖子中仍然存在该标签的一些实例。标签 ID 号表明应该有一个名为 socialmedia 的标签,但它却找到了一个名为 socialmedia2 的标签,这导致了冲突。

这篇帖子这篇帖子 讨论了修复方法,但由于我只能通过直接编辑本地机器上的代码来访问我的备份,因此我无法使用 MySQL 工具来帮助清理。

幸运的是,在我的数据库中,我只有 38 个 'socialmedia' 实例(而不是 50,000 多个 socialmedia 实例)。假设我如上面截图所示更改了第 395421 行的内容是正确的,那么我无法确定剩余的实例中哪些与 ‘socialmedia’ 标签相关,哪些与我已编辑为 ‘socialmedia2’ 的标签相关。

这是使用 socialmedia 标签的一个相当短的帖子的示例:

9488	'/groups/communitybuilders':86 '/groups/socialmedia':84 '/groups/webdev':89 '1st':117 '2022':131 '6':125 'activ':61 'banner':113 'btw':143 'close':169 'comment':21 'communiti':47 'communitybuild':87 'concept':4A 'especi':28 'event':119 'excit':164 'feedback':8B 'final':166 'get':38,133 'github':94 'grow':6A,142 'hack':127 'hard':156 'help':96 'homepag':151 'host':124 'improv':11B 'join':71,106 'launch':41,118,126 'like':128 'link':110 'live':140,175 'lot':27 'love':1A,67 'marvelxi':152 'mean':25 'media':51 'member':62 'mention':93 'move':45 'much':15 'new':150 'one':72,107 'onto':53 'plan':121 'platform':7B,43,139 'pleas':5A 'project':137 'promot':97 're':33,36,56,161 'readi':39,172 'rhorho358':23 'right':63 'see':100,167 'site':176 'slight':76,177,179 'small':58 'smile':77,178,180 'social':50 'socialmedia':85 'stage':31 'suggest':10B 'sure':79 'take':17 'team':59,75,103 'thank':12 'think':147 'time':19 'use':108 'webdev':90 'websit':3A 'whether':80 'work':155 'would':66,82	感谢您花时间在此处评论 @R ,这对我意义重大,尤其是在... 团队一直在努力,我们都非常兴奋地看到它终于接近在直播网站上准备就绪 :slight_smile: :slight_smile:	en_GB	4	f


不过,我可能走错方向了,因为开头的标签比用户在帖子中可能使用的标签要多。也有可能 ‘socialmedia’ 不是上面帖子中使用的标签,尽管它本应是。

我将手动恢复数据库,并尝试添加索引并修复数据库中的问题,而不是文本文件,但这也很难。

  1. 我认为这不是你可以/应该得出的直接结论。问题应该很简单:

    该索引无法构建的原因是 tags 表中至少有两个条目,当取其名称的小写时,它们会解析为相同的内容。这就是错误消息告诉你的。

    所以我认为你仍然需要找到那个单表中在进行该转换时发生冲突的相关条目。

  1. 另外,帖子没有标签,主题才有。

    在删除重复项(们)之前,请记下它们的 ID,因为你还需要从 topic_tags 表中删除相关的行(如果你在网上执行了所有这些维护,只需重新启动容器即可快速处理好这些,而不是销毁实例!!)。

    discourse/app/models/topic_tag.rb at 1209efb63c47c32b119ea130e4c7d411a836e3e4 · discourse/discourse · GitHub

3 个赞

我们的网站恢复了!感谢大家的帮助。

看起来我几天前就解决了这个问题,但却粗心大意地没有仔细阅读错误消息。有两个重复的标签,“socialmedia”和“social-media”。修复第一个后,我没有注意到错误消息已经改变,因为这两个重复的标签非常相似。

以下是修复这两个错误的步骤:

1. 查找标签表和重复的标签

  • 将备份下载到您的操作系统。本指南适用于 Windows,但在 Linux 上过程大致相同。

  • 解压所有压缩文件夹,您应该会得到一个 dump.sql 文件和一个 uploads 文件夹。

  • 使用文本编辑器打开 dump.sql 文件,我使用的是 Visual Studio Code。

  • 搜索“COPY public.tags”以找到标签表。它应该在底部附近,看起来像这样:

  • 手动浏览它,或将您的标签表复制粘贴到一个单独的文档中,您可以在其中使用搜索功能查找重复的标签。

  • 将修复后的 dump.sql 文件另存为 dump.sql。

2. 文件和文件夹的顺序和名称必须在重新压缩时完美匹配。

  • 解压后,您应该会得到一个 dump.sql 文件和一个 uploads 文件夹。

  • 右键单击 dump.sql。选择 7zip,然后选择“添加到存档”。

  • 选择 gzip 作为存档格式,保持文件名不变。

  • 选择新的 dump.sql.gz 文件和 uploads 文件,然后右键单击 > 7zip > 添加到存档 > 存档格式:tar。确保文件名与原始备份完全相同,它应该看起来像这样:“public-happiness-2023-07-25-033857-v20220628031850”。

  • 选择新的 .tar 文件 > 7zip > 添加到存档 > 存档格式:gzip。确保文件名与原始备份完全相同,它应该看起来像这样:“public-happiness-2023-07-25-033857-v20220628031850”。

  • 最终结果应该是一个 .tar.gz 文件,其名称与您的原始备份相同。

  • 上传到管理区域并恢复您的备份。

3 个赞

标签可能重复的还有一个地方是搜索数据表:

COPY public.tag_search_data (tag_id, search_data, raw_data, locale, version) FROM stdin;

我不确定这是否也需要更正。

太好了,你终于修好了!

2 个赞