gh

gh-ost实战运用

一、安装步骤

1、环境

1go版本:1.10.3 2gh-ost版本:1.0.46

2、安装go语言

1# 安装go依赖包 2yum install bison ed gawk gcc libc6-dev make -y 3 4# 配置go环境变量 5vim ~/.bashrc 6export GOROOT=/usr/local/go 7export PATH=$PATH:$GOROOT/bin 8export GOPATH=/usr/local/go/src/github.com/github/gh-ost 9# 使环境变量生效 10source ~/.bashrc 11 12# 解压go安装包 13安装包在10.135.2.217:data/online/software/go1.10.3.linux-amd64.tar.gz 14 15tar -zxvf go1.10.3.linux-amd64.tar.gz -C /usr/local/

3、安装gh-ost

1安装包在:10.135.2.217:data/online/software/gh-ost-binary-linux-20180527215024.tar.gz 2tar -zxvf gh-ost-binary-linux-20180527215024.tar.gz -C /usr/local 3ln -s /usr/local/gh-ost /usr/bin/gh-ost

二、主库模式

1、常用命令

1gh-ost \ 2 --max-load=Threads_running=16 \ 3 --critical-load=Threads_running=32 \ 4 --chunk-size=1000 \ 5 --initially-drop-old-table \ 6 --initially-drop-ghost-table \ 7 --initially-drop-socket-file \ 8 --ok-to-drop-table \ 9 --host="10.249.5.39" \ 10 --port=3306 \ 11 --user="dbadmin" \ 12 --password="12345" \ 13 --assume-rbr \ 14 --allow-on-master \ 15 --assume-master-host=10.249.5.39:3306 \ 16 --database="gh_ost" \ 17 --table="gh_01" \ 18 --alter="add column c4 varchar(50) not null default ''" \ 19 --panic-flag-file=/tmp/ghost.panic.flag \ 20 --serve-socket-file=/tmp/ghost.sock \ 21 --verbose \ 22 --execute

2、常用参数解释

1-allow-on-master 2 默认是在从库上应用binlog,如果直接在主库上执行,必须设置该参数 3-max-load string 4 string是状态表达式,当设置多个状态值,用逗号分隔,如'Threads_running=100,Threads_connected=500',当超过该值,迁移暂停等待 5-critical-load string 6 与max-load不同的是,当超过该值,迁移直接停止并退出 7-chunk-size int 8 每次从原表迭代迁移数据的行数(允许值:100-100000) (默认1000) 9-initially-drop-ghost-table 10 在本次操作前删除可能存在的ghost表(可能之前留下的),默认如果存在就中断 11-initially-drop-old-table 12 在本次操作前删除old表(可能之前没有删除),默认如果存在中断 13-initially-drop-socket-file 14 删除已存在的socket文件 15-ok-to-drop-table 16 DDL完成后自动删除old表 17-panic-flag-file string 18 当指定该参数后,如果创建该文件,gh-ost立刻中断退出,不会清理产生的临时表和文件 19-exact-rowcount 20 精确的统计表数据行数而不是预估,即使不准确只是影响进度的计算,实际copy行数是由最大值和最小值确定,与其无关。 21-serve-socket-file string 22 socket文件 23-assume-rbr 24 显示告诉gh-ost日志格式是row格式,如果没有该参数,gh-ost每次都会设置row格式并重启复制,需要用户有super权限 25-assume-master-host 26 显示告诉gh-ost master地址,如果不提供,gh-ost会根据从库查到master 27-host、-port 28 gh-ost默认是作为slave的连接信息,如果使用slave应用日志,这里填写slave的主机信息;如果直接在master上执行,这里就填写master信息,并且必须存在allow-on-master参数,否则就报错退出。 29

3、输出日志分析

GH-OST会输出一些关键详细信息,让你了解整个迁移过程。当然,你可以控制输出级别。

1–verbose:常用,有用的输出,而不是一切。 2 3–debug:输出所有一切。

开始输出如下:

