Mysql在线安全变更工具 gh-ost

2024-09-06 13:36

本文主要是介绍Mysql在线安全变更工具 gh-ost,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gh-ost(GitHub Online Schema Translater)是一个用于安全地进行 MySQL 数据库表结构变更的工具,专门为在线数据库迁移而设计。它的主要优点是可以在不中断业务的情况下,不影响数据库的可用性和性能,进行表结构的修改。

主要特点

  1. 在线迁移gh-ost 允许在高负载的生产环境中进行表结构的更改,而不需要锁定表,确保数据库的可用性。

  2. 渐进式复制:通过逐步复制行,gh-ost 可以在针对大量数据的情况下,避免短时间内的负载高峰。

  3. 安全性:它具备自动回滚功能,如果迁移过程中出现问题,可以安全地回滚到原始状态。

  4. 编程和操作简便:工具使用简单、直观,与 MySQL 客户端兼容,支持使用 SQL 语句进行表结构的更改。

  5. 多种配置选项:支持多种选项用于配置操作,例如并行迁移、最大移动速度等。

使用场景

  • 发布新字段:添加新的列而不影响应用的访问。
  • 修改现有字段类型:安全地改变列的数据类型,比如从 VARCHARTEXT
  • 重命名列:而不影响运行中的系统。

基本用法

  1. 安装:可以通过 github 下载可执行文件,或使用 Homebrew(在 macOS 上)进行安装。

    brew install gh-ost
    
  2. 基本命令
    以下是一个使用 gh-ost 进行表结构变更的基本示例:

    gh-ost \
    --max-load=Threads_running=25 \
    --critical-load=Threads_running=1000 \
    --host=127.0.0.1 \
    --user=username \
    --password=your_password \
    --database=your_database \
    --table=your_table \
    --alter="ADD COLUMN new_col INT DEFAULT 0" \
    --execute
    

    这个命令将向 your_table 表中添加一个名为 new_col 的新列,字段类型为 INT,默认值为 0。

配置选项

  • --max-load:指定允许的最大负载。
  • --critical-load:指定触发回滚的负载。
  • --host--user--password:数据库连接信息。
  • --database--table:要修改的数据库和表名。
  • --alter:指定 ALTER 语句。
  • --execute:表示执行迁移;如果不加这个选项,则只进行干运行(dry run),不实际执行。

gh-ost 数据迁移流程

1. 准备与初始化
  • 安装与配置:确保你的 MySQL 数据库已启用二进制日志(binlog),并安装 gh-ost 工具。
  • 参数设置:使用合适的参数启动 gh-ost,包括连接信息、要迁移的表、变更语句等。
2. 创建临时表
  • 临时表的结构gh-ost 首先会创建一个新的临时表,并按照你的 ALTER 语句的定义,将原有表的结构复制到临时表中
  • 开始复制数据:临时表一旦创建,gh-ost 即可开始将原始表中的现有数据逐行复制到临时表中。
3. 数据复制与变更监控
  • 逐行复制gh-ost 以增量的方式逐行将原始表的数据复制到临时表,这个复制过程是渐进的,确保了对数据库的负载最低。

  • 使用事务隔离:在数据复制的过程中,gh-ost 使用 REPEATABLE READ 事务隔离级别。这意味着在数据复制期间,原始表的读取是一个快照,不会受到其他事务的影响。

  • 监控二进制日志(binlog)

    • 同时,gh-ost 启动一个线程,实时监控 MySQL 的 binlog,捕获所有对原始表的变更(包括 INSERT、UPDATE、DELETE)。
    • 这允许 gh-ost 捕获到在数据复制过程中对原始表的任何更新。
4. 实时同步变更
  • 处理变更

    • 任何在数据复制过程中对原始表的变更(例如:INSERT 或 UPDATE)都会被 gh-ost 监控到并记录在 binlog 中。
    • gh-ost 会将这些变化实时应用到临时表中(不会等到复制完成后,再处理变更数据),确保临时表里的数据与原始表保持同步。
  • 最终更新操作

    • 对于原始表的更新操作,如果在复制到某一行时,该行数据已经被修改,gh-ost 将依赖于二进制日志来更新临时表,以阻止出现数据不一致的情况。
5. 表切换
  • 完成复制与更新

    • 一旦所有的数据都已复制,并且所有的二进制日志变更均已同步到临时表,gh-ost 将进行最后的检查。
  • 原子重命名

    • gh-ost 进行原子操作,将原始表重命名为备份名称(例如:your_table_old),然后将临时表重命名为原始表的名称(例如:your_table)。
    • 这一过程确保在任何时刻,数据库中的数据都是一致的,并且整个迁移操作对外界是透明的。
6. 清理与回滚
  • 删除旧表:如果配置允许,gh-ost 可以安全删除旧表,以释放资源。
  • 回滚机制
    • 如果在迁移过程中发生错误,gh-ost 会提供回滚功能,能够安全地将数据库恢复到原始状态,从而确保错误不会影响数据库的运作和数据的完整性。

总结

gh-ost 通过以上步骤实现了在线、安全、逐渐的 MySQL 数据迁移。其设计保证了在整个过程中,数据的一致性和准确性,以及对生产系统的影响最小。利用事务隔离和二进制日志捕获gh-ost 确保所有变更都在迁移过程中得以有效处理,最终实现平滑的表结构更新。

这篇关于Mysql在线安全变更工具 gh-ost的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142148

相关文章

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.