BLACKHOLE
BLACKHOLE
存储引擎接受数据但不存储数据并始终返回空结果。
使用 BLACKHOLE
存储引擎的表由单个 .frm 表格格式文件组成,但没有关联的数据或索引文件。
例如,如果您想在从服务器上运行复杂的过滤规则而不会在主服务器上产生任何开销,则此存储引擎可能很有用。主服务器可以运行 BLACKHOLE
存储引擎,将数据复制到从服务器进行处理。
Contents
安装插件
虽然插件的共享库默认情况下随 MariaDB 分发,但 MariaDB 实际上默认情况下不会安装插件。有两种方法可以用于在 MariaDB 中安装插件。
第一种方法可用于在不重新启动服务器的情况下安装插件。您可以通过执行 INSTALL SONAME 或 INSTALL PLUGIN 来动态安装插件。例如:
INSTALL SONAME 'ha_blackhole';
第二种方法可用于告诉服务器在启动时加载插件。可以通过提供 --plugin-load 或 --plugin-load-add 选项来安装插件。这可以作为命令行参数指定给 mysqld,也可以在相关的服务器 option group 中在 option file 中指定。例如:
[mariadb] ... plugin_load_add = ha_blackhole
卸载插件
您可以通过执行 UNINSTALL SONAME 或 UNINSTALL PLUGIN 来动态卸载插件。例如:
UNINSTALL SONAME 'ha_blackhole';
如果您通过在相关服务器 option group 中的 option file 中提供 --plugin-load 或 --plugin-load-add 选项来安装插件,则应删除这些选项以防止下次重新启动服务器时加载插件。
使用 BLACKHOLE 存储引擎
与 DML 一起使用
INSERT,UPDATE 和 DELETE 语句都可以与 BLACKHOLE
存储引擎一起使用。但是,实际上不会应用任何数据更改。
与复制一起使用
如果启用了二进制日志,则所有 SQL 语句都将像往常一样记录,并复制到任何从服务器。但是,由于未存储行,因此重要的是使用基于语句而不是行或混合格式,因为 UPDATE 和 DELETE 语句既不记录也不复制。请参阅 二进制日志格式。
与触发器一起使用
某些 触发器 可与 BLACKHOLE
存储引擎一起使用。
对于 INSERT 语句的 BEFORE
触发器仍然会被激活。
对于 UPDATE 和 DELETE 语句的 触发器 不会被激活。
带有 FOR EACH ROW
子句的 触发器 不适用,因为表格没有行。
与外键一起使用
不支持外键。如果将一个 InnoDB 表转换为 BLACKHOLE
,则外键将消失。如果将相同的表格转换回 InnoDB,则必须重新创建它们。
与虚拟列一起使用
如果将包含虚拟列的 InnoDB 表转换为 BLACKHOLE
,则会产生错误。
与 AUTO_INCREMENT 一起使用
因为 BLACKHOLE 表格不存储数据,所以它不会维护 AUTO_INCREMENT 值。如果您正在复制到可以处理 AUTO_INCREMENT
列的表格,并且没有在 INSERT 查询中显式设置主键自增值,也没有使用 SET INSERT_ID 语句,则插入操作将在从服务器上失败,因为存在重复键。
限制
最大键大小为:
- 3500 字节(>= MariaDB 10.1.48、MariaDB 10.2.35、MariaDB 10.3.26、MariaDB 10.4.16 和 MariaDB 10.5.7)
- 1000 字节(<= MariaDB 10.1.47、MariaDB 10.2.34、MariaDB 10.3.25、MariaDB 10.4.15 和 MariaDB 10.5.6)。
示例
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)