gh-ost实战运用

一、安装步骤

1、环境

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

2、安装go语言

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

3、安装gh-ost

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

二、主库模式

1、常用命令

gh-ost \
--max-load=Threads_running=16 \
--critical-load=Threads_running=32 \
--chunk-size=1000 \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="10.249.5.39" \
--port=3306 \
--user="dbadmin" \
--password="12345" \
--assume-rbr \
--allow-on-master \
--assume-master-host=10.249.5.39:3306 \
--database="gh_ost" \
--table="gh_01" \
--alter="add column c4 varchar(50) not null default ''" \
--panic-flag-file=/tmp/ghost.panic.flag \
--serve-socket-file=/tmp/ghost.sock \
--verbose \
--execute

2、常用参数解释

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

3、输出日志分析

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

–verbose:常用,有用的输出,而不是一切。

–debug:输出所有一切。

开始输出如下:

2018-08-07 14:17:11 INFO starting gh-ost 1.0.46
2018-08-07 14:17:11 INFO Migrating `darren`.`t4`
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO User has ALL privileges
2018-08-07 14:17:11 INFO binary logs validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO Restarting replication on 10.249.5.39:3306 to make sure binlog settings apply to replication thread
2018-08-07 14:17:11 INFO Inspector initiated on shvm-5-39.58os.org:3306, version 5.7.21-log
2018-08-07 14:17:11 INFO Table found. Engine=InnoDB
2018-08-07 14:17:11 INFO Estimated number of rows via EXPLAIN: 58707
2018-08-07 14:17:11 INFO Recursively searching for replication master
2018-08-07 14:17:11 INFO Master found to be shvm-5-39.58os.org:3306
2018-08-07 14:17:11 INFO log_slave_updates validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018/08/07 14:17:11 binlogsyncer.go:79: [info] create BinlogSyncer with config {99999 mysql 10.249.5.39 3306 dbadmin false false <nil>}
2018-08-07 14:17:11 INFO Connecting binlog streamer at shvm-5-39.000040:337570954
2018/08/07 14:17:11 binlogsyncer.go:246: [info] begin to sync binlog from position (shvm-5-39.000040, 337570954)
2018/08/07 14:17:11 binlogsyncer.go:139: [info] register slave for master server 10.249.5.39:3306
2018/08/07 14:17:11 binlogsyncer.go:573: [info] rotate to (shvm-5-39.000040, 337570954)
2018-08-07 14:17:11 INFO rotate to next log name: shvm-5-39.000040
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO will use time_zone='SYSTEM' on applier
2018-08-07 14:17:11 INFO Examining table structure on applier
2018-08-07 14:17:11 INFO Applier initiated on shvm-5-39.58os.org:3306, version 5.7.21-log
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_del`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_ghc`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Creating changelog table `darren`.`_t4_ghc`
2018-08-07 14:17:11 INFO Changelog table created
2018-08-07 14:17:11 INFO Creating ghost table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Ghost table created
2018-08-07 14:17:11 INFO Altering ghost table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Ghost table altered
2018-08-07 14:17:11 INFO Intercepted changelog state GhostTableMigrated
2018-08-07 14:17:11 INFO Waiting for ghost table to be migrated. Current lag is 0s
2018-08-07 14:17:11 INFO Handled changelog state GhostTableMigrated
2018-08-07 14:17:11 INFO Chosen shared unique key is PRIMARY
2018-08-07 14:17:11 INFO Shared columns are id,name,c1,c2,c4,c5,c6
2018-08-07 14:17:11 INFO Listening on unix socket file: /tmp/ghost.sock
2018-08-07 14:17:11 INFO Migration min values: [1]
2018-08-07 14:17:11 INFO Migration max values: [58597]
2018-08-07 14:17:11 INFO Waiting for first throttle metrics to be collected
2018-08-07 14:17:11 INFO First throttle metrics collected
# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho`
# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org
# Migration started at Tue Aug 07 14:17:11 +0800 2018
# 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
# throttle-additional-flag-file: /tmp/gh-ost.throttle
# panic-flag-file: /tmp/ghost.panic.flag
# Serving on unix socket: /tmp/ghost.sock

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

Copy: 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
Copy: 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
Copy: 27000/58707 46.0%; Applied: 0; Backlog: 0/1000; Time: 2s(total), 2s(copy); streamer: shvm-5-39.000040:338201054; State: migrating; ETA: 2s
Copy: 58000/58707 98.8%; Applied: 0; Backlog: 0/1000; Time: 3s(total), 3s(copy); streamer: shvm-5-39.000040:338912890; State: migrating; ETA: 0s
2018-08-07 14:17:14 INFO Row copy complete

进度提示

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

状态提示

每隔一定时间会打印友好提示:

# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho`
# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org
# Migration started at Tue Aug 07 14:17:11 +0800 2018
# 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
# throttle-additional-flag-file: /tmp/gh-ost.throttle
# panic-flag-file: /tmp/ghost.panic.flag
# Serving on unix socket: /tmp/ghost.sock

三、从库模式

1、常用命令

