Mysql在线安全变更工具 gh-ost
gh-ost
(GitHub Online Schema Translater)是一个用于安全地进行 MySQL 数据库表结构变更的工具,专门为在线数据库迁移而设计。它的主要优点是可以在不中断业务的情况下,不影响数据库的可用性和性能,进行表结构的修改。
主要特点
-
在线迁移:
gh-ost
允许在高负载的生产环境中进行表结构的更改,而不需要锁定表,确保数据库的可用性。 -
渐进式复制:通过逐步复制行,
gh-ost
可以在针对大量数据的情况下,避免短时间内的负载高峰。 -
安全性:它具备自动回滚功能,如果迁移过程中出现问题,可以安全地回滚到原始状态。
-
编程和操作简便:工具使用简单、直观,与 MySQL 客户端兼容,支持使用 SQL 语句进行表结构的更改。
-
多种配置选项:支持多种选项用于配置操作,例如并行迁移、最大移动速度等。
使用场景
- 发布新字段:添加新的列而不影响应用的访问。
- 修改现有字段类型:安全地改变列的数据类型,比如从
VARCHAR
到TEXT
。 - 重命名列:而不影响运行中的系统。
基本用法
-
安装:可以通过
github
下载可执行文件,或使用Homebrew
(在 macOS 上)进行安装。brew install gh-ost
-
基本命令:
以下是一个使用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
会将这些变化实时应用到临时表中(不会等到复制完成后,再处理变更数据),确保临时表里的数据与原始表保持同步。
- 任何在数据复制过程中对原始表的变更(例如:INSERT 或 UPDATE)都会被
-
最终更新操作:
- 对于原始表的更新操作,如果在复制到某一行时,该行数据已经被修改,
gh-ost
将依赖于二进制日志来更新临时表,以阻止出现数据不一致的情况。
- 对于原始表的更新操作,如果在复制到某一行时,该行数据已经被修改,
5. 表切换
-
完成复制与更新:
- 一旦所有的数据都已复制,并且所有的二进制日志变更均已同步到临时表,
gh-ost
将进行最后的检查。
- 一旦所有的数据都已复制,并且所有的二进制日志变更均已同步到临时表,
-
原子重命名:
gh-ost
进行原子操作,将原始表重命名为备份名称(例如:your_table_old
),然后将临时表重命名为原始表的名称(例如:your_table
)。- 这一过程确保在任何时刻,数据库中的数据都是一致的,并且整个迁移操作对外界是透明的。
6. 清理与回滚
- 删除旧表:如果配置允许,
gh-ost
可以安全删除旧表,以释放资源。 - 回滚机制:
- 如果在迁移过程中发生错误,
gh-ost
会提供回滚功能,能够安全地将数据库恢复到原始状态,从而确保错误不会影响数据库的运作和数据的完整性。
- 如果在迁移过程中发生错误,
总结
gh-ost
通过以上步骤实现了在线、安全、逐渐的 MySQL 数据迁移。其设计保证了在整个过程中,数据的一致性和准确性,以及对生产系统的影响最小。利用事务隔离和二进制日志捕获,gh-ost
确保所有变更都在迁移过程中得以有效处理,最终实现平滑的表结构更新。