由 Percona、GitHub 公司开发的一种在线修改表结构的工具,它允许您在不中断应用程序正常运行的情况下修改表结构,同时保持数据一致性。可以对大型数据库表进行诸如添加、删除或修改索引、更改列类型等操作,而无需锁定整个表。这有助于减少应用程序的停机时间,提高数据库的可用性 。
gh-ost工作原理
- 先连接到主库上,根据alter语句创建所需的新表;
- 作为一个“备库”连接到其中一个真正的备库上,一边在主库上拷贝已有的数据到新表,一边从备库上拉取增量数据的binlog;
- 然后不断的把 binlog 应用回主库;
- cut-over是最后一步,锁住主库的源表,等待binlog 应用完毕,然后替换gh-ost表为源表。
pt-osc工作原理
-
检查更改表是否有主键或唯一索引,是否有触发器 检查修改表的表结构,创建一个临时表,在新表上执行ALTER TABLE语句
-
在源表上创建三个触发器分别对于INSERT UPDATE DELETE操作
-
从源表拷贝数据到临时表,在拷贝过程中,对源表的更新操作会写入到新建表中 将临时表和源表rename(需要元数据修改锁,需要短时间锁表)
-
删除源表和触发器,完成表结构的修改
pt-osc优缺点
- 不可暂停
- 交换表名的时候会有短时间的表不存在报错
- 要在表上建触发器,是侵入式的,可能产生未知问题
gh-ost优缺点
- 可暂停
- 可动态修改参数
- 对于DDL操作的灵活度掌控
- gh-ost 已经与master 节点工作负载解耦
- 更为稳健的切表控制:将-cut-over-lock-timeout-seconds和-default-retries
配合使用,可以对切表进行灵活的控制。
pt-osc参数配置
[osc]
osc_print_none = false
osc_print_sql = false
osc_on = true
osc_min_table_size = 300
osc_alter_foreign_keys_method = "none"
osc_recursion_method = "processlist"
osc_max_lag = 600
osc_max_flow_ctl = -1
osc_sleep = 0.1
osc_lock_wait_timeout = 60
osc_check_alter = true
osc_check_replication_filters = true
osc_check_unique_key_change = true
osc_drop_old_table = true
osc_drop_new_table = true
osc_max_thread_running = 80
osc_max_thread_connected = 1000
osc_critical_thread_running = 80
osc_critical_thread_connected = 1000
osc_chunk_time = 1.0
osc_chunk_size_limit