Skip to content

Latest commit

 

History

History
252 lines (223 loc) · 10.8 KB

3. gh-ost 使用.md

File metadata and controls

252 lines (223 loc) · 10.8 KB

gh-ost 三种工作模式

https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md image.png

  1. connect to replica
gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="myreplica.1.com,myreplica.2.com" \
--max-lag-millis=1500 \
--user="gh-ost" \
--password="123456" \
--host=replica.with.rbr.com \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--switch-to-rbr \
--allow-master-master \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--default-retries=120 \
--panic-flag-file=/tmp/ghost.panic.flag \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \
[--execute]

host只需要写replica的IP,gh-ost能自动找到master的IP,--allow-master-master参数为了支持双主架构。

  1. connect to master

如果要replica和apply都在master上的话,需要添加参数 --allow-on-master,同时host需要写master的IP

  1. migrate/test on replica

如果要migrate在replica上的话,需要参数 --migrate-on-replica,同时host需要写master的IP

gh-ost参数

参考: [1] https://github.com/github/gh-ost/blob/master/doc/command-line-flags.md [2] https://www.cnblogs.com/zhoujinyi/p/9187421.html [3] https://github.com/wing324/helloworld_zh/blob/master/MySQL/gh-ost/GitHub开源MySQL%20Online%20DDL工具gh-ost参数解析.md

参数名 Format/Type Default 说明 备注
--user

| | |

基本信息 | | --password | | | | | | --host | | | | | | --port | | | | | | --database | | | | | | --table | | | | | | --exact-rowcount | bool | | 准确统计表行数(使用select count(*)的方式),得到更准确的预估时间。 | | | --concurrent-rowcount | bool | | 默认为true,影响exact-rowcount。When --concurrent-rowcount is also specified, this runs in parallel to row copy. | | | --approve-renamed-columns | bool | | 如果你修改一个列的名字(如change column),gh-ost将会识别到并且需要提供重命名列名的原因,默认情况下gh-ost是不继续执行的,除非提供-approve-renamed-columns ALTER。 | | | --skip-renamed-columns | bool | | This will cause gh-ost to disassociate the column values; data will not be copied between those columns. | | | --allow-on-master | bool | | 允许连接主库replica,默认情况下gh-ost会连接从库执行replica | | | --chunk-size | int | | 在row copy每次迭代中处理的行数量(允许范围:100-100000),默认值为1000 | | | --default-retries | int | | 各种操作在panic前的重试次数 | | | --dml-batch-size | int [1 - 100] | | binlog写回ghost表时的batch数量(batch是否是一个事物?) | | | --cut-over-lock-timeout-seconds | int | | cut over时的锁超时时间(什么锁?超时是否重试?) | | | ---nice-ratio | float | | 每次chunk时间段的休眠时间,范围[0.0...100.0]。e.g:0:每个chunk时间段不休眠,即一个chunk接着一个chunk执行;1:每row-copy 1毫秒,则另外休眠1毫秒;0.7:每row-copy 10毫秒,则另外休眠7毫秒。 | | | --replica-pass-load | int | | 选择延迟小于该值的replica | | | --heartbeat-interval-millis | int | | 默认100,heartbeat时间间隔(和谁的heartbeat?) | | | --cut-over | string [atomic, two-step] | | choose cut-over type (default|atomic, two-step) (default "atomic") | | | --postpone-cut-over-flag-file | string | | 当这个文件存在的时候,gh-ost的cut-over阶段将会被推迟,直到该文件被删除。 | flag file | | --panic-flag-``file | string | | 当这个文件被创建,gh-ost将会立即退出。 | | | --max-lag-millis | int | | 主从复制最大延迟时间,当主从复制延迟时间超过该值后,gh-ost将采取节流(throttle)措施,默认值:150, throttle-metrics-interval=0s。 That is, to measure this replica's lag, gh-ost doesn't need to issue show slave status nor have any external heartbeat mechanism. |

限流

