背景:线上数据量过大,需要涉及到修改表结构,表结构修改会锁表,采用gh-ost onlineDDL

安装go语言环境,gh-ost需要

sudo yum install golang

安装gh-ost 工具

  • https://github.com/github/gh-ost 请使用最新稳定版本
  • 将gh-ost文件copy到/usr/loca sudo cp gh-ost /usr/loca
  • sudo ln -s /usr/local/gh-ost /usr/bin/gh-ost
  • 校验安装是否成功: gh-ost -version

执行onlineDDL

gh-ost --aliyun-rds --user=“user” --password=“pwd” --host=“xxx” --port=3306 --database=“test” --table=“t” --verbose --alter=“CHANGE mobile mobile VARCHAR(50) DEFAULT NULL COMMENT ‘手机号码’” --allow-on-master --assume-rbr

4500w数据 耗时:1h20min

gh-ost参数说明

Usage of gh-ost:--aliyun-rds:是否在阿里云数据库上执行。true--allow-master-master:是否允许gh-ost运行在双主复制架构中,一般与-assume-master-host参数一起使用--allow-nullable-unique-key:允许gh-ost在数据迁移依赖的唯一键可以为NULL,默认为不允许为NULL的唯一键。如果数据迁移(migrate)依赖的唯一键允许NULL值,则可能造成数据不正确,请谨慎使用。--allow-on-master:允许gh-ost直接运行在主库上。默认gh-ost连接的从库。--alter string:DDL语句--approve-renamed-columns ALTER:如果你修改一个列的名字,gh-ost将会识别到并且需要提供重命名列名的原因,默认情况下gh-ost是不继续执行的,除非提供-approve-renamed-columns ALTER。--ask-pass:MySQL密码--assume-master-host string:为gh-ost指定一个主库,格式为”ip:port”或者”hostname:port”。在这主主架构里比较有用,或则在gh-ost发现不到主的时候有用。--assume-rbr:确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定-assume-rbr,这样可以禁止从库上运行stop slave,start slave,执行gh-ost用户也不需要SUPER权限。--check-flag--chunk-size int:在每次迭代中处理的行数量(允许范围:100-100000),默认值为1000。--concurrent-rowcount:该参数如果为True(默认值),则进行row-copy之后,估算统计行数(使用explain select count(*)方式),并调整ETA时间,否则,gh-ost首先预估统计行数,然后开始row-copy。--conf string:gh-ost的配置文件路径。--critical-load string:一系列逗号分隔的status-name=values组成,当MySQL中status超过对应的values,gh-ost将会退出。-critical-load Threads_connected=20,Connections=1500,指的是当MySQL中的状态值Threads_connected>20,Connections>1500的时候,gh-ost将会由于该数据库严重负载而停止并退出。Comma delimited status-name=threshold, same format as --max-load. When status exceeds threshold, app panics and quits--critical-load-hibernate-seconds int :负载达到critical-load时,gh-ost在指定的时间内进入休眠状态。 它不会读/写任何来自任何服务器的任何内容。--critical-load-interval-millis int:当值为0时,当达到-critical-load,gh-ost立即退出。当值不为0时,当达到-critical-load,gh-ost会在-critical-load-interval-millis秒数后,再次进行检查,再次检查依旧达到-critical-load,gh-ost将会退出。--cut-over string:选择cut-over类型:atomic/two-step,atomic(默认)类型的cut-over是github的算法,two-step采用的是facebook-OSC的算法。--cut-over-exponential-backoff--cut-over-lock-timeout-seconds int:gh-ost在cut-over阶段最大的锁等待时间,当锁超时时,gh-ost的cut-over将重试。(默认值:3)--database string:数据库名称。--debug:debug模式。--default-retries int:各种操作在panick前重试次数。(默认为60)--discard-foreign-keys:该参数针对一个有外键的表,在gh-ost创建ghost表时,并不会为ghost表创建外键。该参数很适合用于删除外键,除此之外,请谨慎使用。--dml-batch-size int:在单个事务中应用DML事件的批量大小(范围1-100)(默认值为10)--exact-rowcount:准确统计表行数(使用select count(*)的方式),得到更准确的预估时间。--execute:实际执行alter&migrate表,默认为noop,不执行,仅仅做测试并退出,如果想要ALTER TABLE语句真正落实到数据库中去,需要明确指定-execute--exponential-backoff-max-interval int--force-named-cut-over:如果为true,则'unpostpone | cut-over'交互式命令必须命名迁移的表--force-table-names string:在临时表上使用的表名前缀--heartbeat-interval-millis int:gh-ost心跳频率值,默认为500--help--hooks-hint string:任意消息通过GH_OST_HOOKS_HINT注入到钩子--hooks-path string:hook文件存放目录(默认为empty,即禁用hook)。hook会在这个目录下寻找符合约定命名的hook文件来执行。--host string :MySQL IP/hostname--initially-drop-ghost-table:gh-ost操作之前,检查并删除已经存在的ghost表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。--initially-drop-old-table:gh-ost操作之前,检查并删除已经存在的旧表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。--initially-drop-socket-file:gh-ost强制删除已经存在的socket文件。该参数不建议使用,可能会删除一个正在运行的gh-ost程序,导致DDL失败。--master-password string :MySQL 主密码--master-user string:MysQL主账号--max-lag-millis int:主从复制最大延迟时间,当主从复制延迟时间超过该值后,gh-ost将采取节流(throttle)措施,默认值:1500s。--max-load string:逗号分隔状态名称=阈值,如:'Threads_running=100,Threads_connected=500'. When status exceeds threshold, app throttles writes--migrate-on-replica:gh-ost的数据迁移(migrate)运行在从库上,而不是主库上。 --nice-ratio float:每次chunk时间段的休眠时间,范围[0.0…100.0]。0:每个chunk时间段不休眠,即一个chunk接着一个chunk执行;1:每row-copy 1毫秒,则另外休眠1毫秒;0.7:每row-copy 10毫秒,则另外休眠7毫秒。--ok-to-drop-table:gh-ost操作结束后,删除旧表,默认状态是不删除旧表,会存在_tablename_del表。--panic-flag-file string:当这个文件被创建,gh-ost将会立即退出。--password string :MySQL密码--port int :MySQL端口,最好用从库--postpone-cut-over-flag-file string:当这个文件存在的时候,gh-ost的cut-over阶段将会被推迟,数据仍然在复制,直到该文件被删除。--quiet:静默模式。--replica-server-id uint : gh-ost的server_id--replication-lag-query string:弃用--serve-socket-file string:gh-ost的socket文件绝对路径。--serve-tcp-port int:gh-ost使用端口,默认为关闭端口。--skip-foreign-key-checks:确定你的表上没有外键时,设置为'true',并且希望跳过gh-ost验证的时间-skip-renamed-columns ALTER--skip-renamed-columns ALTER:如果你修改一个列的名字(如change column),gh-ost将会识别到并且需要提供重命名列名的原因,默认情况下gh-ost是不继续执行的。该参数告诉gh-ost跳该列的数据迁移,让gh-ost把重命名列作为无关紧要的列。该操作很危险,你会损失该列的所有值。--stack:添加错误堆栈追踪。--switch-to-rbr:让gh-ost自动将从库的binlog_format转换为ROW格式。--table string:表名--test-on-replica:在从库上测试gh-ost,包括在从库上数据迁移(migration),数据迁移完成后stop slave,原表和ghost表立刻交换而后立刻交换回来。继续保持stop slave,使你可以对比两张表。--test-on-replica-skip-replica-stop:当-test-on-replica执行时,该参数表示该过程中不用stop slave。--throttle-additional-flag-file string:当该文件被创建后,gh-ost操作立即停止。该参数可以用在多个gh-ost同时操作的时候,创建一个文件,让所有的gh-ost操作停止,或者删除这个文件,让所有的gh-ost操作恢复。--throttle-control-replicas string:列出所有需要被检查主从复制延迟的从库。--throttle-flag-file string:当该文件被创建后,gh-ost操作立即停止。该参数适合控制单个gh-ost操作。-throttle-additional-flag-file string适合控制多个gh-ost操作。--throttle-http string--throttle-query string:节流查询。每秒钟执行一次。当返回值=0时不需要节流,当返回值>0时,需要执行节流操作。该查询会在数据迁移(migrated)服务器上操作,所以请确保该查询是轻量级的。--timestamp-old-table:在旧表名中使用时间戳。 这会使旧表名称具有唯一且无冲突的交叉迁移--tungsten:告诉gh-ost你正在运行的是一个tungsten-replication拓扑结构。--user string :MYSQL用户--verbose--version

