Spec-Zone.ru › MySQL 8.4

18.6 Справочное хранилище BLACKHOLE

Движок хранилища 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)

Чтобы включить движок хранилища BLACKHOLE, если вы собираете MySQL из исходного кода, вызовите CMake с параметром -DWITH_BLACKHOLE_STORAGE_ENGINE.

Чтобы изучить исходный код движка BLACKHOLE, посмотрите в каталог sql дистрибутива исходного кода MySQL.

При создании таблицы BLACKHOLE сервер создаёт определение таблицы в глобальном словаре данных. Файлы, связанные с таблицей, отсутствуют.

Движок хранилища BLACKHOLE поддерживает все типы индексов. То есть вы можете включать объявления индексов в определение таблицы.

Максимальная длина ключа составляет 3072 байта.

Движок хранилища BLACKHOLE не поддерживает разбиение.

Проверить доступность движка хранилища BLACKHOLE можно с помощью инструкции SHOW ENGINES.

Вставки в таблицу BLACKHOLE не сохраняют данных, но если включено двоичное протоколирование на основе инструкций, SQL-инструкции регистрируются и реплицируются на серверах-репликах. Это может быть полезно как механизм повторения или фильтрации.

Предположим, что вашему приложению необходимы правила фильтрации на стороне реплики, но передача всех данных двоичного журнала на реплику сначала приводит к слишком большому трафику. В таком случае на сервере источника репликации можно настроить процесс-реплику “дубликат”, для которого по умолчанию установлен движок хранилища BLACKHOLE, как показано ниже:

Рисунок 18.1 Репликация с использованием BLACKHOLE для фильтрации

The replication source server uses a source mysqld process and a dummy mysqld process. On the replica, the mysqld process replicates from the dummy mysqld process.

Источник записывает в свой двоичный журнал. Процесс “дубликат” mysqld действует как реплика, применяя желаемую комбинацию правил replicate-do-* и replicate-ignore-* и записывает новый, отфильтрованный двоичный журнал. (См. Раздел 19.1.6, «Параметры и переменные репликации и двоичного протоколирования».) Этот отфильтрованный журнал предоставляется реплике.

Дублирующий процесс фактически не сохраняет никаких данных, поэтому накладные расходы от работы дополнительного процесса mysqld на сервере источника репликации невелики. Такую конфигурацию можно повторить с дополнительными репликами.

INSERT триггеры для таблиц BLACKHOLE работают как ожидается. Однако, поскольку таблица BLACKHOLE фактически не хранит данных, UPDATE и DELETE триггеры не активируются: фрагмент FOR EACH ROW в определении триггера не применяется, так как строк нет.

Другие возможные применения движка хранилища BLACKHOLE включают:

  • Проверка синтаксиса файла дампов.

  • Измерение накладных расходов от двоичного протоколирования, сравнивая производительность с включённым и выключенным двоичным протоколированием.

  • BLACKHOLE по сути является движком хранилища “без действия”, поэтому его можно использовать для поиска узких мест производительности, не связанных с самим движком хранилища.

Движок BLACKHOLE учитывает транзакции в том смысле, что подтверждённые транзакции записываются в двоичный журнал, а отменённые — нет.

Движок Blackhole и столбцы с автоматической привязкой

Движок BLACKHOLE — это движок «без действия». Любые операции, выполняемые над таблицей с помощью BLACKHOLE, не имеют эффекта. Это следует учитывать при рассмотрении поведения столбцов первичного ключа с автоматической привязкой. Движок не автоматически увеличивает значения полей и не сохраняет состояние поля с автоматической привязкой. Это имеет важное значение в репликации.

Рассмотрим сценарий репликации, где выполняются все три следующих условия:

  1. На сервере источника существует таблица blackhole со столбцом автоматической привязки, который является первичным ключом.

  2. На реплике существует таблица с тем же именем, но с использованием движка MyISAM.

  3. Вставки выполняются в таблицу источника без явного задания значения автоматической привязки в инструкции INSERT или с помощью инструкции SET INSERT_ID.

В этом сценарии репликация завершается с ошибкой дублирования записи в столбце первичного ключа.

В репликации на основе инструкций значение INSERT_ID в контексте события всегда одинаковое. Поэтому репликация завершается из-за попытки вставки строки с дублирующим значением для столбца первичного ключа.

В репликации на основе строк значение, возвращаемое движком для строки, всегда одинаковое для каждой вставки. Это приводит к тому, что реплика пытается повторить две записи в журнале вставки, используя одинаковое значение для столбца первичного ключа, и репликация завершается ошибкой.

Фильтрация столбцов

При использовании репликации на основе строк (binlog_format=ROW), поддерживается реплика, где отсутствуют последние столбцы в таблице, как описано в разделе Раздел 19.5.1.9, «Репликация с различными определениями таблиц на источнике и реплике».

Эта фильтрация выполняется на стороне реплики, то есть столбцы копируются на реплику до их фильтрации. Есть по крайней мере два случая, когда нежелательно копировать столбцы на реплику:

  1. Если данные конфиденциальны, поэтому сервер реплики не должен иметь к ним доступа.

  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;

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/blackhole-storage-engine.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API