0

0

mysql如何理解Blackhole引擎_mysql黑洞表复制中继应用

P粉602998670

P粉602998670

发布时间:2026-03-17 12:43:37

|

853人浏览过

|

来源于php中文网

原创

Blackhole表能作复制中继因其“吃数据但吐binlog”:INSERT被解析提交并写入binlog,但跳过磁盘写入;需主库binlog_format=STATEMENT,中继节点启用log-bin、server-id,下游指向该节点。

mysql如何理解blackhole引擎_mysql黑洞表复制中继应用

Blackhole表为什么能当复制中继用

因为它的核心行为是“吃掉数据但吐出binlog”——所有 INSERT 语句都会被正常解析、事务提交成功、返回影响行数,但底层跳过任何磁盘写入;只要主库启用了 log-bin,这些语句就照常写进二进制日志,下游从库就能拉到并执行。

关键点在于:它不存数据,却完整参与复制链路。这让你能在中间节点做“逻辑过滤”,比如只让特定库/表的变更继续往下传,而其他流量在这一层就被“静默丢弃”。

  • 必须确保主库的 binlog_format 设为 STATEMENT ——ROWMIXED 下,UPDATE/DELETE 对 Blackhole 表的操作会被跳过,不记入 binlog,导致下游收不到
  • Blackhole 从库仍需配置 server-id、开启 relay_log,并运行 START SLAVE;它和普通从库一样拉日志、写中继日志、回放 SQL,只是回放时数据没落地
  • 它不支持外键、不维护自增值(重启后重置)、不能建临时表——这些限制不影响中继功能,但如果你试图在上面加触发器或联合查询,会直接报错

怎么配一个Blackhole中继从库

不是简单建个表就行,得把它嵌进复制拓扑里:Master → Blackhole Slave → Real Slave。中间这台要既当从库(拉 Master 的 binlog),又当主库(供下游连)。

  • 在中继节点上关闭 skip_slave_start,确保重启后自动恢复复制
  • 配置文件里加:log-bin = mysql-bin(必须启用 binlog 才能被下游连)、binlog_format = STATEMENTserver-id = 2(不能和主库或其他节点重复)
  • 建表时指定引擎:CREATE TABLE filter_table (...) ENGINE = BLACKHOLE;后续用 replicate-ignore-dbreplicate-do-table 控制哪些语句实际写入该表(即哪些会进 binlog)
  • 下游 Real Slave 的 CHANGE MASTER TO 指向这个中继节点的 IP 和端口,而不是原始 Master

常见错误:数据突然“断流”了

现象是下游从库停在某个位置不动,SHOW SLAVE STATUS\G 显示 Seconds_Behind_Master: NULLSlave_SQL_Running: No,错误信息里出现 Table 'db.t' doesn't existUnknown table

Spell.tools
Spell.tools

高颜值AI内容营销创作工具

下载

根本原因往往不是 Blackhole 表本身,而是你忘了:它只对显式写入它的语句生效。如果上游 Master 是通过 INSERT ... SELECT、存储过程或事件调度器间接操作数据,而目标表名没被 replicate-do-table 明确放行,那这条语句根本不会落到 Blackhole 表上,也就不会进 binlog,下游自然收不到。

  • 检查 SHOW BINLOG EVENTS IN 'mysql-bin.000001',确认你期望的语句是否真的出现在中继节点的 binlog 里
  • 避免用 replicate-wild-ignore-table 这类模糊规则——Blackhole 中继对匹配精度极其敏感,宁可用多个 replicate-do-table
  • 如果 Master 启用了 GTID,中继节点也必须开 gtid_mode = ON 并设 enforce_gtid_consistency = ON,否则复制会卡在初始化阶段

别把Blackhole当“万能假表”滥用

它确实能接住 INSERT 脚本、绕过数据污染,但一旦涉及主键冲突检测、唯一约束、触发器上下文或事务可见性判断,就会暴露本质:它不参与存储引擎层的任何校验。

  • 往 Blackhole 表插重复主键,不会报 Duplicate entry 错误——它压根不查索引
  • INSERT INTO bh_table SELECT * FROM real_tableROW 格式下不会进 binlog,但语句本身执行成功,容易让人误以为“转发成功”
  • 高并发写入时,虽然不刷盘,但解析、构建 event、写 binlog 缓冲区仍占内存和 CPU,监控 Threads_runningBinlog_cache_use 指标比看磁盘 I/O 更重要

真正难处理的从来不是“怎么让它工作”,而是“怎么证明它按你设想的方式过滤”——建议每次上线前,用 mysqlbinlog 抽样解析中继节点的 binlog,逐条对照业务变更是否如预期透传或拦截。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1135

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2277

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1764

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

588

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

441

2024.04.29

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 858人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号