gh-ost 在线DDL

gh-ost 是 GitHub 开源的一款 MySQL 在线更改表结构工具,核心作用是在不中断业务、几乎不锁表的情况下,安全地完成对大表的 DDL(数据定义语言)操作。它主要解决了 DBA 在进行 MySQL 大表变更时,因传统 ALTER TABLE 语句会长时间锁表而影响业务可用性的难题。

  • 项目:https://github.com/github/gh-ost
  • 介绍:不依赖于触发器,是因为它是通过模拟从库,在row binlog中获取增量变更,再异步应用到ghost表的

下载安装

  • 下载安装 gh-ost 1.1.8
cd /opt
wget -c http://iso.sqlfans.cn/mysql/gh-ost-binary-linux-amd64-20260310200531.tar.gz
tar xvf gh-ost-binary-linux-amd64-20260310200531.tar.gz
/opt/gh-ost --version
  • 参数优化
#.2021.08.04.对一张大表(41831008 行、数据 69.63 GB、索引 1.03 GB),对 create_time 日期类型的字段添加索引,共耗时 4h39m35s(ecs配置:4C-64G-1TB)
#.2021.10.30.进度显示的 Copy: 0/775715 行数极其不准确,实际 47971068,相差 60 倍

#.2022.02.25.主主复制会报错“FATAL There seems to be a master-master setup at 192.168.0.28:3306”,请添加如下参数:
--allow-master-master \

#.2022.02.25.执行中断报错“FATAL critical-load met: Threads_running=66, >=64”,请优化如下参数:
--max-load=Threads_running=100 \
--critical-load=Threads_running=1000 \

#.2026.04.24.之前--max-lag-millis=60触发了限速机制导致停滞,进度一直0%,优化为1500后解决
--max-lag-millis=1500 \

实操脚本

  • 下面提供一个经过多次优化的实操脚本:务必在主库上执行
/opt/gh-ost \
--max-load=Threads_running=100 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--max-lag-millis=1500 \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--ok-to-drop-table \
--allow-master-master \
--host="127.0.0.1" \
--port=3306 \
--user="dba_admin" \
--password="password_123456" \
--database="kidstools_detection" \
--table="detection_record" \
--verbose \
--alter="ADD COLUMN file_server_ip  varchar(128) NULL COMMENT '服务器ip';" \
--assume-rbr \
--allow-on-master \
--cut-over=default \
--default-retries=120 \
--throttle-additional-flag-file="/tmp/gh-ost.throttle" \
--serve-socket-file="/tmp/gh-ost.sock" \
--replica-server-id=1 \
--execute
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-04-26 09:00:00

results matching ""

    No results matching ""