Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@hmatsu47

MySQL 8.0.13 で一般テーブルスペース(General Tablespace)を暗号化する

これは インフラ勉強会 Advent Calendar 2018 22 日目の記事です。

昨日(21 日目)は barson_4 さんでした。


MySQL 8.0.13 では、個別のテーブルスペース暗号化(5.7.11 で対応)と REDO ログ/UNDO ログの暗号化(8.0.4 RC で対応)に加えて、一般テーブルスペース(General Tablespace)の暗号化がサポートされました。

一般テーブルスペースとは

「複数のテーブルの割り当て・格納ができる表領域」です。MySQL 5.7 で対応した機能です。

それ以前の MySQL(InnoDB)では、

  • 全てのテーブルを単一の(実際には指定の容量毎に区切った)ファイルに格納(innodb_file_per_table=0
  • 全てのテーブルを個別のファイルに格納(innodb_file_per_table=1

のいずれかしか選択できませんでしたが、MySQL 5.7 で一般テーブルスペースをサポートしたことにより、ある程度の単位(DB スキーマ単位など)で 1 つのファイルにテーブルを格納することができるようになりました。

そして MySQL 8.0.13 で、一般テーブルスペースの暗号化をサポートしました。

試してみる

基本的な設定は以下の内容と同じです(innodb_file_per_table=1にしておく必要あり。但しデフォルトでinnodb_file_per_table=1)。

この状態で MySQL を起動し、暗号化した一般テーブルスペースを作成してみます。

暗号化した一般テーブルスペースを作成
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)

MySQL のデータディレクトリにファイルが作成されました。

ts1.ibdファイルの存在を確認
# cd /var/lib/mysql
# ls -l *.ibd
-rw-r-----. 1 mysql mysql 37748736 Dec 21 14:17 mysql.ibd
-rw-r-----. 1 mysql mysql   131072 Dec 21 14:17 ts1.ibd

次に、このテーブルスペースに 2 つのテーブルを作成し、適当にレコードを挿入します。

テーブルスペースにテーブルを作成しレコード挿入
mysql> CREATE DATABASE ts1;
Query OK, 1 row affected (0.06 sec)

mysql> USE ts1;
Database changed
mysql> CREATE TABLE table1 (id INT PRIMARY KEY AUTO_INCREMENT, str VARCHAR(100)) TABLESPACE=ts1 Engine=InnoDB;
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO table1 SET str='hoge';
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO table1 SET str='fuga';
Query OK, 1 row affected (0.08 sec)

mysql> CREATE TABLE table2 (id INT PRIMARY KEY AUTO_INCREMENT, str VARCHAR(100)) TABLESPACE=ts1 Engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO table2 SET str='FUGA';
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO table2 SET str='HOGE';
Query OK, 1 row affected (0.02 sec)
fgrepして確認
# fgrep hoge *.ibd
# fgrep fuga *.ibd
# fgrep HOGE *.ibd
# fgrep FUGA *.ibd

レコード挿入時に入れた文字列が表示されないことを確認しました。

作成した一般テーブルスペースは、個別のテーブルスペースと同様、途中で暗号化の有効/無効を切り替えることができます。

一般テーブルスペースの暗号化を無効に
mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'N';
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO table1 SET str='123';
Query OK, 1 row affected (0.07 sec)

mysql> INSERT INTO table2 SET str='456';
Query OK, 1 row affected (0.03 sec)
fgrepして確認(2)
# fgrep 123 *.ibd
Binary file mysql.ibd matches
Binary file ts1.ibd matches
# fgrep 456 *.ibd
Binary file mysql.ibd matches
Binary file ts1.ibd matches
# fgrep hoge *.ibd
Binary file ts1.ibd matches
# fgrep fuga *.ibd
Binary file ts1.ibd matches
# fgrep HOGE *.ibd
Binary file ts1.ibd matches
# fgrep FUGA *.ibd
Binary file ts1.ibd matches

暗号化が無効になったので、今度は挿入時に入れた文字列が表示されました。


ちょっと地味な機能追加でした。

次のバージョン(8.0.14)では、いよいよバイナリログの暗号化も対応するのでしょうか…?


インフラ勉強会 Advent Calendar 2018、明日 23 日目は nagashi_ma_w さんです。


Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?