https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md
- 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参数为了支持双主架构。
- connect to master
如果要replica和apply都在master上的话,需要添加参数 --allow-on-master,同时host需要写master的IP
- migrate/test on replica
如果要migrate在replica上的话,需要参数 --migrate-on-replica,同时host需要写master的IP
参考: [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 | |
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
暂停/恢复
echo throttle | nc -U /tmp/gh-ost.a_test.t1.sock
echo no-throttle | nc -U /tmp/gh-ost.a_test.t1.sock
https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md