データベース復元中の「Index_users_on_username_lower」エラー:インポートに失敗

こんにちは!

昨夜、フォーラムで大きな問題が発生し、すべてを再作成する必要がありました。しかし、リストア中に問題が発生し、失敗しました。エラーは以下の通りです。

ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(lea) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (username_lower)=(lea) is duplicated.

これは Twitter ログインに関連しているかもしれませんが、リストア時に重複している username_lower を変更することは可能でしょうか?SQL ファイル(かなり大きいです)内で変更して再アップロードするのは難しいと思います。

以前ここで言及されたデータベースインデックスの破損の別の事例です:Critical Error: changed username, user got broken

バックアップを復元するきっかけとなった問題が何だったのかはわかりませんが、関連している可能性があります。

別の問題でした。サーバーが pups.git にアクセスできず、ホスト github.com を解決できませんでした。昨夜に見つけたいくつかの解決策を試しましたが、効果はありませんでした。

復元により、これは特定のユーザー名(おそらく Twitter のワンクリックアカウント作成に関連しているか、それに類するもの)に限定された問題だと考えられます。手動で修正を試みていますが、1GB の SQL ファイルを管理するのは理想的ではありません。

編集:Vim ソフトウェアを使用して SQL ファイルを編集し、正しい行を見つけました。復元は成功しました。すべてを再構築するだけで、問題なく動作するはずです。

「Lea」というユーザー名と「lea」というユーザー名が存在していました。Discourse がそのような事態を許してしまったのは不思議です。このフォーラムは結構古く(2014 年 6 月)、頻繁に更新されていたため、特定のバージョンに起因するものだったかもしれません。

その日は大変でしたが、もし私のように本当に不運な人がいたら、どうやってすべてを修復したか説明してみますね :upside_down_face:

  1. バックアップをダウンロードします。そして dump.sql ファイルが手に入るまで、数回展開してください。

  2. vim などのソフトウェアを使って dump.sql を編集します download : vim online

  3. 私は SQL が本当に苦手です。正しいテーブルを見つけるために username_lower, で検索しました。これで users テーブルにたどり着き、次に “lea” を検索しました。2 つの Lea エントリを編集しました。もっと簡単な方法もあったかもしれません。でも、私は SQL が苦手なんです。特にファイルが 1.5GB のときはね。ファイルを保存してください。

  4. 7zip で dump.sql を gzip 圧縮します。新しいファイル dump.sql.gz が作成されているはずです。

  5. :file_folder: /var/discourse/shared/standalone/backups/default/ に新しいフォルダを作成します。私は test という名前にしました。

  6. インターネット接続が良好な場合は、バックアップファイルを解凍して得た :file_folder: uploads フォルダをアップロードし、/var/discourse/shared/standalone/backups/default/test/ に配置してください。
    6.1 私のように接続が不安定な場合は、サーバー上のバックアップファイル名を確認し、以下のコマンドを使用してください: tar xvzf /var/discourse/shared/standalone/backups/default/yourbackupfile.tar.gz -C /var/discourse/shared/standalone/backups/default/test
    6.2 test フォルダには dump.sql.gz ファイルと uploads フォルダが入っているはずです。これで OK です。

  7. 壊れた dump.sql.gz を置き換えるため、test フォルダにある dump.sql.gz ファイルをアップロードします。

  8. サーバーで: cd /var/discourse/shared/standalone/backups/default/test に移動します。

  9. バックアップファイルを再作成する必要があります。古いバックアップファイルと同じ名前で: tar -czvf yourbackupfile.tar.gz uploads/ dump.sql.gz を実行してください。

  10. FTP で :file_folder: /var/discourse/shared/standalone/backups/default/ に移動し、壊れたバックアップを削除するか、別のフォルダに移動させます。

  11. 新しいバックアップファイルを /var/discourse/shared/standalone/backups/default/ に移動させます。

  12. バックアップを復元します。私はこの方法を推奨しています。ここまで来られたなら、簡単に使えるはずです: Restore a backup from the command line

バックアップは成功するはずです :sweat_smile:

簡単でしょ。