TL;DR
- たぶん
my.cnfにearly-plugin-load=keyring_file.soを書くのを忘れてる - 「再起動したら2回目は上手く通った」みたいなのは、間違って
INSTALL PLUGINでプラグインを食わせてるんだと思う。
暗号化したテーブルを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.cnf に early_plugin_load を書くと成功するようになる。
「Can't find ..」にばかり目がいくけれど、「keyringがロードされて初期化に成功してるか確認しろ」とも書いてあるし。
とまあここまでは良いんだけども。
keyring_file プラグインって「 early_plugin_load で読ませろよ!」って ドキュメント に書いてある割に、(earlyでない) plugin_load や INSTALL PLUGIN でも利用できる。
特に INSTALL PLUGIN で有効にしていた場合、「バックアップ元の my.cnf には early_plugin_load の記述はなかったよ?」ということになりがちな気がする。
mysql.plugin テーブルのリストアそれ自体はプラグインをロードしてくれないので、「 my.cnf に書いた記憶もないし、リストアがこのエラーで途中までで転けたけどmysqldを再起動(=再起動すると mysql.plugin テーブルから読んで keyring_file プラグインがロードされるから)してからもう一度やったら上手くいったよ?」みたいなのはこのケースに該当する気がする。
ストレージエンジンの場合と仕組み(?)はいっしょ。
まあ、忘れがちですが忘れないようにしましょう
0 件のコメント :
コメントを投稿