的黑洞
存储引擎作为一个”黑洞”它接受数据,但将其丢弃,不存储数据。检索总是返回一个空结果:
mysql> CREATE TABLE test(i INT, c CHAR(10))查询OK, 0行影响(0.03秒)mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');查询OK, 2 rows affected (0.00 sec) Records: 2 duplicate: 0 warning: 0 mysql> SELECT * FROM test;空集(0.00秒)
要启用黑洞
存储引擎,如果你从源代码,调用CMake与-DWITH_BLACKHOLE_STORAGE_ENGINE
选择。
检查源黑洞
引擎,看里面sql
MySQL源发行版的目录。
当您创建黑洞
表,服务器在数据库目录中创建一个表格式文件。该文件以表名开头,并具有.frm
扩展。没有与该表相关联的其他文件。
的黑洞
存储引擎支持各种索引。也就是说,可以在表定义中包含索引声明。
密钥的最大长度为1000字节。
您可以检查是否黑洞
存储引擎可与显示引擎
声明。
插入一个黑洞
表不存储任何数据,但如果启用了基于语句的二进制日志记录,则SQL语句将被记录并复制到复制服务器。这可以作为中继器或过滤器机制。
假设您的应用程序需要副本端过滤规则,但是首先将所有二进制日志数据传输到副本会导致过多的流量。在这种情况下,可以在源主机上设置一个”假”默认存储引擎为的副本进程黑洞
,描述如下:
源写入它的二进制日志。的”假”mysqld流程充当副本,应用所需的组合replicate-do - *
而且replicate-ignore - *
规则,并写入自己的一个新的经过过滤的二进制日志。(见第16.1.6节“复制和二进制日志选项和变量”)。这个过滤后的日志被提供给副本。
虚拟进程实际上并不存储任何数据,因此运行附加进程所产生的处理开销很小mysqld进程。这种类型的设置可以用其他复制副本重复。
插入
诱因黑洞
表按预期工作。然而,因为黑洞
表实际上并不存储任何数据,更新
而且删除
触发器未激活:为每一行
子句在触发器定义中不适用,因为没有行。
的其他可能用途黑洞
存储引擎包括:
验证转储文件语法。
通过使用比较性能,测量二进制日志记录的开销
黑洞
启用或不启用二进制日志记录。黑洞
本质上是一个”无操作”因此,它可以用于查找与存储引擎本身无关的性能瓶颈。
的黑洞
Engine是事务感知的,即提交的事务被写入二进制日志,而回滚的事务则不会。
黑洞引擎和自动递增列
黑洞引擎是一个无操作的引擎。使用BLACKHOLE对表执行的任何操作都没有效果。在考虑自动递增的主键列的行为时,应该记住这一点。引擎不自动增加字段值,也不保留自动增加列状态。这在复制中具有重要意义。
考虑以下复制场景,其中以下三个条件都适用:
在源服务器上有一个黑洞表,其自动递增字段是主键。
在副本上存在相同的表,但使用了MyISAM引擎。
控件中的自动增量值不显式设置,即可在源表中执行插入
插入
语句本身或通过使用设置INSERT_ID
声明。
在这种情况下,复制失败,主键列上出现重复条目错误。
在基于语句的复制中,值INSERT_ID
在上下文中,事件总是相同的。因此,由于试图插入主键列的值重复的行,复制会失败。
在基于行的复制中,对于每次插入,引擎为行返回的值总是相同的。这将导致复制尝试使用主键列的相同值重放两个插入日志项,因此复制失败。
列过滤
当使用基于行的复制时,(binlog_format =行
),支持表中缺少最后一列的副本,如本节所述第16.4.1.10节“源和副本的表定义不同的复制”.
这种过滤作用于副本端,也就是说,列在被过滤掉之前被复制到副本中。至少有两种情况不希望将列复制到副本:
如果数据是机密的,那么副本服务器就不能访问它。
如果源有很多副本,在发送到副本之前进行过滤可能会减少网络流量。
方法可以实现源列过滤黑洞
引擎。的实现方式与实现源表过滤的方式类似——使用黑洞
发动机和——replicate-do-table
或——replicate-ignore-table
选择。
源代码的设置是:
创建表t1 (public_col_1,…), public_col_N, secret_col_1,…, secret_col_M) = MyISAM引擎;
受信任副本的设置如下:
创建表t1 (public_col_1,…)public_col_N)引擎=黑洞;
不可信副本的设置是:
创建表t1 (public_col_1,…), public_col_N) = MyISAM引擎;