免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1326 | 回复: 0
打印 上一主题 下一主题

双M模式下,DDL到备库执行的好处 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:53 |只看该作者 |倒序浏览
架构M1<->M2,M1主,M2备,双向同步。

现在需要对T1表添加一个字段COL1。
一般的做法是直接在M1上进行ALTER TABLE操作,SQL语句记录到BINLOG,复制到M2,再在M2上重放,完成表结构的修改。这样的操作在表小的时候能够很快完成,但是存在如下几种安全隐患:

1:T1表很大,比如10G,由于MYSQL处理DDL机制,导致这个ALTER TABLE操作需要30分钟才能完成。在这30分钟内,T1表是被锁定的,不能写入,那么只要涉及到T1表的写入业务就会全部等待,直至超时报错退出。严重影响了正常业务的运行。

2:T1表一般大,比如1G,ALTER TABLE处理需要5分钟,而且业务允许5分钟的写入失败。主上的ALTER TABLE写入BINLOG日志后,立刻复制到M2上,在M2上进行回放。由于MYSQL复制是单线程的,M2对于复制的SQL线程在完成ALTER TABLE之前,是不会执行其他SQL的。因为它排在队列的最前面。如果此时M1宕机,M2上还会存在5分钟的SQL没有被执行完,那么M1,M2上的数据是不一致的。这时候M2没法顶上做写入服务。

出现1,2都是不能接受的。
处理1的方式:
在M2上以不记录日志的方式

set sql_log_bin =0
alter table t1.....(在这里给添加的字段一个默认值)
set sql_log_bin =1

此时T1被锁,但是不影响别的表的复制。当M2上的DDL操作完成后,停止M2到M1的复制,再把写入切换到M2上,再做M1上的DDL。全部替换好后,替换新的PHP程序。

处理2的方式:
在M2上操作,不写日志,完成后到M1操作。






您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP