以前バージョンアップするときも同じ問題に当たった気がするのですが、今回も発生したので書き残しときます。

環境


こちらのIssueを見た感じでは、どうもdockerで運用しているときのみ??バージョンアップ時にインデックスがないと怒られるようです。コラボレーターの方が「データベースファイルを消せ」と言っていますが、当然そんなことできないので対応してみます。

以下、dockerで構築している前提で書きますが直にインストールしている場合でも同じだと思います。そもそも直にインストールした場合に発生するのかどうかは不明ですが…。

エラー


まず、今回発生したエラーです。合計10テーブルでインデックスがないと怒られてますね。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
app_1  | Starting platform
db_1 | ERROR: relation "idx_teams_description" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_channels_name_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_channels_displayname_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_posts_channel_id_update_at" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_posts_channel_id_delete_at_create_at" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_users_email_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_users_username_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_users_nickname_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_users_firstname_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass
db_1 | ERROR: relation "idx_users_lastname_lower" does not exist
db_1 | STATEMENT: SELECT $1::regclass

対応


まず、一旦コンテナを落としましょう。落として再度起動してみてください。上げなおしたら私の環境ではエラーが1つになりました。この動きを見る限り、どうもバージョンアップした後の初回起動はインデックスがうまく張れないようですね。

1
2
app_1  | Starting platform
db_1 | ERROR: relation "idx_teams_description" does not exist

後はこの残ったエラーのインデックスを手動で張れば終わります。

追記 2018/06/02

すみません、このエラーですがどうも出ていても問題なく動作します。それに以降の手順でインデックスを手動で張っても再発します。ですので、特に何もしなくても問題ない というのが結論です。

以降の記事はせっかく書いたので残しておきますが、やっても特に意味はありません。

コンテナに入る

まず、コンテナを起動します。公式のイメージを使用している場合はpostgresというユーザが存在するので、そのユーザでコンテナに入ります。

1
docker exec -it -u postgres コンテナID /bin/sh

DBに接続する

下記のコマンドでDBに接続します。今回はスキーマはmattermostとします。環境に合わせて適宜変えてください。

1
psql -d mattermost

修正するインデックスを探す

Mattermost serverのリポジトリから張られていないインデックスを検索します。今回の場合であればidx_teams_descriptionなのですが…。ソースコードを見ると下記のように書かれています。

1
s.RemoveIndexIfExists("idx_teams_description", "Teams")

※ Mattermost serverリポジトリより

存在する場合は削除するようになっているのですが、削除する処理しか書かれていないので、どのカラムにインデックスを張ればいいのかわかりません。仕方がないので履歴からさかのぼってみるとこのコミットでインデックスを消すように変更しているみたいですね。関連するIssueはこれです

削除前のコードは下記のようでした。これを参考にしてインデックスを張ります。

1
s.CreateIndexIfNotExists("idx_teams_description", "Teams", "Description")

※ Mattermost serverリポジトリより

インデックスを張る

最後に下記のSQLでインデックスを張ります。後は再起動するだけです。

1
CREATE INDEX idx_teams_description ON teams (Description);

まとめ


おそらく削除しているこのインデックス以外はdockerを再起動するだけで自動で張られるのではないかと思います。というか、この途中で削除されたインデックスだけマイグレートがうまくいってないみたいですね。もし仮に他のインデックスも張られなくてもリポジトリから検索して張れば動くと思います。たぶん。