千家信息网

MYSQL 修改表结构 gh-ost

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"MYSQL 修改表结构 gh-ost ",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MYSQL 修改表结构 gh-ost "吧!PT工具
千家信息网最后更新 2026年10月31日MYSQL 修改表结构 gh-ost

本篇内容主要讲解"MYSQL 修改表结构 gh-ost ",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MYSQL 修改表结构 gh-ost "吧!

PT工具在MYSQL中的使用其实已经好像有"半个世纪了",其出名的原因主要是因为pt-osc,如果你不知道,那你真的用过MYSQL,其实还有另外两家 FB-OST , GH-OST.

实际上PT-OSC 虽然使用了这么多年,他也存在一些问题

PT-OSC

1 有些操作中,会引起高负载的写操作

2 在原表和新表切换的过程中更名,可能有失败的可能(虽然这样的情况不多,但可能存在)

3 要求多,主键(具有唯一性的),表有外键的时候需要添加参数,并且很可能还是有问题,可能会导致主从延迟,表中不建议由其他trigger ,PTOSC使用的就是 update , insert , delete triggers 来解决原表和新表之间的数据同步的问题。

4 对于大表,主业务表,还是不敢再业务时间来做,也是要到非业务或低峰期,来做。

虽然有这么多那么多的问题,但也是用了很多年。FB-OST 没有研究但原理也是类似的。(FB-OST)

GH-OST 其实是这三者里面,原理不一样的,有点开脑洞, 开发者是一个DBA,拥有15年的经验。

以下为开发者,在GITHUB 大会上的自我介绍

在考虑上面两个工具的缺点后,我使用了binary log ,虽然也我这里面也收到了FB-OST 的启发,但我这里的设计比上面提到的工具的优点,主要就是我的新表的数据来源不是来自于tigger 而是来自于binlong。 大家可以想一下,如果我同事更改15个表,要产生多少trigger,多少了connections 要被消耗,系统的工作负载会非常的重,MYSQL 不喜欢这样,而使用了binlog他不管修改多少表,他对于MYSQL 来说就是一个序列化的事情,MYSQL 喜欢序列化的事情,这样不会对系统产生更多的负载。

总结使用BINOG 有以下的优点

1 binlary logs 可以从任意的地方来读取,GH-OST 相当于一个从节点

2 gh-ost 控制了整个数据流,避免突然的无法控制的增量写

3 gh-ost 已经与master 节点工作负载解耦

4 gh-ost 的设计是依照顺序写的原则,完全避免了锁,对于操作的

server 来说就是一个single connection

5 数据的增量计算方法简单

上面的三个图很好的诠释了gh-ost 为什么比其他的工具要强的原因,可以从从库来读取数据,在写到master ,我也可以在master 上读,然后在master 上写,还可以在slave 上读,在slave 上改。

并且gh-ost还可以做真实的测试,而不是dry-run

另外一个优点是GH-OST 在执行的时候,可以根据master的状态来停止正在执行的任务,而等到master的负载变得正常后,在根据BINLOG继续来处理之前的延迟的工作。所以GH-OST 是一个安全的,值得信任的工具。

(完)

------------------------------

当然,这个工具也很具有中国的特色

-------------------------------


要使用这个工具本身要本身的MYSQL是一定要支持binlog,必须打开



log-bin=mysql-bin

binlog-format=ROW

log-slave-updates=ON


下面是一个小的实验



gh-ost -allow-on-master -assume-rbr -exact-rowcount


-critical-load Threads_running=400 -critical-load-hibernate-seconds 60


-database employees -max-load Threads_running=100


-nice-ratio 0.1 -chunk-size 5000 -ask-pass -table employeess


-user ghost -host 192.168.198.81


-alter 'add COLUMN add_column varchar(2000)'


-verbose -execute 2>&1 | tee gh-ost.log








添加一个大字段是没有问题的。

在程序里面,下面这段是从binlog 中将需要同步的 U D I 操作进行挑拣

创建隐藏的魔鬼表

通过阅读部分源码,这里密码的insert 是采用 insert DUPLICATE KEY 方式来进行数据的插入。

