如何定制MySQL中间件实现Binlog过滤?
- 内容介绍
- 文章标签
- 相关推荐
嘿,你有没有遇到过这种情况:MySQL的binlog文件一大堆,但你只需要其中一部分数据?比如你只想抽某个表的insert操作,或者干脆不要delete语句? 不地道。 那可就有点麻烦了。不过别急, 我们今天就来聊聊怎么通过定制一个中间件来实现这个“**过滤**”功能,让你随心所欲地控制binlog的输出内容。
先说说问题在哪
你有没有发现,MySQL的binlog默认是不支持表级过滤的?对,你没看错,它就是这么“死板”。你得自己想办法。比如你有1000张表, 本质上... 但你只想要其中3张的变更记录,那怎么办?你不能指望MySQL原生支持这个功能,对吧?所以我们得自己动手,丰衣足食。

这时候, 你可能想到的方案是:我能不能在MySQL配置里加个参数,让binlog只记录我感兴趣的表?比如用 binlog_do_db 或者 binlog_ignore_db?可以但……这玩意儿只对数据库级别的过滤有效,而且它还不能保证事务一致性,所以还是不够灵活。那咋办,我血槽空了。?
来点实际的, 搞个中间件
这时候,你就需要一个**中间件**,一个能拦截binlog、按需过滤、再转发给下游的“中间人”。这个中间件,就是我们今天要讲的重点。
我们来设想一下 你有一个数据抽取工具,比如一个Kafka消费者,或者一个数据同步程序,它需要从MySQL的binlog中只抽取你关心的表,比如只抽订单表的变更。这时候,你不能让这个工具去读整个binlog,主要原因是数据量太大,而且杂。所以你得在中间加个“过滤器”——也就是我们说的“中间件”——来帮你把不想要的binlog事件给过滤掉。
动手写个中间件
我们来写一个简单的Python中间件, 它能监听MySQL的binlog,然后根据你的规则来决定哪些事件要放行,哪些要过滤掉。比如你只想要insert操作,那就把delete和update的事件给过滤掉。
害... 我们来举个例子, 比如你只想要某个表的insert操作,那我们就可以在中间件里加个判断,如果事件类型是delete或者update,就直接丢掉,不传给下游。
下面是一个简单的Python代码示例, 我们用的是 mysql-replication 这个库来解析binlog, 格局小了。 然后根据表名、事件类型等信息来过滤数据:
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import (
WriteRowsEvent,
UpdateRowsEvent,
DeleteRowsEvent
)
MYSQL_SETTINGS = {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"passwd": "your_password"
}
def main:
stream = BinLogStreamReader(
connection_settings=MYSQL_SETTINGS,
server_id=1,
blocking=True,
resume_stream=True
)
for binlogevent in stream:
for event in binlogevent:
if isinstance:
print
for row in:
print
elif isinstance:
print
for row in:
print
elif isinstance:
print
for row in:
print
if __name__ == "__main__":
main
这个代码能让你看到binlog事件的类型和内容,但你可能只想要其中一部分事件, 何苦呢? 比如只处理insert操作。那你可以加个判断, 比如:
if isinstance:
# 只处理insert事件
for row in:
print
一句话。 这样,你就可以实现一个简单的binlog过滤器了。
中间件的实现
我们来写一个简单的中间件, 它能监听binlog,然后根据你的规则来过滤事件。比如你只想要insert操作,那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据,格局小了。。
比如你只想要某个表的insert操作,那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据,胡诌。。
MySQL中间件实现binlog过滤的几种方式
我们来对比几种常见的binlog过滤方式:,容我插一句...
| 方式 | 说明 | 适用场景 |
|---|---|---|
| binlog_do_db | 只记录指定数据库的binlog | 数据库级过滤 |
| binlog_ignore_db | 忽略指定数据库的binlog | 数据库级过滤 |
| binlog_row_image | 控制binlog记录的事件类型 | 行级过滤 |
| 自定义中间件 | 通过中间件实现事件过滤 | 应用级过滤 |
你可以只对数据库级有效,不能精确到表。
好了我们来一下。你如果只想抽取某个表的insert操作,那你可以用中间件来实现。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据。比如你只想要某个表的insert操作, 得了吧... 那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据。
嘿,你有没有遇到过这种情况:MySQL的binlog文件一大堆,但你只需要其中一部分数据?比如你只想抽某个表的insert操作,或者干脆不要delete语句? 不地道。 那可就有点麻烦了。不过别急, 我们今天就来聊聊怎么通过定制一个中间件来实现这个“**过滤**”功能,让你随心所欲地控制binlog的输出内容。
先说说问题在哪
你有没有发现,MySQL的binlog默认是不支持表级过滤的?对,你没看错,它就是这么“死板”。你得自己想办法。比如你有1000张表, 本质上... 但你只想要其中3张的变更记录,那怎么办?你不能指望MySQL原生支持这个功能,对吧?所以我们得自己动手,丰衣足食。

