前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >借助ProxySQL来解决MySQL 主从复制无法过滤binlog event事件这一缺陷

借助ProxySQL来解决MySQL 主从复制无法过滤binlog event事件这一缺陷

原创
作者头像
贺春旸的技术博客
发布2024-07-25 16:50:34
610
发布2024-07-25 16:50:34
举报
文章被收录于专栏:DBA 平台和工具

MySQL 主从复制,在最新的9.0版本里,仍旧无法实现过滤binlog event事件,例如主库上执行drop和truncate操作,从库同步复制后,直接过滤掉drop和truncate操作。

DBA、运维或者研发一旦手滑误操作,直接P0,毁灭性的伤害。

而这个实用价值极高的需求,在TiDB DM里早已经实现。

那么,我们需要借助ProxySQL来解决MySQL 主从复制这一缺陷。

思想

如果主库执行drop和truncate,临时关闭binlog,在命令前面增加set sql_log_bin=0,这样主库执行完以后,binlog不会记录,从库也就不会执行。

实施

1.安装ProxySQL

代码语言:bash
复制
# cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name=ProxySQL repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/repo_pub_key
EOF

# yum install proxysql -y
# systemctl start proxysql

2.配置ProxySQL规则

-- 连接到ProxySQL管理界面

# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

-- 配置MySQL服务器

INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'127.0.0.1',6666);

INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (2,'127.0.0.1',6667);

-- 配置用户

INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('rd','123456',1);

-- 设置查询规则来重写DROP和TRUNCATE语句

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, replace_pattern, destination_hostgroup, apply)

VALUES (1, 1, '^DROP', 'SET sql_log_bin=0; DROP', 1, 1);

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, replace_pattern, destination_hostgroup, apply)

VALUES (2, 1, '^TRUNCATE', 'SET sql_log_bin=0; TRUNCATE', 1, 1);

-- 添加一个规则来重置sql_log_bin

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, replace_pattern, destination_hostgroup, apply)

VALUES (3, 1, '^(DROP|TRUNCATE)', 'SET sql_log_bin=0; ${1}; SET sql_log_bin=1;', 1, 1);

-- 加载配置到运行时环境

LOAD MYSQL SERVERS TO RUNTIME;

LOAD MYSQL USERS TO RUNTIME;

LOAD MYSQL QUERY RULES TO RUNTIME;

-- 保存配置

SAVE MYSQL SERVERS TO DISK;

SAVE MYSQL USERS TO DISK;

SAVE MYSQL QUERY RULES TO DISK;

这个配置的工作原理如下:

  1. 我们定义了两个服务器组:主库(hostgroup 1)和从库(hostgroup 2)。

2. 我们创建了一个应用程序使用的用户 rd,默认连接到主库。

3. 我们设置了三个查询规则:

  • 规则1和2:匹配 DROP 和 TRUNCATE 语句,在它们前面添加 SET sql_log_bin=0;。
  • 规则3:更全面的规则,它不仅在操作前禁用 binlog,还在操作后重新启用它。这可以确保只有特定的 DROP 或 TRUNCATE 操作不被记录到 binlog。
  • 所有这些规则都被设置为应用到主库(hostgroup 1)。

使用这种方法的优势:

  1. 它只影响 DROP 和 TRUNCATE 操作,其他操作不受影响。
  2. 它自动在这些操作前禁用 binlog 记录,操作后重新启用,无需手动干预。
  3. 这些更改对应用程序是透明的,不需要修改应用代码。

使用

DBA、运维或者研发直接访问ProxySQL的6033端口

代码语言:bash
复制
mysql -u rd -p123456 -h 127.0.0.1 -P6033

当执行drop和truncate操作时,只会在主库上执行,从库上不会执行,从而实现了过滤binlog event事件。

注:rd用户需要在后端mysql主库上创建。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思想
  • 实施
    • 1.安装ProxySQL
      • 2.配置ProxySQL规则
      • 这个配置的工作原理如下:
      • 使用这种方法的优势:
      • 使用
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档