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;