Chinaunix首页 | 论坛 | 博客
  • 博客访问: 492096
  • 博文数量: 99
  • 博客积分: 3621
  • 博客等级: 中校
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-22 16:29
文章存档

2012年(21)

2011年(28)

2010年(50)

分类: Mysql/postgreSQL

2011-08-03 16:00:16

架构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操作。






阅读(869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~