gh-ost修改数据量较大表结构实战相关推荐

  1. mysql查看比较大的数据表_mysql 如何查看哪些表数据量比较大

    数据库中有几十上百张表,那么哪些表的数据量比较大呢,总不能一个表一个表的去查询吧,在mysql中也有类似于oracle的数据字典表,只不过mysql没有oracle记录的那么多和详细,但也足够我们查询 ...

  2. 单表数据量过大处理策略

    今天和一个朋友在讨论怎么样应对单表数据量过大,比如一些交易数据,每天都有10W的交易量.没有多久该表的查询,插入速度将变慢,最终将不可用. 对于关系数据库来说,应对单表数据量过大的策略大体上有两种. ...

  3. 从大数据量分库分表 MySQL 合并迁移数据到 TiDB

    如果分表数据总规模特别大(例如大于 1 TiB),并且允许 TiDB 集群在迁移期间无其他业务写入,那么你可以使用 TiDB Lightning 对分表数据进行快速合并导入,然后根据业务需要选择是否使 ...

  4. 数据量太大?用数据库水平切分搞定!

    本文将介绍数据库架构设计中的一些基本概念,常见问题以及对应解决方案,为了便于读者理解,将以"用户中心"为例,讲解数据库架构设计的常见玩法. 用户中心 用户中心是一个非常常见的业务, ...

  5. PHP导出Excel时数据量过大的问题

    1.设置脚本运行时间 set_time_limit(0) 2.运行内存设置 当数据量比较大时就需要设置memory_limit,来防止内存报错,但是这终究不是解决办法,因为系统的内存是有限的,比如你设 ...

  6. 数据量过大时数据库操作的处理

    一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量.那么,如何实现快速地从这些 超大容量的数据库中提取数据(查询).分析.统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理 ...

  7. mysql my.ini位置错误_解决mysql导入数据量很大导致失败及查找my.ini 位置(my.ini)在哪...

    数据库数据量很大的数据库导入到本地时,会等很久,然而等很久之后还是显示失败: 这是就要看看自己本地的没mysql是否设置了超时等待,如果报相关time_out这些,可以把mysql.ini尾部添加ma ...

  8. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

  9. 解决mysql导入数据量很大导致失败及查找my.ini 位置(my.ini)在哪

    数据库数据量很大的数据库导入到本地时,会等很久,然而等很久之后还是显示失败: 这是就要看看自己本地的没mysql是否设置了超时等待,如果报相关time_out这些,可以把mysql.ini尾部添加ma ...