12018-08-07 14:17:11 INFO starting gh-ost 1.0.46 22018-08-07 14:17:11 INFO Migrating `darren`.`t4` 32018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306 42018-08-07 14:17:11 INFO User has ALL privileges 52018-08-07 14:17:11 INFO binary logs validated on 10.249.5.39:3306 62018-08-07 14:17:11 INFO Restarting replication on 10.249.5.39:3306 to make sure binlog settings apply to replication thread 72018-08-07 14:17:11 INFO Inspector initiated on shvm-5-39.58os.org:3306, version 5.7.21-log 82018-08-07 14:17:11 INFO Table found. Engine=InnoDB 92018-08-07 14:17:11 INFO Estimated number of rows via EXPLAIN: 58707 102018-08-07 14:17:11 INFO Recursively searching for replication master 112018-08-07 14:17:11 INFO Master found to be shvm-5-39.58os.org:3306 122018-08-07 14:17:11 INFO log_slave_updates validated on 10.249.5.39:3306 132018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306 142018/08/07 14:17:11 binlogsyncer.go:79: [info] create BinlogSyncer with config {99999 mysql 10.249.5.39 3306 dbadmin false false <nil>} 152018-08-07 14:17:11 INFO Connecting binlog streamer at shvm-5-39.000040:337570954 162018/08/07 14:17:11 binlogsyncer.go:246: [info] begin to sync binlog from position (shvm-5-39.000040, 337570954) 172018/08/07 14:17:11 binlogsyncer.go:139: [info] register slave for master server 10.249.5.39:3306 182018/08/07 14:17:11 binlogsyncer.go:573: [info] rotate to (shvm-5-39.000040, 337570954) 192018-08-07 14:17:11 INFO rotate to next log name: shvm-5-39.000040 202018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306 212018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306 222018-08-07 14:17:11 INFO will use time_zone='SYSTEM' on applier 232018-08-07 14:17:11 INFO Examining table structure on applier 242018-08-07 14:17:11 INFO Applier initiated on shvm-5-39.58os.org:3306, version 5.7.21-log 252018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_gho` 262018-08-07 14:17:11 INFO Table dropped 272018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_del` 282018-08-07 14:17:11 INFO Table dropped 292018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_ghc` 302018-08-07 14:17:11 INFO Table dropped 312018-08-07 14:17:11 INFO Creating changelog table `darren`.`_t4_ghc` 322018-08-07 14:17:11 INFO Changelog table created 332018-08-07 14:17:11 INFO Creating ghost table `darren`.`_t4_gho` 342018-08-07 14:17:11 INFO Ghost table created 352018-08-07 14:17:11 INFO Altering ghost table `darren`.`_t4_gho` 362018-08-07 14:17:11 INFO Ghost table altered 372018-08-07 14:17:11 INFO Intercepted changelog state GhostTableMigrated 382018-08-07 14:17:11 INFO Waiting for ghost table to be migrated. Current lag is 0s 392018-08-07 14:17:11 INFO Handled changelog state GhostTableMigrated 402018-08-07 14:17:11 INFO Chosen shared unique key is PRIMARY 412018-08-07 14:17:11 INFO Shared columns are id,name,c1,c2,c4,c5,c6 422018-08-07 14:17:11 INFO Listening on unix socket file: /tmp/ghost.sock 432018-08-07 14:17:11 INFO Migration min values: [1] 442018-08-07 14:17:11 INFO Migration max values: [58597] 452018-08-07 14:17:11 INFO Waiting for first throttle metrics to be collected 462018-08-07 14:17:11 INFO First throttle metrics collected 47# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho` 48# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org 49# Migration started at Tue Aug 07 14:17:11 +0800 2018 50# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: Threads_running=25; critical-load: Threads_running=64; nice-ratio: 0.000000 51# throttle-additional-flag-file: /tmp/gh-ost.throttle 52# panic-flag-file: /tmp/ghost.panic.flag 53# Serving on unix socket: /tmp/ghost.sock

这些信息是GH-OST相对自我解释,他们大多表示一切顺利。你将主要关注迁移并了解其是否顺利进行。一旦迁移实际开始,你将看到如下输出。

1Copy: 0/58707 0.0%; Applied: 0; Backlog: 0/1000; Time: 0s(total), 0s(copy); streamer: shvm-5-39.000040:337574146; State: migrating; ETA: N/A 2Copy: 0/58707 0.0%; Applied: 0; Backlog: 0/1000; Time: 1s(total), 1s(copy); streamer: shvm-5-39.000040:337581355; State: migrating; ETA: N/A 3Copy: 27000/58707 46.0%; Applied: 0; Backlog: 0/1000; Time: 2s(total), 2s(copy); streamer: shvm-5-39.000040:338201054; State: migrating; ETA: 2s 4Copy: 58000/58707 98.8%; Applied: 0; Backlog: 0/1000; Time: 3s(total), 3s(copy); streamer: shvm-5-39.000040:338912890; State: migrating; ETA: 0s 52018-08-07 14:17:14 INFO Row copy complete

