Spec-Zone.ru › MySQL 9.2

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-операторы регистрируются и дублируются на серверах-репликах. Это может быть полезно в качестве механизма повторения или фильтрации.

Предположим, что вашему приложению требуются правила фильтрации на стороне реплики, но передача всех двоичных логов данных реплике приводит к слишком большому объёму трафика. В таком случае можно настроить на сервере источника репликации процесс репликации «dummy», по умолчанию использующий двигатель хранилища 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.

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

Процесс «dummy» фактически не сохраняет данные, поэтому накладные расходы от запуска дополнительного процесса mysqld на сервере источника репликации невелики. Такую настройку можно повторить с дополнительными репликами.

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

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

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

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

  • BLACKHOLE по сути, является двигателем хранилища «no-op», поэтому он может использоваться для поиска узких мест в производительности, не связанных с самим двигателем хранилища.

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

Двигатель Blackhole и столбцы с автоматической генерацией

Двигатель BLACKHOLE — это двигатель no-op. Любые операции, выполняемые над таблицей с использованием 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-9.2-en/blackhole-storage-engine.html

Spec-Zone.ru

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