数据库无锁变更工具gh-ost的使用

运行要求

  • 数据库参数 binlog_row_image 值为FULL,变更此参数不需要重启数据库,重新连接客户端即可。
  • 数据库剩余空间大于变更表目前占用空间的一倍。
  • 被变更的表必须拥有主键或不为空的唯一索引列。
  • 交互式命令需要依赖socat,安装命令apt install -y socat

运行参数示例

bash 复制代码
#!/bin/bash

# 运行基本信息
WORK_PATH=/home/debian/gh-ost
DB_HOST="localhost"
DB_PORT=3306
DB_USER="root"
DB_PASS="root"
DB_NAME="demo"

# SQL里不要带有`字段注释使用'包裹
ALTER_SQL="alter table order_detail_0115 DROP COLUMN gh_ost,ADD COLUMN gh_ost varchar(255) NULL"

# 以下是运行参数,非必要不要修改
$WORK_PATH/gh-ost \
--max-load="Threads_running=100,Threads_connected=600" \
--critical-load="Threads_running=150,Threads_connected=800" \
--chunk-size=3000 \
--initially-drop-old-table \
--initially-drop-ghost-table \
--initially-drop-socket-file \
--ok-to-drop-table \
--allow-on-master \
--allow-master-master \
--default-retries=60 \
--host="$DB_HOST" \
--port=$DB_PORT \
--user="$DB_USER" \
--password="$DB_PASS" \
--database="$DB_NAME" \
--alter="$ALTER_SQL" \
--panic-flag-file=$WORK_PATH/panic.flag \
--postpone-cut-over-flag-file=$WORK_PATH/cut-over.flag \
--serve-socket-file=$WORK_PATH/socket.sock \
--verbose \
--execute

微软云参数

cmd 复制代码
gh-ost \
--azure \
--assume-master-host=master-server-dns-name \
--master-user="master-user-name" \
--master-password="master-password" \
--assume-rbr \
[-- other parameters you need]

阿里云参数

  • 阿里云MySQL数据库自带的有无锁变更功能,控制台提交任务即可。

交互式命令

bash 复制代码
# 查看状态
echo status | socat - ./socket.sock

# 暂停
echo throttle | socat - ./socket.sock
# 恢复
echo no-throttle | socat - ./socket.sock

#修改参数
echo chunk-size=1000 | socat - ./socket.sock

# 控制切换时机,结合运行参数postpone-cut-over-flag-file实现
rm -rf ./cut-over.flag

运行脚本封装

参考资料

相关推荐
a程序小傲3 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
007php0074 小时前
mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据
数据库·redis·git·mysql·面试·职场和发展·php
lkbhua莱克瓦245 小时前
进阶-存储过程3-存储函数
java·数据库·sql·mysql·数据库优化·视图
碎像5 小时前
10分钟搞定 MySQL 通过Binlog 数据备份和恢复
数据库·mysql
岁岁种桃花儿7 小时前
MySQL 8.0 基本数据类型全面解析
数据库·mysql·数据库开发
chuxinweihui9 小时前
MySQL数据库基础
数据库·mysql
无敌的牛9 小时前
MySQL基础
数据库·mysql
鱼跃鹰飞10 小时前
面试题:解释一下什么是全字段排序和rowid排序
数据结构·数据库·mysql
Dxy123931021610 小时前
MySQL连表查询讲解:从基础到实战
数据库·mysql
韩立学长11 小时前
【开题答辩实录分享】以《兴趣班预约管理系统的设计与实现》为例进行选题答辩实录分享
java·mysql·intellij idea