「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が実行される