使用gh-ost进行在线表结构修改

2017/07/08 posted in  MySQL
Tags: 

gh-ostgithub开源的一款在线表结构修改工具,能够在不锁表的情况下修改表结构。

perconapt-osc一样,修改表结构的流程也是,新建一张表,修改表结构,同步源表的数据,将两张表改名,用新表替换旧表。至此,完成在线修改表结构。

pt-osc不同的是,pt-osc使用的是触发器来维护在数据同步过程中旧表数据的改动,并将这些改动映射到新表。而在gh-ost中则使用的是binlog的方式。

使用binlog比使用触发器的有点主要在于:

维护触发器的开销比较大,这个开销包括触发器在执行时代码的开销和锁的开销。而使用binlog的开销更小。
一旦使用了触发器就无法暂停。而使用binlog的方式则更灵活,在同步的过程中可以暂停,还可以调整一些参数。
下面是一个gh-ost使用的例子:

./gh-ost -throttle-control-replicas='10.10.0.1:3306' -host '10.60.0.124' -port '3306' -user 'admin' -password '123456' -database 'testdb' -table 'testtable' -verbose -alter "CHANGE score score FLOAT(5,2) NOT NULL DEFAULT '0.00' COMMENT '比分'"  -execute

其中

-throttle-control-replicas 列出了一个以逗号分隔的从库列表,gh-ost会根据该列表去检查从库的延时,当延时过大(默认1500s)时会暂停。

-host 默认填写的是从库ip,gh-ost会根据从库自动找到主库,这里使用从库ip是因为gh-ost默认是从从库读取数据写到主库的,这样可以减小主库的压力,如果这里填写了主库的ip,需要在后面附加上-allow-on-master选项,这样就可以从主库读数据并写到主库了。

-verbose 运行时输出详细信息

-alter 表结构修改语句的主体部分

-execute 执行操作,如果不加的话,会打印整个流程,但不会执行

以上是一个简单的用法和一些基本的参数说明。

github地址:https://github.com/github/gh-ost