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 для фильтрации
Источник записывает данные в свой двоичный журнал. Процесс “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, не имеют эффекта. Это следует учитывать при рассмотрении поведения столбцов первичного ключа с автоматической генерацией. Двигатель не увеличивает значения полей автоматически и не сохраняет состояние поля автоматической генерации. Это имеет важные последствия для репликации.
Рассмотрим сценарий репликации, в котором одновременно выполняются три следующих условия:
На сервере-источнике есть таблица 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;
© 2025 Oracle
Licensed under the GPLv2 License.