gh-ost概述(二实践)

注意:只适用于拥有主键或者唯一键的表,不存在触发器的表
一、gh-ost的安装部署
0、yum -y install golang
1、进入官网GitHub - github/gh-ost: GitHub’s Online Schema-migration Tool for MySQL
2、下载gh-ost-master.zip包
3、解压unzip gh-ost-master.zip
4、cd gh-ost-master
5、./build.sh 命令执行后,默认将安装包存放在/tmp/gh-ost-release下
6、cp /tmp/gh-ost-release/gh-ost-binary-linux-amd64-20230809165421.tar.gz /soft
7、cd /soft
8、tar -zxvf gh-ost-binary-linux-amd64-20230809165421.tar.gz 最终在当前目录下解压出gh-ost的命令文件
二、gh-ost在master/master-master上的应用
会在主库上使用ghost的命令。
1、增加列

./gh-ost --max-load=Threads_running=10 \
--critical-load=Threads_running=95 \
--chunk-size=1000 \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="数据库主机IP" \
--port=3307 \
--user="user" \
--password="passwd" \
--assume-rbr \
--allow-on-master \
--assume-master-host=主库IP:端口 \
--database="数据库名" \
--table="表名" \
--panic-flag-file=/tmp/ghost.panic.flag
--alter="add column c6 varchar(50) not null default ''"   \
--serve-socket-file=/tmp/ghost.sock --verbose --execute 

解释:

2、增加索引

./gh-ost --max-load=Threads_running=10 \
--critical-load=Threads_running=95 \
--chunk-size=100 \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="数据库主机IP" \
--port=3307 \
--user="user" \
--password="passwd" \
--assume-rbr \
--allow-on-master \
--assume-master-host=主库IP:端口 \
--database="数据库名" \
--table="表名" \
--alter="add index index_(id,createTime)"   \
--serve-socket-file=/tmp/ghost.sock --verbose --execute 

3、修改列名和类型
因为不区分大小写,fontSize的字段名,还是原样,类型发生了变化

./gh-ost --max-load=Threads_running=10 \
--critical-load=Threads_running=95 \
--chunk-size=100 \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="数据库主机IP" \
--port=3307 \
--user="user" \
--password="passwd" \
--assume-rbr \
--allow-on-master \
--assume-master-host=主库IP:端口 \
--database="数据库名" \
--table="表名" \
--alter="change fontSize fontSize bigint"   \
--serve-socket-file=/tmp/ghost.sock --verbose --execute

4、删除列

./gh-ost --max-load=Threads_running=10 \
--critical-load=Threads_running=95 \
--chunk-size=100 \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="数据库主机" \
--port=3307 \
--user="user" \
--password="passwd" \
--assume-rbr \
--allow-on-master \
--assume-master-host=数据库主库IP:端口 \
--database="数据库名" \
--table="表名" \
--alter="drop repetition"   \
--serve-socket-file=/tmp/ghost.sock --verbose --execute

三、gh-ost在master-slave上的应用
会在slave库上运行ghost命令
1、删除列

./gh-ost --max-load=Threads_running=10 \
--critical-load=Threads_running=95 \
--chunk-size=100 \
--initially-drop-socket-file \
--ok-to-drop-table \
--host="slave数据库主机IP" \
--port=3307 \
--user="user" \
--password="passwd" \
--database="数据库" \
--table="表名" \
--alter="drop bookCode"   \
--serve-socket-file=/tmp/ghost.sock --verbose --execute

四、其它补充
1、gh-ost 中 Mysql参数的影响
innodb_autoinc_lock_mode=0 传统模式
innodb_autoinc_lock_mode=1 不会因为row lock 和 auto-inc锁产生死锁问题
innodb_autoinc_lock_mode=2 间隙模式
当innodb_autoinc_lock_mode设置为1时,表示使用连续模式(consecutive mode)来锁定自增列。在这种模式下,InnoDB会锁住整个自增列范围,以确保在插入新记录时不会发生重复值。
具体来说,在连续模式下,当插入新数据时,InnoDB会获取一个全局的互斥锁(auto-inc lock),然后分配下一个可用的自增值。这样可以保证在多个并发插入操作中,每个插入的自增值都是唯一且递增的。
需要注意的是,使用连续模式可能会导致并发插入操作的性能瓶颈,因为每次插入都需要获取全局锁。如果您的应用程序有高并发的写入需求,您可以考虑将innodb_autoinc_lock_mode设置为2(间隙模式)或0(传统模式),以提高并发性能。
总之,innodb_autoinc_lock_mode=1表示InnoDB引擎将使用连续模式来锁定自增列,确保生成唯一且递增的自增值,但可能对并发性能有一定的影响。

2、gh-ost与其它方式的DDL同时作用一张表
在gh-ost的对某表执行ddl期间,不可采用其它方式对表进行DDL,因为其它的DDL操作将不会生效。

3、gh-ost DDL的另类等待
存在大量写的事务时,不可执行gh-ost。因为不采取其它方式干预的情形下,gh-ost会一直等待,等待事务的完成。原因是gh-ost的binlog应用优先于row copy,且apply binlog是单线程,导致row copy数不发生变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值