GA

2021/06/07

mysqldumpからのリストアがERROR 3185 (HY000): Can't find master key from keyring で転ける

TL;DR


暗号化したテーブルをmysqldumpすると、 ENCRYPTION = 'Y' がテーブルオプションにくっついてくる。

--
-- Table structure for table `t1`
--

DROP TABLE IF EXISTS `t1`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `t1` (
  `num` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ENCRYPTION='Y';
/*!40101 SET character_set_client = @saved_cs_client */;

こいつを early_plugin_load=keyring_file.so していないmysqldで実行すると転ける。

mysql> CREATE TABLE `t1` (   `num` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ENCRYPTION='Y';
ERROR 3185 (HY000): Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.

おとなしく my.cnfearly_plugin_load を書くと成功するようになる。

「Can't find ..」にばかり目がいくけれど、「keyringがロードされて初期化に成功してるか確認しろ」とも書いてあるし。


とまあここまでは良いんだけども。

keyring_file プラグインって「 early_plugin_load で読ませろよ!」って ドキュメント に書いてある割に、(earlyでない) plugin_loadINSTALL PLUGIN でも利用できる。

特に INSTALL PLUGIN で有効にしていた場合、「バックアップ元の my.cnf には early_plugin_load の記述はなかったよ?」ということになりがちな気がする。

mysql.plugin テーブルのリストアそれ自体はプラグインをロードしてくれないので、「 my.cnf に書いた記憶もないし、リストアがこのエラーで途中までで転けたけどmysqldを再起動(=再起動すると mysql.plugin テーブルから読んで keyring_file プラグインがロードされるから)してからもう一度やったら上手くいったよ?」みたいなのはこのケースに該当する気がする。

ストレージエンジンの場合と仕組み(?)はいっしょ。

まあ、忘れがちですが忘れないようにしましょう

0 件のコメント :

コメントを投稿