avatar

ghost 使用

Gh-ost

gh-ost是在解决持续的产品变更需要修改MySQL表结构问题过程中开发出来的。gh-ost以低影响、高可控、可审计、操作有好的方式在线的修改表的结构。

  • 非触发器的
  • 轻量级的
  • 可暂停的
  • 可动态控制的
  • 可审计的
  • 可测试的
  • 可信赖的

限制

  • 不能对有外键关系及触发器的表进行 Online DDL
  • 要求所连接的获取增量数据的 mysql binlog 为 row 格式(会强制转换)
  • 若有同名但是字母大小写不同的表如:MYtable 和 myTable,则无法对这两张表进行修改
  • 不支持 MySQL5.7 Json 类型列的修改
  • 不支持 MySQL5.7 generated column 的修改
  • 用户需要 SUPER|REPLICATION CLIENT, REPLICATION SLAVE and ALL 权限

流程

操作模式

gh-ost

创建测试表

1
2
3
4
5
6
7
8
9
10
CREATE TABLE t1(
id int primary key not null auto_increment,
name char(20),
col1 char(20),
col2 char(20),
col3 char(20)
);
insert into t1 (name,col1,col2,col3) values("a","b","c","d");
重复以下
insert into t1 (name,col1,col2,col3) select name,col1,col2,col3 from t1;

a 连接到从库,在主库做迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 增加字段
./gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="172.17.0.2:3361" \
--max-lag-millis=1500 \
--user="root" \
--password="root" \
--host=127.0.0.1 \
--port=3361 \
--database="test" \
--table="t1" \
--verbose \
--alter="add age int default 100" \
--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\
--initially-drop-old-table\
--execute



PS: --host 连接的是从库,会自动找到主库
--throttle-control-replicas 检查主从复制延迟,配合 --max-lag-millis 当主从复制延迟时间超过该值后(默认1500s),gh-ost将采取节流(throttle)措施
--switch-to-rbr 这个会检测从库的日志格式,不为ROW时切换为ROW

这种模式下 从库要开启log_bin, log_slave_updates ,binlog_format=ROW
主库日志格式 可以不为ROW (但建议为ROW)

b 连接到主库

如果你没有从库,或者不想使用从库,可以直接在主库上操作

1
2
3
4
在上面 a 的测试 ,改为连接主库 增加以下选项
--allow-on-master

PS: 主库日志必须为 ROW

c 迁移,测试在从库执行

在从库上执行迁移。 gh-ost 将会短暂的连接主库,之后在从库执行所有操作不会对主库进行任何修改

1
2
3
连接从库 增加以下选项
--migrate-on-replica 表示gh-ost将直接在从库上迁移表。即使从库处于运行状态它也会执行切换操作。
--test-on-replica 表示是测试目的的迁移在切换之前,复制会停止。表会交换和交换恢复:即原始表还是原始表状态。复制停止后两个表会保留下来 。你可以检查和比较两个表的数据。

补充

查看状态

1
echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock

暂停恢复

1
2
3
4
暂停
echo throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
恢复
echo no-throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
文章作者: 喵九命
文章链接: http://blog.ik3s.top/2020/04/04/ghost-%E4%BD%BF%E7%94%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 远方除了遥远一无所有
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论