Amazon Auroraで"Unknown MySQL error"が出る
DjangoのチュートリアルをDockerで動かしていて、DBにAmazon Aurora (MySQL 5.7)を使おうとしたらERROR 2000 (HY000): Unknown MySQL error
が出た話。
先に結論
クエリキャッシュを無効にする (query_cache_type = 0) と解決する。
環境
- masOS Catalina 10.15.2
- docker desktop community 2.1.0.5 (40693)
問題のSQLクエリ
トップページ用にQuestionの一覧を取得する。
SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5;
調査
手元のMac + brewで入れたMySQL 8.0のクライアント → OK
% mysql -V mysql Ver 8.0.18 for osx10.15 on x86_64 (Homebrew) % % mysql -uadmin -p -h <Auroraのクラスターエンドポイント> -D mysite_db Enter password: mysql> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5; +----+---------------+----------------------------+ | id | question_text | pub_date | +----+---------------+----------------------------+ | 1 | What's up? | 2020-01-16 07:45:11.757886 | +----+---------------+----------------------------+ 1 row in set (0.02 sec)
Alpine LinuxのDockerコンテナ + mariadb-client(10.4.10) → ERROR 2000 (HY000): Unknown MySQL error
% docker run -it --rm alpine:latest /bin/ash / # apk update / # apk add mariadb-client / # / # mysql -V mysql Ver 15.1 Distrib 10.4.10-MariaDB, for Linux (x86_64) using readline 5.1 / # / # mysql -uadmin -p -h <Auroraクラスターのエンドポイント> -D mysite_db Enter password: MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5; ERROR 2000 (HY000): Unknown MySQL error
クエリの一部(DESC LIMIT 5
)を消すとエラーコードすら出なくなるが、何度か再実行すると正常な結果が返ってきたりして不安定。
MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date`; ERROR: MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date`; ERROR: MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date`; +----+---------------+----------------------------+ | id | question_text | pub_date | +----+---------------+----------------------------+ | 1 | What's up? | 2020-01-16 07:45:11.757886 | +----+---------------+----------------------------+ 1 row in set (0.000 sec) MySQL [mysite_db]> MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5; +----+---------------+----------------------------+ | id | question_text | pub_date | +----+---------------+----------------------------+ | 1 | What's up? | 2020-01-16 07:45:11.757886 | +----+---------------+----------------------------+ 1 row in set (0.000 sec)
UbuntuのDockerコンテナ + mariadb-client(10.1.43) → ERROR 2027 (HY000): Malformed packet
% docker run -it --rm ubuntu:latest /bin/bash root@cc00c89acc69:/# apk update root@cc00c89acc69:/# apk upgrade root@cc00c89acc69:/# apk install mariadb-client root@cc00c89acc69:/# root@cc00c89acc69:/# mysql -V mysql Ver 15.1 Distrib 10.1.43-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 root@cc00c89acc69:/# root@cc00c89acc69:/# mysql -uadmin -p -h <Auroraクラスターのエンドポイント> -D mysite_db Enter password: MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5; ERROR 2027 (HY000): Malformed packet
解決
"Unknown MySQL error"では有益な情報にたどり着けなかったので"Malformed packet"で調べたところ、クエリキャッシュを切ったら直るという情報を発見。
Auroraのパラメータグループを変更したあと、Alpineのコンテナで確認。
/ # mysql -uadmin -p -h <Auroraクラスターのエンドポイント> -D mysite_db Enter password: MySQL [mysite_db]> SHOW VARIABLES LIKE '%query_cache_type%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_type | OFF | +------------------+-------+ 1 row in set (0.019 sec) MySQL [mysite_db]> MySQL [mysite_db]> SELECT `polls_question`.`id`, `polls_question`.`question_text`, `polls_question`.`pub_date` FROM `polls_question` ORDER BY `polls_question`.`pub_date` DESC LIMIT 5; +----+---------------+----------------------------+ | id | question_text | pub_date | +----+---------------+----------------------------+ | 1 | What's up? | 2020-01-16 07:45:11.757886 | +----+---------------+----------------------------+ 1 row in set (0.013 sec)
直った。少なからずパフォーマンスは落ちると思われる。
Auroraが変なレスポンスを返しているのか、MariaDBのクライアントがちゃんと解釈できてないのか、それ以外のところが悪いのか、よくわからない。