温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MYSQL 修改表结构 gh-ost

发布时间:2021-07-16 09:22:53 来源:亿速云 阅读:228 作者:chen 栏目:大数据

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

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

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

PT-OSC

MYSQL 修改表结构 gh-ost

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

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

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

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

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

MYSQL 修改表结构 gh-ost

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

MYSQL 修改表结构 gh-ost

以下为开发者,在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 数据的增量计算方法简单

MYSQL 修改表结构 gh-ost

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

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

MYSQL 修改表结构 gh-ost

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

MYSQL 修改表结构 gh-ost

(完)

——————————————————————————————

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

MYSQL 修改表结构 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

MYSQL 修改表结构 gh-ost


MYSQL 修改表结构 gh-ost

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

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

MYSQL 修改表结构 gh-ost

创建隐藏的魔鬼表

MYSQL 修改表结构 gh-ost

MYSQL 修改表结构 gh-ost

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

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

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

MYSQL 修改表结构 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 ”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI