OSC实现原理剖析
(2011-11-01 09:12:25)
标签:
osc实现原理剖析杂谈 |
作者:杨挺
一 、背景
在我们的数据库操作中,更改表结构是一个常见的操作,而当我们的表数据量非常大时,我们更改表结构的时间是非常的长,并且在跟改期间,会生成一个互斥锁,阻塞对整个表的所有操作,这样,对于我们线上数据来说是无法容忍的,而我们怎么能在线修改表结构而不影响线上业务呢?这就本文所要介绍的Online Schema Change(简称:OSC)
在我们的以前做法中,为了不影响线上业务,我们一般采用:先在线下从库更改表结构,然后替换线上从库,这样一台台的修改,最后做一下主库切换,这个过程会耗费很长时间,并且在做主库切换时,风险也非常的大,我们怎样才能让时间更短,且能不阻塞读写情况下在线修改呢?早在2008年Shlomi Noach
二、详细实现原理及过程
pt-online-schema-change在线更改表结构的实现核心有如下几个过程:
(注:在跟改过程中涉及到三个表:原表、tmp_table即作为原表导数据的临时表,old_table在最后rename 原表的结果表)
1、
2、
3、
(1)CREATE TRIGGER mk_osc_del AFTER DELETE ON $table " "FOR EACH ROW "
"DELETE IGNORE FROM $new_table ""WHERE $new_table.$chunk_column = OLD.$chunk_column";
(2)CREATE TRIGGER mk_osc_ins AFTER INSERT ON $table " "FOR EACH ROW "
(3)CREATE TRIGGER mk_osc_upd AFTER UPDATE ON $table " "FOR EACH ROW "
"REPLACE INTO $new_table ($columns) " "VALUES ($new_values)";
(1)
(2)
(3)
我们也能看出上述的精髓也就这这几条replace into操作,正是因为这几条replace into才能保证数据的一致性
4、
INSERT IGNORE INTO $to_table ($columns)
"
5、
"RENAME TABLE `$db`.`$tmp_tbl` TO `$db`.`$tbl`"; 在rename过程,其实我们还是会导致写入读取堵塞的,所以从严格意思上说,我们的OSC也不是对线上环境没有一点影响,但由于rename操作只是一个修改名字的过程,也只会修改一些表的信息,基本是瞬间结束,故对线上影响不太大
6、
1、
2、
3、
4、
5、
6、
以上列到的,只是部分问题,我想如果需要在线进行实施,还需要经过严格的测试,但是它的实现为我们提供了一个很好的在线更改表结构方法,我相信只要我们能很好的规避他的弊端,它会给我们带来很大的帮助;
使用方法:
pt-online-schema-change h=*,u=* p=**,P=*
,D=enk,t=my1 --alter "add is_sign_1 int(11) unsigned NOT NULL
DEFAULT '0'" --drop-old-table [--sleep 10]
参考文档:
1、 http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html
2、 http://openarkkit.googlecode.com/svn/trunk/openarkkit/doc/html/oak-online-alter-table.html
3、 http://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932