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
儲存引擎,請使用 -DWITH_BLACKHOLE_STORAGE_ENGINE
選項叫用 CMake。
若要檢查 BLACKHOLE
引擎的來源,請查看 MySQL 來源散佈的 sql
目錄。
當您建立 BLACKHOLE
資料表時,伺服器會在全域資料字典中建立資料表定義。沒有與資料表相關聯的檔案。
BLACKHOLE
儲存引擎支援所有類型的索引。也就是說,您可以在資料表定義中包含索引宣告。
最大索引鍵長度為 3072 位元組。
BLACKHOLE
儲存引擎不支援分割。
您可以使用 SHOW ENGINES
陳述式來檢查 BLACKHOLE
儲存引擎是否可用。
插入 BLACKHOLE
資料表的資料不會儲存任何資料,但如果啟用以陳述式為基礎的二進位記錄,SQL 陳述式會記錄並複製到複本伺服器。這可以用作轉發器或篩選機制。
假設您的應用程式需要複本端篩選規則,但是先將所有二進位記錄資料傳輸到複本會產生過多的流量。在這種情況下,可以在複寫來源伺服器上設定預設儲存引擎為 BLACKHOLE
的 「虛擬」複本程序,如下所示
來源會寫入其二進位記錄。「虛擬」 mysqld 程序會作為複本,套用所需的 replicate-do-*
和 replicate-ignore-*
規則組合,並寫入其本身新的已篩選二進位記錄。(請參閱 第 19.1.6 節,「複寫和二進位記錄選項和變數」。)此已篩選記錄會提供給複本。
虛擬程序實際上不會儲存任何資料,因此在複寫來源伺服器上執行額外的 mysqld 程序不會產生太多處理負擔。此類型的設定可以透過其他複本重複執行。
BLACKHOLE
資料表的 INSERT
觸發程序會如預期般運作。不過,由於 BLACKHOLE
資料表實際上不會儲存任何資料,因此不會啟動 UPDATE
和 DELETE
觸發程序:觸發程序定義中的 FOR EACH ROW
子句不會套用,因為沒有任何資料列。
BLACKHOLE
儲存引擎的其他可能用途包括
驗證傾印檔案語法。
透過比較使用
BLACKHOLE
時啟用和未啟用二進位記錄的效能,來測量二進位記錄的負擔。BLACKHOLE
本質上是 「無運算」儲存引擎,因此可用於尋找與儲存引擎本身無關的效能瓶頸。
BLACKHOLE
引擎可感知交易,因為已提交的交易會寫入二進位記錄,而已回滾的交易則不會。
Blackhole 引擎和自動遞增欄
BLACKHOLE
引擎是無運算引擎。在 BLACKHOLE
資料表上執行的任何作業都沒有任何作用。在考量自動遞增主索引鍵欄的行為時,應該將這一點牢記在心。引擎不會自動遞增欄位值,也不會保留自動遞增欄位狀態。這在複寫中具有重要的意涵。
考量以下複寫情境,其中下列三個條件都適用
在來源伺服器上,有一個具有自動遞增欄位 (主索引鍵) 的 blackhole 資料表。
在複本上,存在相同的資料表,但使用 MyISAM 引擎。
將插入作業執行到來源的資料表中,而未在
INSERT
陳述式本身中或透過使用SET INSERT_ID
陳述式明確設定自動遞增值。
在此情境中,複寫會因主索引鍵欄上的重複項目錯誤而失敗。
在以陳述式為基礎的複寫中,內容事件中的 INSERT_ID
值永遠相同。因此,複寫會因嘗試使用主索引鍵欄的重複值插入資料列而失敗。
在以資料列為基礎的複寫中,引擎針對資料列傳回的值永遠針對每個插入相同。這會導致複本嘗試使用主索引鍵欄的相同值重播兩個插入記錄項目,因此複寫會失敗。
欄篩選
當使用以資料列為基礎的複寫時 (binlog_format=ROW
),支援複本上資料表中遺失最後一欄,如第 19.5.1.9 節「在來源和複本上使用不同的資料表定義進行複寫」中所述。
此篩選會在複本端運作,也就是說,欄會在篩選掉之前複製到複本。至少有兩種情況不希望將欄複製到複本
如果資料是機密的,因此複本伺服器不應存取。
如果來源有許多複本,在傳送到複本之前進行篩選可能會減少網路流量。
可以使用 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;