BLACKHOLE
ストレージエンジンは、データを受け取るけれども破棄して格納しない「ブラックホール」として機能します。 検索は、常に空の結果を返します。
mysql> CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM test;
Empty set (0.00 sec)
ソースから MySQL を構築する場合に BLACKHOLE
ストレージエンジンを有効にするには、CMake を -DWITH_BLACKHOLE_STORAGE_ENGINE
オプションで呼び出します。
BLACKHOLE
エンジンのソースを調べるには、MySQL ソース配布の sql
ディレクトリを検索します。
BLACKHOLE
テーブルを作成すると、サーバーはグローバルデータディクショナリにテーブル定義を作成します。 テーブルに関連付けられたファイルがありません。
BLACKHOLE
ストレージエンジンはすべての種類のインデックスをサポートしています。 すなわち、テーブル定義にインデックス宣言を含めることができます。
BLACKHOLE
ストレージエンジンはパーティション分割をサポートしていません。
BLACKHOLE
ストレージエンジンが SHOW ENGINES
ステートメントで使用できるかどうかを確認できます。
BLACKHOLE
テーブルへの挿入にはデータは格納されませんが、ステートメントベースのバイナリロギングが有効になっている場合は、SQL ステートメントがログに記録され、複製サーバーに複製されます。 これは、繰り返しまたはフィルタメカニズムとして役立つ場合があります。
アプリケーションでレプリカ側のフィルタリングルールが必要だが、最初にすべてのバイナリログデータをレプリカに転送すると、トラフィックが多すぎるとします。 このような場合は、レプリケーションソースサーバー上で、デフォルトのストレージエンジンが BLACKHOLE
である「「ダミー」」レプリカプロセスを次のように設定できます:
ソースはバイナリログに書き込みます。 「「ダミー」」 mysqld プロセスはレプリカとして機能し、replicate-do-*
ルールと replicate-ignore-*
ルールの目的の組合せを適用して、独自のフィルタ処理された新しいバイナリログを書き込みます。 セクション17.1.6「レプリケーションおよびバイナリロギングのオプションと変数」を参照してください。 このフィルタ処理されたログはレプリカに提供されます。
ダミープロセスは実際にはデータを格納しないため、レプリケーションソースサーバーで追加の mysqld プロセスを実行することで発生する処理オーバーヘッドはほとんどありません。 このタイプの設定は、追加のレプリカを使用して繰り返すことができます。
BLACKHOLE
テーブルの INSERT
トリガーは期待どおりに機能します。 しかし、実際には BLACKHOLE
テーブルはデータを格納しないため、UPDATE
および DELETE
トリガーは有効ではありません。トリガー定義の FOR EACH ROW
句は、行がないために適用されません。
BLACKHOLE
ストレージエンジンのその他の利用方法は、次のとおりです。
ダンプファイル構文の検証。
バイナリロギングのオーバーヘッドを測定 (バイナリロギングが有効である場合と有効でない場合のパフォーマンスを
BLACKHOLE
を利用して比較することで)。BLACKHOLE
は本質的には 「no-op」ストレージエンジンであるため、ストレージエンジン自体には関係ないパフォーマンスボトルネックの検出に使用される場合があります。
コミットされたトランザクションはバイナリログに書き込まれ、ロールバックされたトランザクションは書き込まれないという意味で、BLACKHOLE
エンジンはトランザクション対応です。
Blackhole エンジンと自動インクリメントカラム
BLACKHOLE
エンジンは no-op エンジンです。 BLACKHOLE
を使用してテーブルに対して実行される操作は影響を受けません。 これは、自動増分される主キーカラムの動作を考慮する際に注意する必要があります。 エンジンはフィールド値を自動的に増分せず、自動増分フィールドの状態を保持しません。 これは、レプリケーションで重要な意味を持ちます。
次の 3 つの条件がすべて適用される次のレプリケーションシナリオを検討します。
ソースサーバーには、主キーである自動増分フィールドを持つブラックホールテーブルがあります。
レプリカには同じテーブルが存在しますが、MyISAM エンジンを使用します。
ソーステーブルへの挿入は、
INSERT
ステートメント自体で自動増分値を明示的に設定せずに、またはSET INSERT_ID
ステートメントを使用して実行されます。
このシナリオでは、主キーカラムで重複エントリエラーが発生してレプリケーションが失敗します。
ステートメントベースのレプリケーションでは、コンテキストイベントの INSERT_ID
の値は常に同じです。 したがって、主キーカラムの値が重複する行を挿入しようとすると、レプリケーションは失敗します。
行ベースのレプリケーションでは、エンジンが戻す行の値は、各挿入で常に同じです。 この結果、レプリカは主キーカラムに同じ値を使用して 2 つの挿入ログエントリをリプレイしようとするため、レプリケーションは失敗します。
カラムのフィルタリング
行ベースのレプリケーション (binlog_format=ROW
) を使用する場合、セクション17.5.1.9「ソースとレプリカで異なるテーブル定義を使用したレプリケーション」 のセクションで説明されているように、最後のカラムがテーブルから欠落しているレプリカがサポートされます。
このフィルタリングはレプリカ側で機能します。つまり、カラムはフィルタで除外される前にレプリカにコピーされます。 カラムをレプリカにコピーすることは望ましくないケースが 2 つ以上あります:
データが機密である場合、レプリカサーバーはそのデータにアクセスできません。
ソースに多数のレプリカがある場合、レプリカに送信する前にフィルタリングすると、ネットワークトラフィックが削減される可能性があります。
ソースカラムのフィルタリングは、BLACKHOLE
エンジンを使用して実行できます。 これは、ソーステーブルのフィルタリングの実現方法と同様の方法で実行されます - BLACKHOLE
エンジンおよび --replicate-do-table
または --replicate-ignore-table
オプションを使用します。
ソースの設定は次のとおりです:
CREATE TABLE t1 (public_col_1, ..., public_col_N,
secret_col_1, ..., secret_col_M) ENGINE=MyISAM;
信頼できるレプリカの設定は次のとおりです:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=BLACKHOLE;
信頼できないレプリカの設定は次のとおりです:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=MyISAM;