mita2 database life

主にMySQLに関するメモです

MySQL default_table_encryption パラメータの挙動

MySQL 8.0 で default_table_encryption パラメータが追加されてました。
「テーブルの暗号化をデフォルトで有効にするオプションかな?」と思って、CREATE TABLEしてみるも変わらず・・・

マニュアル見ると、データベースとテーブルスペースに効くと書いてありました・・・。名前が紛らわしい・・・。


Defines the default encryption setting applied to schemas and general tablespaces when they are created without specifying an ENCRYPTION clause.

このパラメータを有効化した状態で、ENCRYPTIONオプションを省略してCREATE DATABASEすると、ENCRYPTION='Y'が暗黙的に追加されます。

mysql> SHOW VARIABLES LIKE 'default_table_encryption';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| default_table_encryption | ON    |
+--------------------------+-------+
1 row in set (0.00 sec)

mysql> CREATE DATABASE tde;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW CREATE DATABASE tde;
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                               |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| tde      | CREATE DATABASE `tde` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */ |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


テーブルのENCRYPTION指定を省略した場合は、データベースのENCRYPTIONに従う仕様です。結果として、テーブルの暗号化をデフォルトとすることができます。

mysql> CREATE TABLE tde.test (pk SERIAL PRIMARY KEY, c1 VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE TABLE tde.test \G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `pk` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `c1` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`pk`),
  UNIQUE KEY `pk` (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ENCRYPTION='Y'
1 row in set (0.00 sec)


default_table_encryption パラメータはENCRYPTION指定を省略した場合の挙動を変更します。明示的にENCRYPTION='N'を指定すれば、暗号化しないテーブルを作成できます。暗号化を強制する機能ではありません。
とはいえ、暗号化をし忘れた(ENCRYPTIONを指定してなかった)というケースが防げるだけでも、十分有用だと思います。


暗号化を強制したい場合は、table_encryption_privilege_check という別のパラメータが関連してきます。
つづく。。。