在MySQL 5.7中如何安全在线修改大表DDL结构

夜杰同学_9059

夜杰同学_9059

2026-09-19

840人浏览

原创

mysql 5.7真正无锁的alter操作仅限:add column(null且带默认值)、add/drop index(非fulltext首次)、rename column(≥5.7.6);其余大表变更必须用pt-online-schema-change。

在mysql 5.7中如何安全在线修改大表ddl结构

MySQL 5.7 原生 ALTER TABLE 对大表几乎必然触发全表拷贝或长时元数据锁,不能直接用于生产大表变更;真正安全的方案只有两个:能用 ALGORITHM=INPLACE, LOCK=NONE 的极少数操作(如加 NULL 列、增索引),其余一律走 pt-online-schema-change(pt-osc)。

哪些 ALTER 操作在 5.7 真正无锁?

别信“Online DDL”字面意思——5.7 中只有特定组合才实际不锁表。关键看执行后是否出现 Waiting for table metadata lockCopying to tmp table

  • ADD COLUMN 带默认值且允许为 NULL:可 INPLACE, LOCK=NONE,例如 ALTER TABLE t ADD COLUMN remark TEXT DEFAULT ''
  • ADD COLUMN 声明 NOT NULL 但没给默认值:强制降级为 COPY,报错 ERROR 1846 (HY000): ALGORITHM=INPLACE is not supported
  • ADD INDEX / DROP INDEX:全部支持 INPLACE,DML 并发无压力,但首次建 FULLTEXT 索引仍可能卡写
  • MODIFY COLUMN 增大 VARCHAR 长度(如 VARCHAR(50) → VARCHAR(100)):仅当字符集字节不变(≤255 或 ≥256)时才安全;改类型(INT → BIGINT)大概率重建
  • DROP COLUMNCHANGE COLUMNRENAME COLUMN(5.7.6+):前两者必重建;后者是元数据操作,可 LOCK=NONE,但需确认小版本 ≥ 5.7.6

为什么 pt-online-schema-change 是 5.7 大表变更的事实标准?

因为 MySQL 5.7 的 INPLACE 支持太窄,而 pt-osc 绕过了引擎层限制,靠影子表 + 触发器 + 分块同步实现业务零感知。但它不是“免检”,漏掉任一前提就会失败或丢数据:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 原表必须有主键或唯一非空索引,否则报错:Cannot chunk table `db`.`t`: no primary key or unique not-null index
  • 表上不能已有触发器,否则提示:Triggers exist on the table
  • 操作用户必须显式拥有 TRIGGERREPLICATION SLAVEPROCESS 权限(仅 SELECT/INSERT/UPDATE/DELETE 不够)
  • binlog_format 必须为 ROW,否则触发器无法捕获变更;若当前是 MIXEDSTATEMENT,需提前全局修改
  • 若表被外键引用,必须加 --alter-foreign-keys-method=auto,否则 RENAME 阶段失败

执行 pt-osc 时最容易踩的五个坑

很多翻车不是命令写错,而是环境没控住、收尾没清干净:

  • 磁盘空间不足:影子表 + 原表临时索引 + binlog 日志可能导致磁盘使用翻倍,执行前确保 tmpdir 和数据目录剩余空间 ≥ 原表大小 × 1.5
  • 从库延迟超标:pt-osc 默认等待从库追平才切换,若 Seconds_Behind_Master > 1 又没设 --max-lag,会无限卡住
  • 异常中断后残留触发器:如 pt_osc_db_t1_delpt_osc_db_t1_ins,必须手动清理:DROP TRIGGER IF EXISTS pt_osc_db_t1_del(把 dbt1 替成实际值)
  • --chunk-time=0.5--chunk-size 更可控:前者让工具动态调整每次拷贝行数以维持 0.3–0.5 秒耗时;后者固定行数,在负载波动时易打爆 IO
  • 替换完成后只查 COUNT(*) 不可靠:触发器同步有毫秒级延迟,必须用 pt-table-checksum 校验数据一致性

生产执行前必须做的三件事

跳过任何一项,等于把风险直接交给线上:

  • 先在从库或影子环境跑一次完整命令加 --dry-run,验证语法、权限、触发器创建是否成功,不拷数据也不启同步
  • 执行前查 performance_schema.metadata_locks,确认无长事务阻塞:SELECT * FROM performance_schema.metadata_locks WHERE OBJECT_NAME = 'your_table';
  • 高峰期禁用:即使参数调得再稳,pt-osc 也会明显拉升 CPU、IO 和网络压力;建议安排在业务低谷,且全程盯 SHOW PROCESSLISTThreads_running

最麻烦的不是命令怎么写,而是判断该不该用 pt-osc —— 如果表没主键、有外键又不敢动从库、或者磁盘只剩 20%,那就得先解决这些前置问题,而不是硬上 --execute

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1893

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1159

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

675

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2432

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

3948

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

959

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4231

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

3862

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

4934

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 168人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 267人学习