gh-ost介绍
在做功能迭代的时候,我们总会遇到生产的数据库表结构不适合的时候。往往我们要添加字段,添加索引,修改字段等操作。但是如果生产的数据量是很大的,我们对表结构进行修改的时候会引起死锁,甚至会引起宕机。
这个时候,有一种解决方案,gh-ost,可以在不发生死锁的前提下,把数据表结构修改成功。
gh-ost原理
1.gh-ost会根据我们要修改表结构内容,把原表先新建一张 “源表名_gho”的幽灵表。
2.把原表中的数据分批次插入的ghost表中。默认是1000条一次,可以由chunk-size设置。
insert into ghost select * from tab where id >= batchminid and id< batchmin_id+1000;
3.对于增量、修改、删除的数据,会由另外一个线程读取binlog,捕捉dml。并在ghost表中执行。
4.最后 cut-Over,锁定原表,待binlog完全追上,进行rename操作。
弊端
-
binlog应用优先级会高于原表的批量复制。如果原表的增删改非常频繁,原表压力一直很大,那么就会一直跟踪binlog,复制进度会进展很慢,甚至无法完成。
-
操作完成后,原表会被重命名为*_del表,需要手动删除。
Centos7安装
安装环境:
yum install bison ed gawk gcc libc6-dev make -y
添加环境变量:
vi /etc/profile
#GO
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/usr/local/go/src/github.com/github/gh-ost
重新生效:
source /etc/profile
go1.9.linux-amd64.tar.gz下载地址
tar -zxvf /root/go1.9.linux-amd64.tar.gz -C /usr/local/
ghost 下载地址:
gh-ost-binary-linux-20181016015113.tar.gz(2.8 MB)
tar -zxvf /root/gh-ost-binary-linux-20181016015113.tar.gz -C /usr/local
ln -s /usr/local/gh-ost /usr/bin/gh-ost
验证安装成功:
gh-ost -version
使用
添加索引:
gh-ost
-aliyun-rds=true
-debug
-initially-drop-ghost-table
-initially-drop-old-table
-allow-on-master
-alter="ADD INDEX `index_systemId_user_status` (`AAAA`,`BBBB`);"
-assume-master-host=rm-bp1q9yj79ij4u27cg.mysql.rds.aliyuncs.com
-database="moneysystem"
-host="rm-VVVVVVVV.mysql.rds.aliyuncs.com"
-port=3306
-password="DDDDDFFFDDD"
-table="t_EEEEEEE_tail"
-tungsten
-user="Root"
-assume-rbr
-execute
添加字段:
gh-ost
-aliyun-rds=true
-debug
-initially-drop-ghost-table
-initially-drop-old-table
-allow-on-master
-alter="ADD `act_id` int(11) DEFAULT NULL COMMENT 'sdfssdid'"
-assume-master-host=rm-werewrwerewwer.mysql.rds.aliyuncs.com
-database="moneyystem"
-host="rm-VVVVV.mysql.rds.aliyuncs.com"
-port=3306
-password="AAA"
-table="t_ct"
-tungsten
-user="sdfs"
-assume-rbr
-execute