自由帳

@_nibral の技術ブログ

Amazon Auroraで"Unknown MySQL error"が出る

DjangoチュートリアルをDockerで動かしていて、DBにAmazon Aurora (MySQL 5.7)を使おうとしたらERROR 2000 (HY000): Unknown MySQL errorが出た話。

docs.djangoproject.com

先に結論

クエリキャッシュを無効にする (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"で調べたところ、クエリキャッシュを切ったら直るという情報を発見。

stackoverflow.com

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のクライアントがちゃんと解釈できてないのか、それ以外のところが悪いのか、よくわからない。