其实从设计上来想,作者的想法是很有意思的,因为拷贝原表的数据到结束的这段时间,是不能应用这段时间的在这个表的修改,但BINLOG 里面是可以记录百分之百的对这张表的数据的变动的记录,则只要从开始拷贝表的时间点开始,到结束拷贝后,在将binlog 里面的数据进行提取,然后在新表上操作,待完成后在更换两个表rename,达到与原来加trigger的目的一样的效果。利用BINLOG的顺序性,稳定性,准确性等特点,将trigger性能问题化解。

另外更有意思的是gh-ost 可以在程序操作的过程中,修改一些配置

例如上例子中的,可以用下面的例子,将一些参数打入到正在运行的命令中

echo 'dml-batch-size=100' | nc -U /tmp/gh-ost.employees.employeess.sock

最后说说几个重要的参数

-allow-master-master 在主库中运行

-allow-nullable-unique-key 如果是表中唯一索引是不允许有NULL得情况,这里如果情况存在,则给这个值,程序可以继续运行

-assume-master-host string 当你目前的情况事主主的情况,

-assume-rbr 设置此标志可避免重新启动复制,并且您可以继续使用gh-ost而无需超级特权

-chunk-size int 每次要处理的行数

-concurrent-rowcount 计算需要copy的行

-critical-load 设置最大的阈值

-critical-load-hibernate-seconds 当达到负荷值后,系统将停止操作多少秒

-critical-load-interval-millis 设置当达到临界值后,间隔多长时间在进行重试

-cut-over 选择新旧表之间的切换类型

-discard-foreign-keys 忽略外键,当操作时需要注意的是如果表有外键则新表是不会建立外键的

-dml-batch-size 在单个任务中处理DML的数量是多少,默认10

-exact-rowcount 取得精确的表的行数

-initially-drop-ghost-table 如果是多次运行,已经留存上次存在的ghost表,选择这个参数,会在操作时将之前没有清理的表清理掉,慎用

-initially-drop-old-table 和上边的表一样,删除上次操作留下的老表

-initially-drop-socket-file 如果需要类似上边需要,在系统运行期间打入更改参数的情况,那就需要指定这个参数

-nice-ratio float 在每次操作之间需要等待的时间

-throttle-additional-flag-file 保存throttle的设置的路径

-throttle-control-replicas 检测那些从库需要进行检测延迟

最后用一个命令结束,根据命令来注释一些特别行的作用

gh-ost \

-allow-on-master \

-max-load=Threads_running=25 \ 当超过threads_runing阈值就停止

-chunk-size=1000 \ 1000行批处理

-throttle-control-replicas="192.168.56.144″ \ 对这个从库检测

-max-lag-millis=1500 \ 从延迟的时间的阈值

-user="ghost" \

-password="ghost" \

-host=192.168.56.145 \

-database="mysqlslap" \

-table="t1″ \

-verbose \

-alter="add column whatever6 varchar(50)" \

-cut-over=default \

-default-retries=120 \

-switch-to-rbr \

-panic-flag-file=/tmp/ghost.panic.flag \ 创建该文件时,工作立即停止

-postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \

当这个文件存在的时候,不允许切换发生,当这个文件消失,才可以开始进行表的切换

-execute

到此,相信大家对"MYSQL 修改表结构 gh-ost "有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

数据 工具 时间 参数 情况 问题 运行 就是 系统 切换 工作 延迟 结构 之间 优点 命令 拷贝 文件 时候 程序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 上海睿民互联网科技有限公司 苏州找大状互联网科技有限公司 互联网电商科技 互联网科技开发公司 北京互联网科技公司 天津摩尔互联网科技 长亮科技 互联网金融 上海亿帐通互联网科技 栖莱科技互联网股份有限公司 南平创想时代互联网科技有限公司 开一家科技互联网公司需要多少钱 工业互联网等科技实现智能化赋能 皮皮虾互联网科技有限公司 21世纪互联网科技成就 科技互联网行业投资研究 互联网科技手机排行榜 互联网科技企业商标注意事项 黑龙江互联网科技公司 互联网科技企业文化 互联网电商科技 关于新基建和互联网科技 栖莱科技互联网股份有限公司 佳云科技和互联网广告 互联网经济与金融科技 厦门比较好的科技互联网公司 国大互联网教育科技有限公司薪资 伍佰万互联网科技怎么赚钱 杭州披云加互联网科技有限公司 青岛互联网科技园
0