1

最近、構成エラーが原因で、Heroku からローカル セットアップにバックアップ データベースを復元しなければならない状況に遭遇しました。

これは、Heroku の投稿から非常に簡単でした。

https://devcenter.heroku.com/articles/heroku-postgres-import-export :

$ heroku pgbackups:capture
$ curl -o latest.dump `heroku pgbackups:url`
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump

問題は、復元後、古い (復元前の) インデックス データの一部がまだ新しく復元されたデータと共に提供されていることでした。つまり、復元とデータベースの移行後、インデックス データがまだいくつか残っているように見えました。復元の前に、古いデータベースをクリア、削除、または何もしなかったことに注意してください...したがって、明らかに、復元前にまだいくつかのデータが残っていました...テーブルはなくなりましたが、インデックスはまだ残っている可能性があります。

テーブルに何らかの変更を加えると、変更したものの部分的な再インデックスが発生し、問題の部分的な修正になるのではないかと思いました。そして案の定、コンソールからレコードに変更を加えたところ、残りのデータが更新されました (現在は正しくなっています)。

だから私の質問はマルチパートです...

復元でデータベース内のすべてが消去されず、「最初から開始」されなかったのはなぜですか? (他の方法はありますか?)

また、rake または console を介してテーブルを再インデックス化するより良いプログラム的な方法はありますか?

searchkick の場合、次を使用します。

rake searchkick:reindex CLASS=Blog

モデル内では、次のようなものを使用します。

blog.reindex

しかし、基本的なテーブルの再インデックスを実行するコマンド/関数の方法は見つかりませんでした (すべてのレコードに触れるための何らかのハックなしで)。

4

1 に答える 1

1

私のコメントに対するOPの回答に基づいて、これは既存のDBに完全なDBバックアップを適用した結果であり、復元されたデータと古いインデックスを含む既存のデータの間で相互受粉が発生したと思います。

私がお勧めするのは、バックアップが DB 全体である場合です。

  1. ローカル データベースで、 dropdbコマンドを使用してすべてを削除します。
  2. createdbを使用して空のデータベースを再作成します
  3. 次に、空の DB に対してpg_restoreコマンドを実行します。これにより、バックアップからすべてのデータが復元され、インデックスがそのバックアップの一部である場合 (データベース全体のバックアップに含まれている必要があります)、それらにも新しく復元されたデータが入力されます。
于 2014-08-10T04:11:41.183 に答える