MySQL 主从复制,在最新的9.0版本里,仍旧无法实现过滤binlog event事件,例如主库上执行drop和truncate操作,从库同步复制后,直接过滤掉drop和truncate操作。
DBA、运维或者研发一旦手滑误操作,直接P0,毁灭性的伤害。
而这个实用价值极高的需求,在TiDB DM里早已经实现。
那么,我们需要借助ProxySQL来解决MySQL 主从复制这一缺陷。
如果主库执行drop和truncate,临时关闭binlog,在命令前面增加set sql_log_bin=0,这样主库执行完以后,binlog不会记录,从库也就不会执行。
# 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
-- 连接到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; SET sql_log_bin=1;', 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; 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;
2. 我们创建了一个应用程序使用的用户 rd,默认连接到主库。
3. 我们设置了两个查询规则:
例如,如果原始查询是 DROP TABLE t6;
,重写后的查询将变为:
SET sql_log_bin=0; DROP TABLE t6; SET sql_log_bin=1;
DBA、运维或者研发直接访问ProxySQL的6033端口
mysql -u rd -p123456 -h 127.0.0.1 -P6033
当执行drop和truncate操作时,只会在主库上执行,从库上不会执行,从而实现了过滤binlog event事件。
注:rd用户需要在后端mysql主库上创建。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。