这黑洞
存储引擎充当“黑洞“接受数据,但将其抛出并不存储它。检索总是返回一个空结果:
MySQL>创建表测试(i int,c char(10))引擎=黑孔;查询OK,影响0行(0.03秒)MySQL>插入到测试值(1,'记录一个'),(2,'记录二');查询确定,2行受影响(0.00秒)记录:2重复项:0警告:0 MySQL> Select * from Test;空集(0.00秒)
启用黑洞
存储引擎如果从源代码构建MySQL,请调用CMake.与之-dwith_blackhole_storage_engine.
选项。
检查来源黑洞
发动机,看看SQL.
MySQL源分发的目录。
当你创建一个黑洞
表,服务器在全局数据字典中创建表定义。没有与表关联的文件。
这黑洞
存储引擎支持各种索引。也就是说,您可以在表定义中包含索引声明。
MySQL 8.0.27的最大键长度为3072字节。在8.0.27之前,最大键长度为1000字节。
这黑洞
存储引擎不支持分区。
你可以检查是否黑洞
存储引擎可用展示引擎
陈述。
插入A.黑洞
表不存储任何数据,但如果启用了基于语句的二进制日志记录,则会记录SQL语句并复制到副本服务器。这可以用作中继器或过滤机制。
假设您的应用程序需要副本侧过滤规则,但将所有二进制日志数据传输到副本,首先导致运输过多。在这种情况下,可以在复制源服务器A上设置“假“默认存储引擎的副本过程黑洞
,如下所示:
源将写入其二进制日志。这“假“mysqld.过程充当复制品,应用所需的组合replicate-do- *
和replicate-Ignore- *
规则,并写入新的,过滤的二进制日志。(看第17.1.6节“复制和二进制记录选项和变量”。)将此过滤的日志提供给副本。
虚拟过程实际上并不存储任何数据,因此通过运行额外的处理截止点几乎没有处理开销mysqld.在Replication Source Server上的进程。可以使用附加副本重复此类设置。
插
触发器黑洞
表格按预期工作。但是,因为黑洞
表实际上并不存储任何数据,更新
和删除
触发器未激活:对于每一行
触发定义中的子句不适用,因为没有行。
其他可能的用途黑洞
存储引擎包括:
验证转储文件语法。
通过使用比较使用性能来测量二进制记录的开销
黑洞
启用和没有二进制记录。黑洞
基本上是A.“无op.“存储引擎,因此它可用于查找与存储引擎本身无关的性能瓶颈。
这黑洞
引擎是事务感知的,在提交的事务被写入二进制日志和回滚事务的意义上不是。
黑洞引擎和自动增量列
这黑洞
发动机是NO-OP发动机。在表中执行的任何操作黑洞
没有效果。在考虑自动增量的主要键列的行为时,应考虑到这一点。引擎不会自动增量字段值,并且不会保留自动增量字段状态。这在复制方面具有重要意义。
考虑以下复制方案,其中所有三个条件适用:
在源服务器上有一个带有自动增量字段的黑洞表,即主键。
在复制品上,存在相同的表格,但使用MyISAM引擎。
在源表中执行插入,而不明确地设置自动增量值
插
声明本身或通过使用a设置插入_id.
陈述。
在此方案中,复制失败在主键列上具有重复的条目错误。
在基于语句的复制中,值insert_id.
在上下文中,事件总是相同的。因此,复制导致由于尝试使用重复值为主键列插入行而失败。
在基于行的复制中,引擎返回行的值对于每个插入件始终相同。这导致副本尝试使用相同的主键列的值重放两个插入日志条目,因此复制失败。
列过滤
使用基于行的复制时(binlog_format =行
),支持表中缺少最后一列的副本,如本节所述第17.5.1.9节“源和副本的不同表定义”。
此过滤在副本侧面工作,即,在过滤外,列将复制到副本。至少有两种情况下,不希望将列复制到副本:
如果数据是机密的,则副本服务器不应该访问它。
如果源具有许多副本,则在发送到副本之前过滤可能会降低网络流量。
可以使用源列过滤黑洞
引擎。这是通过类似于如何实现源表滤波的方式进行的黑洞
发动机和这一点- 重新填充do-table
或者- 一次性忽略表
选项。
源的设置是:
创建表T1(public_col_1,...,public_col_n,secret_col_1,...,secret_col_m)引擎= myisam;
可信副本的设置是:
创建表T1(public_col_1,...,public_col_n)引擎= blackhole;
不受信任的副本的设置是:
创建表T1(public_col_1,...,public_col_n)引擎= myisam;