gh-ost使用说明整理
特点:无触发器、可暂停、
通过分析binlog日志的形式监听表中的数据变更。(异步的)
gh-ost要求binlog是row复制形式,若不是可加参数配置
gh-ost操作模式:
1.连接到从库,在主库做迁移(默认)
通过检查从库状态,找到集群结构中的主库并连接。执行:
·行数据在主库上读写
·读取从库的二进制日志,将变更应用到主库
·在从库收集表格式,字段&索引,行数等信息
·在从库读取内部变更事件
·在主库切换表
从库必须启动二进制日志(log_bin,log_slave _updates)并且设置binlog_format=ROW
log_slave_updates参数用来控制M01是否把所有的操作写入到binary log,默认的情况下mysql是关闭的
2.连接到主库
需要添加--allow-on-master参数(ROW)
3.在从库迁移/测试
--migrate-on-replica表示gh-ost直接在从库进行迁移,即使在复制运行阶段也可以进行表的切换操作。
--test-on-replica 表示迁移操作只是为了测试,在切换之前复制会停止。
gh-ost执行DDL过程
① 检查有没有外键和触发器。
② 检查表的主键信息。
③ 检查是否主库或从库,是否开启log_slave_updates,以及binlog信息
④ 检查gho和del结尾的临时表是否存在
⑤ 创建ghc结尾的表,存数据迁移的信息,以及binlog信息等
---以上校验阶段
⑥ 初始化stream的连接,添加binlog的监听
---以下迁移阶段
⑥ 创建gho结尾的临时表,执行DDL在gho结尾的临时表上
⑦ 开启事务,按照主键id把源表数据写入到gho结尾的表上,再提交,以及binlog apply。
---以下cut-over阶段
⑧ lock源表,rename 表:rename 源表 to 源_del表,gho表 to 源表。
⑨ 清理ghc表。
单实例DDL语句举例
gh-ost -user="sys" -password="1234.Com" -host=192.168.19.130 -database="test" -table="t3" -alter="CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" -allow-on-master -panic-flag-file=/tmp/gh-ost.panic.t1.flag -execute -debug
gh-ost --user="root" --password="root" --host=192.168.163.131 --database="test" --table="t1" --alter="ADD COLUMN cc2 varchar(10),add column cc3 int not null default 0 comment 'test' " --allow-on-master --execute
经测试gh-ost在mysql8.0.11版本会出现锁等待超时的问题(由于mysql8版本新增静态锁。兼容性出现问题。)更换至mysql5.7时可以正常使用。
ghost-1经调整innodb_lock_wait_timeout及lock_wait_timeout参数,仍出现上图问题
反复验证查询资料后,发现在github中有相关故障介绍。
ghost-2.pngmysql8版本中新增存在静态锁导致gh-ost报出上面错误。Waiting for column statistics lock
在mysql5.7版本中测试发现可以正常使用对应gh-ost功能
网友评论