MySQL8.0から、より高速で安全に接続できるcaching_sha2_passwordがデフォルトになりました。
しかし、MySQL8.4にMetabase(v0.50.0)で接続しようとすると、エラー「Could not connect to address=(host=mysql)(port=3306)(type=master) : RSA public key is not available client side (option serverRsaPublicKeyFile not set)」が表示されました。
![](https://it.hirokun.net/wp-content/uploads/2024/06/スクリーンショット-2024-06-12-15.37.25-1024x527.png)
この状況で接続する方法について解説します。
MetabaseのコンテナとMySQLのコンテナは別々に作成します。
docker compose用のファイル準備
docker-compose.yml
version: '3'
services:
mysql:
image: mysql:latest
platform: linux/amd64
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: demo
TZ: "Asia/Tokyo"
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- ./mysql:/var/lib/mysql
app:
image: metabase/metabase:latest
platform: linux/amd64
container_name: metabase
links:
- mysql
depends_on:
- "mysql"
ports:
- 3000:3000
ポイントを紹介します。
M1 Macを利用しているので、platformを指定しています。
my.cnfをローカルから読み込みます。my.cnfに古い認証をサポートするよう指定するので重要です。
my.cnf
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs # 照合順序
mysql_native_password = on
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
mysql_native_password = on で古いパスワード認証プラグインを有効にしています。
起動
docker-compose up -d
確認
mysqlコンテナにターミナルで接続します
docker exec -it mysql bash
mysqlに接続します
mysql -uroot -p
mysql> show plugins;
+----------------------------------+----------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+----------------------------------+----------+--------------------+---------+---------+
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
+----------------------------------+----------+--------------------+---------+---------+
mysql_native_passwordのStatusがDISABLEDからACTIVEに変更されています
Metabaseから接続するユーザーの作成
ユーザーの作成
mysql> CREATE USER metabase IDENTIFIED WITH mysql_native_password BY 'metabase';
確認します
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| metabase | % | mysql_native_password |
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
7 rows in set (0.00 sec)
metabaseユーザーがmysql_native_password認証で作成されています
対象のデータベースに権限設定
今回はmetabaseデータベースに対して権限を設定します
GRANT SELECT ON metabase.* TO 'metabase'@'%';
FLUSH PRIVILEGES;
まとめ
多数のデータベースに対応しているMetabaseならではの問題とも言えます。
Metabaseもいずれは対応するでしょうが、手っ取り早くMySQL8.4に接続するにはこちらの方法が楽ですね。