MySQL

MetabaseからMySQL8.4に接続する方法

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)」が表示されました。

この状況で接続する方法について解説します。
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に接続するにはこちらの方法が楽ですね。