すのふら

日々の備忘録

「index "pg_toast_16408_index" is not a btree」というエラーが出力する。

RedshiftにCOPYコマンドでデータを投入するとたまーに発生する「index "pg_toast_16408_index" is not a btree」というエラー。

調査

テーブルにレコードがない状態でCOPYコマンドを実行した際、ANALYZE実行されると発生するAWSのバグらしい。 *1

[COPY from s3 to redshift fails]

AWSからの回答

今回お客様環境で発生したエラーとなりますが、同様の報告は確認出来るものの、明確な再現手順が存在しないため、原因は特定出来ておりません。
しかしながら、お客様環境及びその他の事例でも再起動で解消する為、一時的なメモリ上の問題である可能性が高い状況でございます。

もし、事象が再現した場合には、先ずは再起動による対処をご検討ください。
また、もし事象の再現を明示的に行うことが可能であれば、原因追及のために調査を行うことが可能でございますので、手順等含めてご連絡頂ければ幸いでございます。

こんな感じ。レアケース系のやつ。

回避方法

とりあえず以下2パターンのうちどれかをやればよいっぽい。
 1. クラスタ再起動
 2. COPYコマンド実行時にオプションに[STATUPDATE off]を明示的に設定

AWSの回答的にもとりあえず1をやればよいみたいな感じ。
俺が遭遇した時もとりあえずそれでうまくいった。

ただ、これだと毎度、発生するかもしれないっていうのがリスクとして挙がるし、運用中にRedshift止めるの?って問題もある。

でも2パターンでANALYZEコマンドを実行しないようにすると、最適化が行われないのでレコード件数が増大していくと共にSQLの実行結果が返ってこない。


パフォーマンス犠牲にするぐらいならたまたま発生パターンは目をつぶるかーみたいなやつ。

www.slideshare.net

*1:COPYコマンドのオプションで何も設定していないと、初回だけANALYZEが実行される