ブラックホールをBLACKHOLEに入れてみる


[史上初、ブラックホールの撮影に成功 ― 地球サイズの電波望遠鏡で、楕円銀河M87に潜む巨大ブラックホールに迫る](http://www.nao.ac.jp/news/science/2019/20190410-eht.html)

という記事を見て、ブラックホール(の画像)をBLACKHOLE(ストレージエンジン)に入れてみるだけの記事になります。

釣り記事な上にダジャレです。はい

これに何か意味があるのかと言われると、BLACKHOLEストレージエンジンに放り込まれたデータと同じです。

強いて言えばこの記事だけが残りました。

# BLACKHOLEストレージエンジンとは？

MySQLのストレージエンジンの一種です。`show engines`で眺めてみましょう。

```
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
```

BLACKHOLEストレージエンジンの説明として、　`/dev/null storage engine (anything you write to it disappears) `ということで書いたものが/dev/nullに送られるがごとく消えてしまうのでブラックホールと呼ばれるみたいです。

そんなの何に役立つの？と思うかもしれませんが、データは書き込みを行いませんが、バイナリログを出力させることが出来ます。なのでmaster-slave構造になってる時に、masterの書き込み待ちを減らしたいときとかに使われたそうです。

詳しくは、[公式のドキュメントを参照](https://dev.mysql.com/doc/refman/5.6/ja/blackhole-storage-engine.html)してください。

# 閑話休題
```
ls /tmp/20190410-eht-fig-full.jpg
/tmp/20190410-eht-fig-full.jpg
```

ダウンロードしてきた画像を、`/tmp`配下に設置をして準備完了です


今回はLOAD_FILE構文を利用してファイルを読み込みたいので、[`secure_file_priv`](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv)の設定がが必要になります。


 **とりあえず動かしてみたい** という方は、以下のように.my.cnfなどに記載をして再起動をしてから進めてください。

```
[mysqld]
secure-file-priv = ""
```

```
mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
|                           |
+---------------------------+
1 row in set (0.00 sec)
```


BLACKHOLEストレージエンジンを作ってテーブルを作成します。画像データを入れたいので、LONGBLOB型のカラムを持ったテーブルを作成します。因みに、一応環境を残しておくと今回はhomebrewでインストールしたmysql5.7.25を使用して進めています。


```
mysql> CREATE TABLE test(image LONGBLOB) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.02 sec)
```

画像をLOAD_FILEを利用してINSERTします。

```
mysql> INSERT INTO test (image) VALUES (LOAD_FILE('/tmp/20190410-eht-fig-full.jpg'));
Query OK, 1 row affected (0.00 sec)
```

ということで無事にINSERT出来ました！
続けてSELECTをしてみましょう。

```
mysql> select * from test;
Empty set (0.00 sec)
```

ブラックホールの画像がブラックホールに吸い込まれて消えてしまいました！

いかがでしたか？
そこになにもない虚無感を味わっていただけましたでしょうか。

僕自身何書いてるんだろうと思ったので、読んでるみなさんはもっと意味がわからないと思います。

みなさんもぜひこのタイミングで虚無感を味わってみてはいかがでしょうか？


追記
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">secure-file-privは権限じゃなくて「file_privの範囲をこのディレクトリーに限定するよ！ あらセキュア！」ってオプションなのです</p>&mdash; yoku0825 (@yoku0825) <a href="https://twitter.com/yoku0825/status/1116007482311098368?ref_src=twsrc%5Etfw">2019年4月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ということでちょっと間違っていたので修正しました。指摘ありがとうございました！