进度提示

1Copy: 27000/58707 46.0%;58707指需要迁移总行数,27000指已经迁移的行数,46%指迁移完成的百分比。 2Applied: 0,指在二进制日志中处理的event数量。在上面的例子中,迁移表没有流量,因此没有被处理日志event。 3Backlog: 0/1000,表示我们在读取二进制日志方面表现良好,在二进制日志队列中没有任何积压(Backlog)事件。 4Backlog: 7/1000,当复制行时,在二进制日志中积压了一些事件,并且需要应用。 5Backlog: 1000/1000,表示我们的1000个事件的缓冲区已满(程序写死的1000个事件缓冲区,低版本是100个),此时就注意binlog写入量非常大,gh-ost处理不过来event了,可能需要暂停binlog读取,需要优先应用缓冲区的事件。 6streamer: shvm-5-39.000040:338912890;表示当前已经应用到binlog文件位置

状态提示

1每隔一定时间会打印友好提示: 2 3# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho` 4# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org 5# Migration started at Tue Aug 07 14:17:11 +0800 2018 6# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: Threads_running=25; critical-load: Threads_running=64; nice-ratio: 0.000000 7# throttle-additional-flag-file: /tmp/gh-ost.throttle 8# panic-flag-file: /tmp/ghost.panic.flag 9# Serving on unix socket: /tmp/ghost.sock

三、从库模式

1、常用命令

1gh-ost \ 2 --max-load=Threads_running=16 \ 3 --critical-load=Threads_running=32 \ 4 --chunk-size=1000 \ 5 --initially-drop-old-table \ 6 --initially-drop-ghost-table \ 7 --initially-drop-socket-file \ 8 --ok-to-drop-table \ 9 --host="10.249.5.39" \ 10 --port=3307 \ 11 --user="dbadmin" \ 12 --password="12345" \ 13 --assume-rbr \ 14 --allow-on-master \ 15 --assume-master-host=10.249.5.39:3306 \ 16 --database="gh_ost" \ 17 --table="gh_01" \ 18 --alter="add column c4 varchar(50) not null default ''" \ 19 --panic-flag-file=/tmp/ghost.panic.flag \ 20 --serve-socket-file=/tmp/ghost.sock \ 21 --verbose \ 22 --execute

四、测试模式

1gh-ost \ 2 --test-on-replica \ 3 --max-load=Threads_running=16 \ 4 --critical-load=Threads_running=32 \ 5 --chunk-size=1000 \ 6 --initially-drop-old-table \ 7 --initially-drop-ghost-table \ 8 --initially-drop-socket-file \ 9 --host="10.249.5.39" \ 10 --port=3307 \ 11 --user="dbadmin" \ 12 --password="12345" \ 13 --assume-rbr \ 14 --database="gh_ost" \ 15 --table="gh_01" \ 16 --alter="add column c4 varchar(50) not null default ''" \ 17 --panic-flag-file=/tmp/ghost.panic.flag \ 18 --serve-socket-file=/tmp/ghost.sock \ 19 --verbose \ 20 --execute

参数说明

1--test-on-replica 2 在从库上执行迁移,但不进行最后的cut-over,并最后会停止复制线程,供测试人员进行数据对比 3--migrate-on-replica 4 直接在从库上迁移并cut-over,复制线程不会停止

五、暂停、恢复、终止、延迟切换

gh-ost的--serve-socket-file文件用来监听请求,比如可以动态调整性能方面参数,也可以进行暂停、恢复gh-ost线程。

1#暂停 2echo throttle | socat - /tmp/ghost.sock 3 4#恢复 5echo no-throttle | socat - /tmp/ghost.sock 6 7#终止 8对应panic-flag-file参数文件,当tmp目录存在该文件立即停止 9touch /tmp/ghost.panic.flag 10 11#延迟切换(cut-over阶段) 12--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag 13当设置该参数时cut-over一直延迟切换,直到你删除该文件才进行切换 14 15#动态调整性能参数 16echo chunk-size=100 | socat - /tmp/ghost.sock
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

gh - HelloWorld