最新文章

  1. 计算机专业大一暑假,2020年计算机专业大学生暑期社会实践调查报告
  2. js 用下标获取map值_javascript怎么获取map的值?
  3. 命令行插入时显示不存在_成年人的世界里,不存在“容易”两个字没人心疼时自己要学会坚强...
  4. 小白学习使用gitee问题产生汇总(持续更新)
  5. 难怪各家抢滩物联网!真实原因竟是……
  6. grafana监控oracle11g,Grafana展示zabbix监控数据
  7. linux不能上网问题
  8. 系统设计与任务分配(团队作业)
  9. Hadoop-2.2.0中文文档—— Common - CLI MiniCluster
  10. 第十届全国大学生智能汽车竞赛获奖名单
  11. C语言基础知识入门(大全)
  12. 安装ie11提示计算机安装了更新的版本,离线安装IE11浏览器提示quot;获取更新quot;解决方法 - 191路由网...
  13. 在Ubuntu 16.04 64bit上安装谷歌地球Google Earth免费版
  14. LTE系统中的OFDM技术
  15. ajax hapi上传文件,在hapi框架里使用ajax提交表单数据,但是服务端接收到的数据是空对象。怎么办啊?...
  16. 兆易创新携手合肥产投进军12英寸晶圆存储器
  17. 基于J2ME的游戏开发总结和感想
  18. Office 2007重新输入序列号激活
  19. 中软国际赴黔参加大数据国际年会,规划产业布局
  20. MybatisPlus---从入门到深化

热门文章

  1. Onboard SDK文档
  2. 怀化市2021年高考查询成绩,2021怀化市地区高考成绩排名查询,怀化市高考各高中成绩喜报榜单...
  3. 如图GX Works2所示我该如何操作?
  4. web项目移动端在线预览(word格式转html)
  5. 使用CS发送钓鱼邮件
  6. matlab/simulink中自定义m-s函数作为simulink模块使用实例
  7. 怎么确定电脑上没有mysql_怎么检查电脑有没有mysql?
  8. wireshark抓包获取好友ip,定位所在位置
  9. 自行更换iPhone 6s 手机电池 | 工序步骤
  10. 利用cookie传值