This is a read-only copy of the MariaDB Knowledgebase generated on 2024-11-14. For the latest, interactive version please visit https://mariadb.com/kb/.

BLACKHOLE

BLACKHOLE 存储引擎接受数据但不存储数据并始终返回空结果。

使用 BLACKHOLE 存储引擎的表由单个 .frm 表格格式文件组成,但没有关联的数据或索引文件。

例如,如果您想在从服务器上运行复杂的过滤规则而不会在主服务器上产生任何开销,则此存储引擎可能很有用。主服务器可以运行 BLACKHOLE 存储引擎,将数据复制到从服务器进行处理。

安装插件

虽然插件的共享库默认情况下随 MariaDB 分发,但 MariaDB 实际上默认情况下不会安装插件。有两种方法可以用于在 MariaDB 中安装插件。

第一种方法可用于在不重新启动服务器的情况下安装插件。您可以通过执行 INSTALL SONAMEINSTALL PLUGIN 来动态安装插件。例如:

INSTALL SONAME 'ha_blackhole';

第二种方法可用于告诉服务器在启动时加载插件。可以通过提供 --plugin-load--plugin-load-add 选项来安装插件。这可以作为命令行参数指定给 mysqld,也可以在相关的服务器 option group 中在 option file 中指定。例如:

[mariadb]
...
plugin_load_add = ha_blackhole

卸载插件

您可以通过执行 UNINSTALL SONAMEUNINSTALL PLUGIN 来动态卸载插件。例如:

UNINSTALL SONAME 'ha_blackhole';

如果您通过在相关服务器 option group 中的 option file 中提供 --plugin-load--plugin-load-add 选项来安装插件,则应删除这些选项以防止下次重新启动服务器时加载插件。

使用 BLACKHOLE 存储引擎

与 DML 一起使用

INSERTUPDATEDELETE 语句都可以与 BLACKHOLE 存储引擎一起使用。但是,实际上不会应用任何数据更改。

与复制一起使用

如果启用了二进制日志,则所有 SQL 语句都将像往常一样记录,并复制到任何从服务器。但是,由于未存储行,因此重要的是使用基于语句而不是行或混合格式,因为 UPDATEDELETE 语句既不记录也不复制。请参阅 二进制日志格式

与触发器一起使用

某些 触发器 可与 BLACKHOLE 存储引擎一起使用。

对于 INSERT 语句的 BEFORE 触发器仍然会被激活。

对于 UPDATEDELETE 语句的 触发器 不会被激活。

带有 FOR EACH ROW 子句的 触发器 不适用,因为表格没有行。

与外键一起使用

不支持外键。如果将一个 InnoDB 表转换为 BLACKHOLE,则外键将消失。如果将相同的表格转换回 InnoDB,则必须重新创建它们。

与虚拟列一起使用

如果将包含虚拟列InnoDB 表转换为 BLACKHOLE,则会产生错误。

与 AUTO_INCREMENT 一起使用

因为 BLACKHOLE 表格不存储数据,所以它不会维护 AUTO_INCREMENT 值。如果您正在复制到可以处理 AUTO_INCREMENT 列的表格,并且没有在 INSERT 查询中显式设置主键自增值,也没有使用 SET INSERT_ID 语句,则插入操作将在从服务器上失败,因为存在重复键。

限制

最大键大小为:

示例

CREATE TABLE table_name (
   id int unsigned primary key not null,
   v varchar(30)
) ENGINE=BLACKHOLE;

INSERT INTO table_name VALUES (1, 'bob'),(2, 'jane');

SELECT * FROM table_name;
Empty set (0.001 sec)
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.