当前位置: 首页 > news >正文

网站开发销售wordpress中文版去广告

网站开发销售,wordpress中文版去广告,杭州网络排名优化,优创意设计平台先说结论:生产环境建议Alter Table语句单条执行,避免组合操作 问题描述 前两天更新脚本时,发现的alter table组合操作时的问题,两种 ALTER TABLE 操作方式会导致不同的 UPDATE 行为, 验证环境的版本MySQL 8.0.34&…

先说结论:生产环境建议Alter Table语句单条执行,避免组合操作

问题描述

前两天更新脚本时,发现的alter table组合操作时的问题,两种 ALTER TABLE 操作方式会导致不同的 UPDATE 行为, 验证环境的版本MySQL 8.0.34:

操作方式一(问题现象)

-- 单条ALTER语句执行添加列和修改列位置
ALTER TABLE `parent` 
ADD COLUMN `schoolId` INT NULL AFTER `id`,
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;-- 后续UPDATE操作会失败
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;
   错误提示:Error Code: 2013. Lost connection to MySQL server during query

(最早添加时,schoolId 按照非空字段,调查时还跑偏引出“伪空”问题: MySql添加非空字段时的“伪空”问题 )

操作方式二(正常现象)

-- 分两条ALTER语句执行
ALTER TABLE `parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;
ALTER TABLE `parent` CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;-- 后续UPDATE操作成功
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;

问题分析

根本原因

  1. 复合ALTER操作的特殊处理

    • MySQL对单条ALTER语句中的多个修改项有特殊优化路径

    • 在8.0某些版本中,这种组合操作可能导致表元数据处于中间状态

  2. InnoDB存储引擎行为

    • 添加NULL列本应是"即时操作"(只修改元数据)

    • 但结合列位置修改会强制表重建

    • 重建过程中可能产生不一致的内部状态

  3. DDL原子性实现差异

    • 单条复合ALTER在内部可能不是真正的原子操作

    • 分步执行确保每个操作完全完成

解决方案

推荐方案(生产环境最佳实践)

-- 步骤1:仅添加列(可空)
ALTER TABLE `parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;-- 步骤2:更新数据(确保所有记录有值)
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;-- 步骤3:调整列位置(此时数据已完整)
ALTER TABLE `parent` 
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;

方案优势

  1. 可靠性:完全避免中间状态问题

  2. 兼容性:适用于所有MySQL版本

  3. 可维护性:清晰的执行步骤便于问题排查

  4. 性能可控:每个操作都有明确的完成点

技术验证方案

复现测试脚本

-- 创建测试表
CREATE TABLE `test_parent` (`id` INT NOT NULL AUTO_INCREMENT,`studentId` INT NULL,PRIMARY KEY (`id`)
);CREATE TABLE `test_student` (`id` INT NOT NULL AUTO_INCREMENT,`schoolId` INT NULL,PRIMARY KEY (`id`)
);-- 失败案例复现
ALTER TABLE `test_parent` 
ADD COLUMN `schoolId` INT NULL AFTER `id`,
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;UPDATE test_parent p
INNER JOIN test_student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;-- 成功案例对比
ALTER TABLE `test_parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;
ALTER TABLE `test_parent` CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;UPDATE test_parent p
INNER JOIN test_student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;

各版本行为差异

MySQL 版本复合 ALTER 行为推荐方案
5.7 及以下强制表重建分步执行
8.0.12-19可能产生中间状态分步执行
8.0.20+行为改善但仍建议分步可尝试复合

生产环境建议

  1. 通用原则

    • 将结构变更与数据变更分离执行

    • 每个ALTER语句只执行一个变更目的

    • 数据填充完成后再调整列位置

  2. 大表操作建议

    # 使用专业工具处理
    pt-online-schema-change --alter "ADD COLUMN schoolId INT NULL" D=db,t=parent
     
  3. 变更检查清单

    • 执行前备份数据

    • 在测试环境验证变更脚本

    • 检查表当前状态:SHOW CREATE TABLE parent

    • 监控执行进度:SHOW PROCESSLIST

结论

通过将复合ALTER TABLE操作拆分为分步执行,可以完全避免因MySQL内部状态不一致导致的UPDATE操作失败问题。这种方案具有更好的可靠性和可维护性,建议生产环境使用分布执行。

http://www.dtcms.com/a/525183.html

相关文章:

  • 诡异的Mysql连接中断导致的事务‘失联‘
  • STM32项目分享:校园绿色照明智能控制系统
  • 共享经济型网站开发湖北省节能建设网站
  • 免费在线网站建设敦化建设局网站
  • oracle数据泵数据库自动备份脚本
  • 数据库运维查询SQL语句集合
  • 家具在线设计网站网上最好购物网站
  • 青岛房地产团购网站建设佛山网站建设网站建设收费
  • Pytest+requests进行接口自动化测试9.0(redis + excal文件的使用)
  • Python+Selenium+Pytest+POM自动化测试框架封装详解
  • 大模型-模型压缩:量化、剪枝、蒸馏、二值化 (1)
  • 高中男女做那个视频网站挂机软件定制
  • 怎么查看一个网站的浏览量自豪地采用wordpress
  • 微网站建设哪里便宜wordpress仿wiki
  • 计算机网络设计:从基础到原则的体系化指南
  • 在安阳想建个网站怎么做经典的网站设计工具
  • 生物油分离及分离产物结构性质与表征
  • Android开发教程之Java入口方法介绍 Java打印 Java注释 Java变量 常量申明 变量命名规则
  • 一个新的面向东亚地区的高精度天气模拟的基准算例已开源发布
  • 宁波易通建设网站网站个人备案百度推官
  • P1928 外星密码(dfs)
  • 什么网站是最全的南通哪里做网站
  • 快速排序代码实现详解
  • 社会工程学全解析:从原理到实战
  • 基于LSTM的多变量时间序列预测创新路径
  • gofair做网站seo规范培训
  • 网站做充值和提现优化企业网站标题
  • 【 RocketMQ 全解析】分布式消息队列的架构、消息转发与快速实践、事务消息
  • k8s上配置canal用的zookeeper为什么需要用两个service?
  • 基于Springboot + vue3实现的房屋买卖平台