gh-ost \
--max-load=Threads_running=16 \
--critical-load=Threads_running=32 \
--chunk-size=1000 \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="10.249.5.39" \
--port=3307 \
--user="dbadmin" \
--password="12345" \
--assume-rbr \
--allow-on-master \
--assume-master-host=10.249.5.39:3306 \
--database="gh_ost" \
--table="gh_01" \
--alter="add column c4 varchar(50) not null default ''" \
--panic-flag-file=/tmp/ghost.panic.flag \
--serve-socket-file=/tmp/ghost.sock \
--verbose \
--execute

四、测试模式

gh-ost \
--test-on-replica \
--max-load=Threads_running=16 \
--critical-load=Threads_running=32 \
--chunk-size=1000 \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--host="10.249.5.39" \
--port=3307 \
--user="dbadmin" \
--password="12345" \
--assume-rbr \
--database="gh_ost" \
--table="gh_01" \
--alter="add column c4 varchar(50) not null default ''" \
--panic-flag-file=/tmp/ghost.panic.flag \
--serve-socket-file=/tmp/ghost.sock \
--verbose \
--execute

参数说明

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

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

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

#暂停
echo throttle | socat - /tmp/ghost.sock #恢复
echo no-throttle | socat - /tmp/ghost.sock #终止
对应panic-flag-file参数文件,当tmp目录存在该文件立即停止
touch /tmp/ghost.panic.flag #延迟切换(cut-over阶段)
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag
当设置该参数时cut-over一直延迟切换,直到你删除该文件才进行切换 #动态调整性能参数
echo chunk-size=100 | socat - /tmp/ghost.sock

gh-ost使用手册的更多相关文章

  1. Ghost-无损DDL

    目录 一.什么是DDL? 二.表级锁和元数据锁 2.1.什么是表锁? 2.2.什么是MDL? 三.什么是无损DDL? 四.DDL重建表 Mysql5.5之前重建表 Mysql5.6之后重建表 五.gh ...

  2. VIM7.3中文手册

    INDEX *index.txt*     For Vim version 7.3.  最近更新: 2010年7月 VIM 参考手册    by Bram Moolenaar 译者: Willis h ...

  3. WHM使用手册by lin

    WebHost Manager 11使用手册(WHM使用手册) 本手册翻译自cpanel官方文档. 本翻译中文版本版权归美国主机侦探所有,未经允许,禁止复制. Overview(概述) 本用户手册主要 ...

  4. FREERTOS 手册阅读笔记

    郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized ...

  5. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  6. 转职成为TypeScript程序员的参考手册

    写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...

  7. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  8. JS魔法堂:不完全国际化&本地化手册 之 实战篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  9. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  10. linux命令在线手册

    下面几个网址有一些 Linux命令的在线手册,而且还是中文的,还可以搜索.非常方便 Linux命令手册 Linux命令大全 Linux中文man在线手册 每日一linux命令

随机推荐

  1. Java连接Sql Server 2008的简单数据库应用

    1.从微软官网下载JDBC驱动包 sqljdbc_4.0.2206.100_chs.exe,双击解压文件到指定目录,我的指定目录是: C:\Program Files\Microsoft JDBC D ...

  2. response.sendRedirect 的功能是地址重定向(页面跳转)

    response.sendRedirect 的功能是地址重定向(页面跳转) 1.response.sendredirect(url); 新的页面并不能处理旧页面的pagecontext(request ...

  3. iOS-tableview【终极方案】精准获取webView内容高度,自适应高度

    关于WebView内容高度的获取,相信很多人都踩过坑,无法获取到准确高度,导致页面布局出现差错,搜到的资料很多但都无法解决问题,以下是个人经验总结: 项目需求实现H5文章&原生评论效果,文章是 ...

  4. Python简单分布式爬虫

    分布式爬虫采用主从模式.主从模式是指由一台主机作为控制节点,负责管理所有运行网络爬虫的主机(url管理器,数据存储器,控制调度器),爬虫只需要从控制节点哪里接收任务,并把新生成任务提交给控制节点.此次 ...

  5. 二、Android应用的界面编程(七)ViewAnimator及其子类[ ViewSwitcher、ImageSwitcher、TextSwitcher、ViewFlipper ]

    ViewAnimator是一个基类,它继承了FrameLayout.因此它表现出FrameLayout的特征,可以将多个View组“叠”在一起. ViewAnimator可以在View切换时表现出动画 ...

  6. socket listen/accept

    listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...

  7. hoj 2543 (费用流 拆边)

    http://acm.hit.edu.cn/hoj/problem/view?id=2543 1.将原图中的每条边(u, v)拆成两条:(u, v, Ci, 0), (u, v, ∞, Ei) 2.购 ...

  8. POJ1182食物链(并查集经典好题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/E 题目思路:主要有两种思路:1.带权并查集2.挑战程 ...

  9. Uvalive6885(最短路)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129723 题目大意:n个点,m条边,求出从0到n的最短距离,输出途 ...

  10. 【转】C#操作word定位光标

    十一.上下左右移动光标位 private void moveLeft() { object moveUnit = Microsoft.Office.Interop.Word.WdUnits.wdWor ...