注意:只适用于拥有主键或者唯一键的表,不存在触发器的表
一、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数不发生变化。