復元時に失敗しないように、重複キータグを削除するためにバックアップ内のデータベースを変更する

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
              シンボリックリンクをたどります。それらが指すファイルをアーカイブおよびダンプします。

答えは上記のファイルにあるかもしれません。実際には、同じディレクトリにある別のファイルにある可能性が高いです。

「いいね!」 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

とする必要があります。

編集:したがって、tar.gz ファイルを作成する際に 7zip の動作を少し変更する必要があります。

「いいね!」 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ツールを使用してクリーンアップすることはできません。

幸いなことに、私のデータベースには 'socialmedia' のインスタンスが 38 個しかありません(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	Thank you so much for taking the time to comment here @R , it means a lot, especially in the st... has been working hard on it and we’re all very excited to finally see it close to being ready on the live site :slight_smile: :slight_smile:	en_GB	4	f

しかし、投稿でユーザーが使用する可能性のあるタグよりも多くのタグが先頭にあるように見えるため、私は間違った方向に進んでいる可能性があります。また、上記の投稿では ‘socialmedia’ がタグとして使用されていない可能性もありますが、使用されているはずです。

データベースを手動で復元し、インデックスを追加して、テキストファイルではなくデータベースの問題を修正することをお勧めしますが、それも困難です。

  1. それがすぐに導き出せる結論ではないと思います。問題は単純なはずです。

    インデックスが作成されない理由は、tagsテーブルに少なくとも2つのエントリがあり、それらの名前を小文字にしたときに同じものになるためです。エラーメッセージはそれを伝えています。

    したがって、その変換を行う際に競合する単一テーブル内の関連エントリを見つける必要があると思います。

  1. また、投稿にはタグ付けされず、トピックにタグ付けされます。

    重複を削除する前に、そのIDをメモしておいてください。topic_tagsテーブルからも関連する行を削除する必要があるためです(コンテナを再起動するだけで、このすべてのメンテナンスをオンラインで実行していれば、すぐに処理できたはずです。インスタンスを破棄するのではなく!!)。

「いいね!」 3

サイトが復旧しました!ご協力いただいた皆様、ありがとうございました。

どうやら数日前に解決していたようですが、エラーメッセージを注意深く読んでいませんでした。‘socialmedia’ と ‘social-media’ という2つの重複タグがありました。最初のタグを修正した後、2つの重複タグが非常に似ていたため、エラーメッセージが変わったことに気づきませんでした。

以下は、これらの2つのエラーを修正するプロセスです。

1. タグテーブルと重複タグの検索

  • バックアップをオペレーティングシステムにダウンロードします。このガイドはWindows用ですが、Linuxでも同様のプロセスになります。

  • すべてのzipフォルダを展開すると、dump.sqlファイルとuploadsフォルダが残ります。

  • dump.sqlファイルをテキストエディタで開きます。私はVisual Studio Codeを使用しました。

  • 「COPY public.tags」を検索してタグテーブルを見つけます。これは下部にあり、次のように表示されるはずです。

  • 手動でブラウズするか、タグテーブルを別のドキュメントにコピー&ペーストして検索機能を使用し、重複タグを見つけます。

  • 修正したdump.sqlファイルをdump.sqlとして保存します。

2. ファイルとフォルダの順序と名前は、再zipする際に完璧でなければなりません。

  • 展開後、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

タグが繰り返されている可能性のあるもう1つの場所は、検索データテーブルです。

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

これも修正する必要があるかどうかは不明です。

直ったんですね!本当によかったです!

「いいね!」 2