[Mysql] mysql blackhole-engine详解


本文总阅读量

1、mysql 黑洞引擎就像黑洞一样,能接受数据,但把接受的数据扔掉,不存储数据,检查结果返回为空。

1
2
3
4
5
6
7
mysql> CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM test;
Empty set (0.00 sec)

2、创建黑洞引擎表,数据目录下回创建表格式文件,以表明开头后缀为.frm,没有与该表关联的其他文件

黑洞引擎支持所有类型的索引,定义表时,可以声明索引。

1
2
ll test.*
-rw-r----- 1 mysql mysql 8578 Sep 4 06:22 test.frm

3、可以通过show engines查看是否支持黑洞引擎:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

4、黑洞引擎表不存储任何数据,但是如果启用了二进制日志,sql语句会被记录并复制到从库,这对于中继机制和过滤机制很有用。

1
假设您的应用程序需要从属端过滤规则,但是传输所有的二进制数据到从库会造成很大的网络流量,在这种情况下,在主库设置存储引擎为黑洞的‘dummy’从进程,如下图所示:

1
2
3
主库写入二级制日志,‘dummy’mysqld 进程作为从进程执行,合并replicate-do-* 和replicate-ignore-*规则,自己写入一个新的,过滤好的二进制日志,该过滤日志传递给从库。
虚拟的进程不存储任何数据,因此外的mysqld进程复制主库信息产生少量的开销。
黑洞引擎表,insert触发器可正常使用,但是因为不存储数据,update和delete引擎没有激活,因为没有行,for each row触发器定义不适用。

5、黑洞引擎的用途:

1
2
3
1、验证转储文件语法
2、启用或禁用二级制日志,来测量二进制日志带来的开销
3、黑洞引擎本质上是一个无操作的引擎,因此可以用于查找与引擎本身无关的性能瓶颈。

黑洞引擎是交易感知的,提交的事物写入二进制日志,回滚事物不写入。

6、黑洞引擎和自动增量列的问题:

1
2
3
4
主从架构数据库:1、主库黑洞表有一个自动增量字段是主键;2、从服务器有相同表引擎为myisam,3、主库执行insert,并隐式设置增量值。
在这种情况下,主从复制将失败,
如果主站有许多从站,则在发送到从站之前进行过滤可能会减少网络流量。
在基于行的复制中,引擎为行返回的值对于每个插入始终是相同的。这将导致从服务器尝试使用主键列的相同值重播两个插入日志条目,因此复制将失败。

7、黑洞引擎和列过滤问题:

1
2
3
4
基于行的复制,从库支持表中缺少最后一列。
从库端执行过滤,在执行过滤之前,先将数据传到从库,最少有两种情况不希望将列拷贝到从库:
1、数据是机密的,从库没有权限访问它;
2、主库有多个从库,在发送到从库之前执行过滤用于减少网络带宽

官方文档提供的案例如下,对于受信任和不受信任从库的语句未找到合理解释,没看懂:

1
2
3
4
5
6
7
8
使用BLACKHOLE引擎和 --replicate-do-table或 --replicate-ignore-table选项,可以实现主列过滤,
主库配置:
CREATE TABLE t1 (public_col_1, ..., public_col_N,
secret_col_1, ..., secret_col_M) ENGINE=MyISAM;
受信任的从库配置:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=BLACKHOLE;
不受信任的从库配置:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=MyISAM;
目录
  1. 1. 1、mysql 黑洞引擎就像黑洞一样,能接受数据,但把接受的数据扔掉,不存储数据,检查结果返回为空。
  2. 2. 2、创建黑洞引擎表,数据目录下回创建表格式文件,以表明开头后缀为.frm,没有与该表关联的其他文件
  3. 3. 3、可以通过show engines查看是否支持黑洞引擎:
  4. 4. 4、黑洞引擎表不存储任何数据,但是如果启用了二进制日志,sql语句会被记录并复制到从库,这对于中继机制和过滤机制很有用。
  5. 5. 5、黑洞引擎的用途:
  6. 6. 6、黑洞引擎和自动增量列的问题:
  7. 7. 7、黑洞引擎和列过滤问题:

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog