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 权限
流程
操作模式
创建测试表
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
|