相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 236.9 kb
手册页(邮政编码)- 348.5 kb
信息(Gzip)- 3.4 mb
信息(邮政编码)- 3.4 mb
本手册节选

15.6黑洞存储引擎

黑洞存储引擎作为一个黑洞它接受数据,但将其丢弃,不存储数据。检索总是返回一个空结果:

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选择。

检查源黑洞引擎,看里面sqlMySQL源发行版的目录。

当您创建黑洞表,服务器在数据库目录中创建一个表格式文件。该文件以表名开头,并具有.frm扩展。没有与该表相关联的其他文件。

黑洞存储引擎支持各种索引。也就是说,可以在表定义中包含索引声明。

密钥的最大长度为1000字节。

您可以检查是否黑洞存储引擎可与显示引擎声明。

插入一个黑洞表不存储任何数据,但如果启用了基于语句的二进制日志记录,则SQL语句将被记录并复制到复制服务器。这可以作为中继器或过滤器机制。

假设您的应用程序需要副本端过滤规则,但是首先将所有二进制日志数据传输到副本会导致过多的流量。在这种情况下,可以在源主机上设置一个默认存储引擎为的副本进程黑洞,描述如下:

图15.1使用BLACKHOLE进行复制过滤

使用BLACKHOLE进行过滤复制

源写入它的二进制日志。的mysqld流程充当副本,应用所需的组合replicate-do - *而且replicate-ignore - *规则,并写入自己的一个新的经过过滤的二进制日志。(见第16.1.6节“复制和二进制日志选项和变量”)。这个过滤后的日志被提供给副本。

虚拟进程实际上并不存储任何数据,因此运行附加进程所产生的处理开销很小mysqld进程。这种类型的设置可以用其他复制副本重复。

插入诱因黑洞表按预期工作。然而,因为黑洞表实际上并不存储任何数据,更新而且删除触发器未激活:为每一行子句在触发器定义中不适用,因为没有行。

的其他可能用途黑洞存储引擎包括:

  • 验证转储文件语法。

  • 通过使用比较性能,测量二进制日志记录的开销黑洞启用或不启用二进制日志记录。

  • 黑洞本质上是一个无操作因此,它可以用于查找与存储引擎本身无关的性能瓶颈。

黑洞Engine是事务感知的,即提交的事务被写入二进制日志,而回滚的事务则不会。

黑洞引擎和自动递增列

黑洞引擎是一个无操作的引擎。使用BLACKHOLE对表执行的任何操作都没有效果。在考虑自动递增的主键列的行为时,应该记住这一点。引擎不自动增加字段值,也不保留自动增加列状态。这在复制中具有重要意义。

考虑以下复制场景,其中以下三个条件都适用:

  1. 在源服务器上有一个黑洞表,其自动递增字段是主键。

  2. 在副本上存在相同的表,但使用了MyISAM引擎。

  3. 控件中的自动增量值不显式设置,即可在源表中执行插入插入语句本身或通过使用设置INSERT_ID声明。

在这种情况下,复制失败,主键列上出现重复条目错误。

在基于语句的复制中,值INSERT_ID在上下文中,事件总是相同的。因此,由于试图插入主键列的值重复的行,复制会失败。

在基于行的复制中,对于每次插入,引擎为行返回的值总是相同的。这将导致复制尝试使用主键列的相同值重放两个插入日志项,因此复制失败。

列过滤

当使用基于行的复制时,(binlog_format =行),支持表中缺少最后一列的副本,如本节所述第16.4.1.10节“源和副本的表定义不同的复制”

这种过滤作用于副本端,也就是说,列在被过滤掉之前被复制到副本中。至少有两种情况不希望将列复制到副本:

  1. 如果数据是机密的,那么副本服务器就不能访问它。

  2. 如果源有很多副本,在发送到副本之前进行过滤可能会减少网络流量。

方法可以实现源列过滤黑洞引擎。的实现方式与实现源表过滤的方式类似——使用黑洞发动机和——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引擎;