这时候, 你可能想到的方案是:我能不能在MySQL配置里加个参数,让binlog只记录我感兴趣的表?比如用 binlog_do_db 或者 binlog_ignore_db?可以但……这玩意儿只对数据库级别的过滤有效,而且它还不能保证事务一致性,所以还是不够灵活。那咋办,我血槽空了。?
来点实际的, 搞个中间件
这时候,你就需要一个**中间件**,一个能拦截binlog、按需过滤、再转发给下游的“中间人”。这个中间件,就是我们今天要讲的重点。
我们来设想一下 你有一个数据抽取工具,比如一个Kafka消费者,或者一个数据同步程序,它需要从MySQL的binlog中只抽取你关心的表,比如只抽订单表的变更。这时候,你不能让这个工具去读整个binlog,主要原因是数据量太大,而且杂。所以你得在中间加个“过滤器”——也就是我们说的“中间件”——来帮你把不想要的binlog事件给过滤掉。
动手写个中间件
我们来写一个简单的Python中间件, 它能监听MySQL的binlog,然后根据你的规则来决定哪些事件要放行,哪些要过滤掉。比如你只想要insert操作,那就把delete和update的事件给过滤掉。
害... 我们来举个例子, 比如你只想要某个表的insert操作,那我们就可以在中间件里加个判断,如果事件类型是delete或者update,就直接丢掉,不传给下游。
下面是一个简单的Python代码示例, 我们用的是 mysql-replication 这个库来解析binlog, 格局小了。 然后根据表名、事件类型等信息来过滤数据:
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import (
WriteRowsEvent,
UpdateRowsEvent,
DeleteRowsEvent
)
MYSQL_SETTINGS = {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"passwd": "your_password"
}
def main:
stream = BinLogStreamReader(
connection_settings=MYSQL_SETTINGS,
server_id=1,
blocking=True,
resume_stream=True
)
for binlogevent in stream:
for event in binlogevent:
if isinstance:
print
for row in:
print
elif isinstance:
print
for row in:
print
elif isinstance:
print
for row in:
print
if __name__ == "__main__":
main
这个代码能让你看到binlog事件的类型和内容,但你可能只想要其中一部分事件, 何苦呢? 比如只处理insert操作。那你可以加个判断, 比如:
if isinstance:
# 只处理insert事件
for row in:
print
一句话。 这样,你就可以实现一个简单的binlog过滤器了。
中间件的实现
我们来写一个简单的中间件, 它能监听binlog,然后根据你的规则来过滤事件。比如你只想要insert操作,那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据,格局小了。。
比如你只想要某个表的insert操作,那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据,胡诌。。
MySQL中间件实现binlog过滤的几种方式
我们来对比几种常见的binlog过滤方式:,容我插一句...
| 方式 | 说明 | 适用场景 |
|---|---|---|
| binlog_do_db | 只记录指定数据库的binlog | 数据库级过滤 |
| binlog_ignore_db | 忽略指定数据库的binlog | 数据库级过滤 |
| binlog_row_image | 控制binlog记录的事件类型 | 行级过滤 |
| 自定义中间件 | 通过中间件实现事件过滤 | 应用级过滤 |
你可以只对数据库级有效,不能精确到表。
好了我们来一下。你如果只想抽取某个表的insert操作,那你可以用中间件来实现。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据。比如你只想要某个表的insert操作, 得了吧... 那就把delete和update的事件给过滤掉。你可以用Python写一个中间件,监听binlog,然后根据表名、事件类型等信息来过滤数据。

