首页 > 数据库 >MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk

时间:2023-06-22 13:06:59浏览次数:40  
标签:load OST ost master MYSQL talk gh


MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_开发者

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

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

PT-OSC

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_外键_02

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

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

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

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

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_数据_03

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_数据_04

以下为开发者,在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 到底强哪里 作者自己来talk_开发者_05

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

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_数据_06

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_开发者_07

(完)

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

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_外键_08

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

要使用这个工具本身要本身的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 到底强哪里 作者自己来talk_开发者_09

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

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_开发者_10

创建隐藏的魔鬼表

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_外键_11

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_开发者_12

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

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

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

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk_外键_13

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

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 到底强哪里 作者自己来talk_外键_14

   

      

标签:load,OST,ost,master,MYSQL,talk,gh
From: https://blog.51cto.com/u_14150796/6534663

相关文章

  • MYSQL8 处理JSON 我不再是豆包,我是干粮
    最近来了一个项目,本身如果用MONGODB有点大材小用,所以为了避免某些表继续使用text字段来处理JSON数据的方式,让技术水平上一个档次,并且公司也不在上MYSQL5.7的新项目,全部是8.018这个版本。继续上一篇文字,那就看看MYSQL8的野心到底是如何展现的。顺便研究完,给开发一个靠谱的方案,......
  • MYSQL SHELL 到底是个什么局 剑指 “大芒果”
    如果在WINDOWS上想链接在LINUX上的MYSQL有什么方法,windows上各种GUI,还是打开MYSQL那个原本黑漆漆的小方格。现在你有了新的选,MYSQLShell全新的连接MYSQL的方式,一个满足各种人群连接MYSQL的方式。从官方上下载后,在WINDOWS上解压后,直接点击执行。双击mysqlsh为什么要有mysqlshel......
  • MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)...
    这是关于MYSQL8获取信息的方式的第六篇,终于到达了慢日志查询的位置,在MYSQL的DBA的管理员的心目中,pt-query-digest和SLOWQUERYLOG是分析慢查询的唯一的方式。实际上在MYSQL8中这样的慢查询的数据获取方式,已经被淘汰了,或者说不合时宜了。主要的原因是获取信息的时效性的问题......
  • POSTGRESQL 短查询优化,独立索引与组合索引 8
    这是一个关于POSTGRESQL查询的优化系列,这已经是这个系列的第八集了,接上期,在OLTP查询中我们需要注意的查询优化的地方非常多,稍不留意就会在一些问题上的操作导致查询的数据逻辑错误。继续上次的问题,在查询中,针对事件的查询问题,我们一般处理的模式 1 针对具体事件字段的时间标注......
  • postgresql SQL 优化 -- 理论与原理
    这里写的是一个系列,关于POSTGRESQLSQL优化的问题,这篇是这个系列的第二篇,第一篇可以在文字的末尾的连接中找到,之前有同学提出,希望有一个历史文字的连接。这期就进入正题,一个SQL语句撰写出来是怎么开始工作的,也就是查询的过程queryprocessing ,这里从几个步骤入手1  一个SQL......
  • Postgresql SQL 优化 两个模型与数据存储
    这里写的是一个系列,这是系列的第三篇,这个系列主要是针对SQL优化,前两篇的地址下文字的最下方。接上次,上次提到了SQL优化的原理与理论,实际上SQL优化的原理是离不开两个模型与数据存储的, 整体SQL优化的核心也在于两个模型和数据存储。简化的说明这两个模型1 数据访问成本模型2 ......
  • MYSQL 从performance_schema说起,但不止于PS (1)
    以下的内容,希望你的环节是在8.011以上的环境中操作,部分需要在8.018以上环境操作MYSQL如果你在使用MYSQL8的版本,那么performanceschema的确的重新认识一下了。在重新认识mysql的performance_schema之前我们有一些需要在强化的知识。分别是threads,instruments,consume......
  • PostgreSQL 从开发要换PG表字段的 collaion 说起 到 程序员别异想天开了
    2021年绝对是一个有意思的念头,估计过10年都会想到今年的一些变革,很多人都会被影响,改变,重新开始,或寻找新的路径。归正题,新公司的开发小朋友,对DB提出了一个问题,就是要修改某个表的字段的collation,究其原因为了某些业务中这个字段的排序。然后我就告诉DB,NONONO,究其原因曾经SQLSE......
  • MYSQL 从performance_schema说起,但不止于PS ,sys 到 information_schema?(4)
    接着上期sys库的内容,sys库的监控的内容基本上可以满足大部分对于性能分析的需求,SYS库中的信息可以分为2种数据展示的方式,和10+种的信息展示类别。我们下面来说一说。基于ORACLE的设计理念,SYS库中的信息分为一X$为开头的VIEW的信息和以普通表名为开头的信息。两者的信息内容是相......
  • PostgreSQL autovacuum 5 怎么监控(autovacuum 扫描表工作的百分比)
    PostgreSQL最大的问题就是vacuum,只要PG的实现多版本和UNDO的方式不改变,那么这个话题就会一直继续,到永远。前面四期讲了autovacuum的触发条件,源代码,怎么调整参数,优化,今天最后一章,的说说怎么进行监控,并且评定你的autovacuum的工作是合格的。下面的内容主要是基于几点来围绕的 监......