| | --throttle-control-replicas | string, | | 列出所有需要被检查主从复制延迟的从库 https://github.com/github/gh-ost/blob/master/doc/subsecond-lag.md | | | --max-load | string [k=v, ...] | Threads_running=100, Threads_connected=500 | 当MySQL中status超过对应的values,gh-ost将采取节流(throttle)措施https://github.com/github/gh-ost/blob/master/doc/throttle.md#status-thresholds 取值:https://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html | | | --critical-load | string | 同--max-load | 当MySQL中status超过对应的values,gh-ost将会退出 | | | --critical-load-interval-millis | int | | 当值为0时,当达到-critical-load,gh-ost立即退出。当值不为0时,达到-critical-load,gh-ost会在-critical-load-interval-millis秒数后,再次进行检查,再次检查依旧达到-critical-load,gh-ost将会退出。 | | | --throttle-flag-file | string | | 当该文件被创建后,gh-ost操作立即停止。该参数适合控制单个gh-ost操作。-throttle-additional-flag-file string适合控制多个gh-ost操作。 | | | --throttle-additional-flag-file | string | /tmp/gh-ost.throttle | | | | --serve-socket-file | string | | gh-ost的socket file,可以通过该socket file动态修改一些参数 可以动态修改的参数:https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md | 外部交互 | | --serve-tcp-port | string | | gh-ost监听的tcp端口,默认关闭,作用同socket file | | | --ok-to-drop-table | bool | false | gh-ost操作结束后,删除旧表,默认状态是不删除旧表,会存在_tablename_del表。 DROPping tables can be a long locking operation, which is why I'm not doing it by default. I'm an online tool, yes? |

| | --initially-drop-ghost-table | bool | false | gh-ost操作之前,检查并删除已经存在的ghost表。默认不启用该参数,gh-ost直接退出操作。 | | | --initially-drop-old-table | bool | false | gh-ost操作之前,检查并删除已经存在的旧表。默认不启用该参数,gh-ost直接退出操作。 | | | --initially-drop-socket-file | bool | false | gh-ost强制删除已经存在的socket文件。该参数不建议使用,可能会删除一个正在运行的gh-ost程序,导致DDL失败。 | | | --allow-master-master | bool | | 双主模式支持,主要用于gh-ost寻找master | | | --assume-master-host | string [some.host.com[:port]] | | 指定master,在第一种工作模式下,因为传入的是slave的ip:port,需要找到master的信息,可以通过该参数指定master信息,也可以让gh-ost自动寻找master | | | --master-user | | | MySQL user on master, if different from that on replica. Requires --assume-master-host | | | --master-password | | | MySQL password on master, if different from that on replica. Requires --assume-master-host | | | --switch-to-rbr | bool | | 自动设置从库的binlog格式为ROW,需要stop slave/start slave | | | --assume-rbr | bool | | gh-ost不检查binlog是否为ROW | |

gh-ost限流

https://github.com/github/gh-ost/blob/master/doc/throttle.md#status-thresholds

使用示例

表结构

CREATE TABLE `test_order` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `order_id` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '订单id',
  `driver_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '司机id',
  `passenger_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '乘客id',
  `src` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT 'src',
  `dest` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT 'dest',
  `extra` text CHARACTER SET utf8 NOT NULL COMMENT 'extra',
  `time` timestamp NOT NULL DEFAULT '1971-01-01 00:00:00' COMMENT '时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_oid` (`order_id`),
  KEY `idx_did` (`driver_id`),
  KEY `idx_pid` (`passenger_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试订单表'

gh-ost命令

gh-ost \
--user="admin" \
--password="admin" \
--host=10.179.195.73 \
--port=5006 \
--database="a_test" \
--table="test_order_0" \
--alter="add column update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'" \
--critical-load="Threads_running=10,Threads_connected=50" \
--max-load="Threads_running=8,Threads_connected=40" \
--critical-load-interval-millis=1000 \
--exact-rowcount \
--concurrent-rowcount \
--approve-renamed-columns \
--allow-on-master \
--chunk-size=1000 \
--default-retries=3 \
--dml-batch-size=10 \
--cut-over-lock-timeout-seconds=3 \
--nice-ratio=1 \
--heartbeat-interval-millis=100 \
--max-lag-millis=1500 \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.a_test.t1.flag \
--throttle-metrics-interval=1000 \
--replica-pass-load=1000 \
--throttle-flag-file=/tmp/ghost.throttle.t1.flag \
--serve-socket-file=/tmp/gh-ost.t1.sock \
--ok-to-drop-table \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--cut-over=atomic \
--verbose \
--execute

查看状态 image.png

暂停/恢复

echo throttle | nc -U /tmp/gh-ost.a_test.t1.sock
echo no-throttle | nc -U /tmp/gh-ost.a_test.t1.sock

Interactive commands(可以动态设置参数)

https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md