阿里云RDS在线DDL工具gh-ost
最近公司进行了阿里云迁移,将所有服务器迁移到阿里云后,在对rds进行ddl的时候,发现原来的pt工具无法正常使用,主要表现在连接数据库的时候等待,将原始表数据拷贝到中间表时缓慢,变更过程中一直提示连不上RDS。虽然使用pt-osc可以对小表变更,但是对大表DDL的时候太过缓慢,而且一直连接中断。所以只能寻找新的工具gh-ost。
针对gh-ost的原理,实现步骤,变更方式以及优点限制不再赘述,可以参考官网或者以下链接。本篇博客主要记录我对gh-ost的使用。
官网
https://github.com/github/gh-ost
http://mysql.taobao.org/monthly/2018/05/02
http://www.ywnds.com/?p=14265
参数解析
https://yq.aliyun.com/articles/62928
下载安装
https://github.com/github/gh-ost/releases
安装特别简单 下载rpm包后直接 rpm -ivh 安装
rpm -ivh gh-ost-1.0.47-1.x86_64.rpm
或者下载二进制压缩包后直接解压就可以使用
tar zxvf gh-ost-binary-linux-20180527215024.tar.gz
参数说明
gh-ost --help
--host
数据库实例地址。
--port
数据库实例端口。
--user
数据库实例用户名。
--password
数据库实例密码。
--database
数据库名称。
--table
表名称。
--alter
ALTER语句的body部分,如”ALTER TABLE wing ADD COLUMN id int not null default 0”,使用gh-ost的--alter参数时,写成--alter ADD COLUMN id int not null default 0即可。
--allow-on-master
默认情况下gh-ost希望你连接一个从库进行binlog获取。如果你想连接主库进行整个迁移操作,需要加上此选项即可。gh-ost提供了三种方案连接方案。
--max-load
迁移过程中,gh-ost会时刻关注负载情况,负载阀值是使用者自己定义,比如数据库的最大连接数,如果超过阀值,gh-ost不会退出,会等待到负载在阀值以下继续执行。
--critical-load
这个指的是gh-ost退出阀值,当负载超过这个阀值,gh-ost会停止并退出。
--max-lag-millis
会监控从库的主从延迟情况,如果延迟秒数超过这个阀值,迁移不会退出,等待延迟秒数低于这个阀值继续迁移。这个是迁移中很大的一个问题,特别是在从库迁移时。
gh-ost监控复制延迟是通过检查gh-ost本身在实用程序更新日志表中注入的心跳事件来衡量的。也就是说,为了测量这个复制延迟,gh-ost不需要发出show slave status命令,也没有任何外部心跳机制。
当提供--throttle-control-replicas时,限流还会考虑指定主机上的延迟。通过查询gh-ost的更新日志表(其中gh-ost注入心跳)完成列出的主机上的延迟时间测量。
gh-ost能够利用毫秒测量复制延迟,当--max-lag-millis小于1000,即小于1秒时,gh-ost将进行限流。
--throttle-control-replicas
和–max-lag-millis/code>参数相结合,这个参数指定主从延迟的数据库实例。
--initially-drop-ghost-table
gh-ost在迁移时会创建两张表,分别是”_xx_ghc”和”_xx_gho”,gh-ost非正常退出时不会清理掉。如果这两张表存在,且加上了这个参数,那么在执行gh-ost时会自动删除原gh表,重新创建,否则退出。_xx_gho表相当于老表的全量备份,_xx_ghc表数据是数据更改日志(Changelog)。
--initially-drop-old-table
gh-ost执行完成后默认不会删除“_xx_del”表(加上ok-to-drop-table参数会在执行完成后删除原表),此表是由gh-ost原子切换时产生(rename table `sbtest`.`xx` to `sbtest`.`_xx_del`, `sbtest`.`_xx_gho` to `sbtest`.`xx`),是存储原表数据。加上此参数时gh-ost会在执行前如果检测到“_xx_del”表存在则进行删除操作(默认不启用该参数,gh-ost直接退出操作),该参数不建议使用,请手动处理原来存在的原数据表。
--initially-drop-socket-file
gh-ost执行时会创建socket文件,非正常退出时不会删除socket文件,下次执行gh-ost时会报错,加上这个参数,gh-ost会强制删除已经存在的socket文件。该参数不建议使用,可能会删除一个正在运行的gh-ost程序,导致DDL失败。
--ok-to-drop-table
gh-ost执行完以后是否删除“_xx_del”表,此表是由gh-ost原子切换时产生(rename table `sbtest`.`xx` to `sbtest`.`_xx_del`, `sbtest`.`_xx_gho` to `sbtest`.`xx`),是存储原表数据。加上此参数会执行完成后自动删除,但是非正常完成退出时无法删除此表,可能就需要借助initially-drop-old-table参数在执行前删除已经存在的“_xx_del”表。该参数不建议使用,请手动处理原表。
--cut-over
自动执行rename操作,选择cut-over类型:atomic/two-step,atomic(默认)类型的cut-over是Github的算法,two-step采用的是facebook-OSC的算法。
--cut-over-lock-timeout-seconds
gh-ost在cut-over阶段最大的锁等待时间,当锁超时时,gh-ost的cut-over将重试。(默认值:3)
--switch-to-rbr
让gh-ost自动将从库的binlog_format转换为ROW格式。
--assume-rbr
确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定--assume-rbr,这样可以禁止从库上运行stop slave,start slave;执行gh-ost用户也不需要SUPER权限。
--panic-flag-file
这个文件被创建,迁移操作会被立即终止退出。
--throttle-flag-file
此文件存在时操作暂停,删除文件操作会继续。
--postpone-cut-over-flag-file
当这个文件存在的时候,gh-ost的cut-over阶段将会被推迟,直到该文件被删除。
--concurrent-rowcount
该参数如果为True(默认值),则进行row-copy之后,估算统计行数(使用explain select count(*)方式),并调整ETA时间,否则,gh-ost首先预估统计行数,然后开始row-copy。
--exact-rowcount
准确统计表行数(使用select count(*)的方式),得到更准确的预估时间。
--execute
如果确定执行,加上这个参数。
可选参数介绍
--default-retries
各种操作在panick前重试次数。(默认为60)
--chunk-size
迁移过程是一步步分批次完成的,这个参数是指事务每次提交的行数,默认是1000。
--timestamp-old-table
使旧表包含时间戳值,旧表是在成功迁移结束时将原始表重新命名的内容。例如,如果表是gh_ost_test,那么旧表通常是_gh_ost_test_del。使用--timestamp-old-table后,它将是_gh_ost_test_20170221103147_del。
--throttle-http
提供一个HTTP端点,gh-ost将在给定的URL上发出HEAD请求,并在响应状态码不是200时进行限流。URL可以通过交互式命令动态查询和更新,空的URL表示禁用HTTP检查。
--approve-renamed-columns
当做(change old_name new_name …)动作时,gh-ost分析语句以尝试将旧列名称与新列名称相关联,如果它检测到确实是重命名操作,默认情况下将会打印出信息并退出。但除非你提供--approve-renamed-columns,强制发出迁移操作。
如果你认为gh-ost解析错误,并且实际上并且没有重命名,你可以改为传入--skip-renamed-columns,这将导致gh-ost取消关联列值,数据将不会在这些列之间复制。
--skip-foreign-key-checks
默认情况下,gh-ost会验证迁移表中存不存在外键,如果存在就会报错并退出;在具有大量表的服务器上,此检查可能需要很长时间。如果你确定没有外键存在(表没有引用其他表,也没有被其他表引用)并希望保存检查时间,可以使用--skip-foreign-key-checks。但如果表上有外键,使用这个参数则会清除外键,千万注意。
--discard-foreign-keys
该操作很危险,意味着将默默丢弃表上存在的任何外键。目前,gh-ost不支持迁移表上的外键(当它在迁移表上注意到外键时,它会保留)。但是,它能够支持通过此标志删除外键,如果你想这么干,这是一个有用的选项。使用下来感觉跟--skip-foreign-key-checks参数作用一样。
--replica-server-id
gh-ost原理是通过模拟slave从而获得binlog,其默认server-id为99999,如果你运行多个迁移,那么你必须为每个gh-ost进程提供一个不同的,唯一的server-id。也可以使用进程ID当做server-id,例如:--replica-server-id = $((1000000000 + ))。
--migrate-on-replica
通常,gh-ost用于在主服务器上迁移表。如果你只希望在从库上执行全部迁移,使用--migrate-on-replica参数将gh-ost连接到从库进行迁移。
--assume-master-host
默认情况下,gh-ost更倾向连接从库来进行迁移。gh-ost通过爬取复制拓扑来推断主服务器的身份,你可以通过--assume-master-host = the.master.com明确告诉gh-ost主服务器的身份。这在以下方面很有用:
主 – 主拓扑结构(与--allow-master-master一起使用),其中gh-ost可以随意选择其中一个主协同者,这种情况你可以选择一个特定的主库。
tungsten×××拓扑结构(与--tungsten一起使用),其中gh-ost无法抓取并检测主节点。
--dml-batch-size
gh-ost从二进制日志读取事件,并将它们应用到ghost表上。它采用的方式是将多个事件分组应用于单个事务中。这可以提供更好的写入吞吐量,因为我们不需要将每个事务日志同步到的磁盘。
此选项就是控制批量写入的大小,允许的值是1 – 100,其中1表示不分组处理(二进制日志中的每个事件在其自己的事务中应用到ghost表上)。默认值是10。
--heartbeat-interval-millis
用来控制注入心跳事件的频率(就是_xx_ghc表),用来测量主从延迟。你应该设置heartbeat-interval-millis <= max-lag-millis。否则,将失去粒度和效果。默认值100。其--max-lag-millis值应该在300-500之间。
--conf
指定gh-ost凭据的文件,如下格式。
[client]
user=gromit
password=123456
--debug
输出详细日志。
--verbose
执行过程输出日志。
实例应用
单实例自建数据库
双主模式
转载于:https://blog.51cto.com/11784929/2318693
阿里云RDS在线DDL工具gh-ost相关推荐
- 【数据库取证篇】阿里云RDS MySQL数据库在线取证教程
[数据库取证篇]阿里云RDS MySQL数据库在线取证教程 在线取证或备份数据-[蘇小沐] 文章目录 [数据库取证篇]阿里云RDS MySQL数据库在线取证教程 1.实验环境 一.RDS登录方式 (一 ...
- 阿里云RDS导出数据库结构整理工具
本文使用shell实现一个小工具,可以整理阿里云RDS导出数据库结构的zip文件,整理为可直接使用的sql文件. 阿里云RDS导出的数据库结构sql需要整理的地方 1.解压后sql文件名称缺少数据库名 ...
- 从没想到监控可以这么做!阿里云RDS智能诊断系统首次公开
阿里妹导读:来自阿里云RDS团队的论文"TcpRT: Instrument and Diagnostic Analysis System for Service Quality of Clo ...
- 阿里云rds升级mysql8_为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!...
2019年5月29日15时,阿里云RDS for MySQL 8.0正式上线,使得阿里云成为紧跟社区步伐,发布MySQL最新版本的云厂商.RDS for MySQL 8.0 产品是阿里云推出的 MyS ...
- 阿里云RDS深度定制-XA Crash Safe
简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库系 ...
- 阿里云RDS云数据库的使用
什么是云数据库RDS ? 阿里云关系型数据库(Relational Database Service,简称RDS)是一种稳定可靠.可弹性伸缩的在线数据库服务.基于阿里云分布式文件系统和SSD盘高性能存 ...
- 记一次阿里云RDS与自建数据库同步中断的补救过程
背景 2018年4月24日上午9点左右,小编在即将托管的服务器上建立数据库,并通过openvpn建立加密隧道,从而实现阿里云RDS和本地自建数据库之间同步.在托管服务器上配置openvpn后,重启op ...
- 四步搞定阿里云RDS云数据库恢复到本地mysql数据库
第1步:下载提取工具和阿里云rds数据库备份文件 1.先去阿里云数据rds后台–>备份恢复–>下载你的数据备份 2.下载阿里云官方提供的rds_backup_extract.sh数据备份文 ...
- 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core
在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 帐户 连接数 A 4077 B 3995 C 741 D 698 E ...
最新文章
- Python的seaborn库(图比较炫)
- Linux 组合命令/命令组合的符号
- 高位在前低位在后是啥意思_两年前满仓买的一支股,买时28,现在8块多点,股民怎么处理好?...
- weblogic时间问题
- python语言与c语言相比在分支结构上有什么不同_C语言顺序结构和分支结构总结...
- SQL服务器名称的更改
- [翻译]Real-Time Correlative Scan Matching
- un-app网易云歌词滚动功能
- bootstrap视频教程 jsp_家政服务系统(JAVA,SSM,BOOTSTRAP,JSP,AJAX,MYSQL)+手把手系列视频教程...
- 星梦邮轮世界梦号推出深圳母港特别航次
- python列表怎么比较大小_python列表怎么比较大小
- 人工智能安全(五)—梯度攻击
- 电脑桌面一计算机打不开怎么办,电脑桌面什么都打不开怎么办
- 如何在EXCEL中画横线并输入汉字
- HBase简介及安装
- ValueError: With n_samples=0, test_size=0.2 and train_size=None, the resulting train set will be emp
- LeetCode刷题(45)~位1的个数【布赖恩·克尼根算法】
- u盘格式化后如何恢重要的数据
- fatal error C1075
- 可以u盘上运行linux系统,U盘上运行的linux系统--babylinux
热门文章
- 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
- Linux系统chmod误操作目录权限恢复方法
- 图像加噪与滤波处理(python+opencv)
- 【bp靶场portswigger-服务端2】身份认证漏洞-16个实验(全)
- 《University Calculus》-chape12-偏导数-基本概念
- MCAL中PORT配置
- 虚拟机是什么意思?有关虚拟机的知识介绍
- Phonetic symbol 清辅音 -- s
- 千万流量秒杀系统-过载保护:如何通过熔断和限流解决流量过载问题?
- HTC Desire获取ROOT方法--HTC Desire rooting guide (now with new improved / easier root method!)