北京做网站的工作室wordpress页面显示返回json
2025/12/29 0:10:16 网站建设 项目流程
北京做网站的工作室,wordpress页面显示返回json,兰州seo技术优化排名公司,盐城微网站建设前言 线上千万级的大表在新增字段的时候#xff0c;一定要小心#xff0c;我见过太多团队在千万级大表上执行DDL时翻车的案例。 很容易影响到正常用户的使用。 本文将深入剖析大表加字段的核心难点#xff0c;并给出可落地的解决方案。 希望对你会有所帮助。 1.为什么大…前言线上千万级的大表在新增字段的时候一定要小心我见过太多团队在千万级大表上执行DDL时翻车的案例。很容易影响到正常用户的使用。本文将深入剖析大表加字段的核心难点并给出可落地的解决方案。希望对你会有所帮助。1.为什么大表加字段如此危险核心问题MySQL的DDL操作会锁表。当执行ALTER TABLE ADD COLUMN时MySQL 5.6之前全程锁表阻塞所有读写MySQL 5.6仅支持部分操作的Online DDL通过实验验证锁表现象-- 会话1执行DDL操作 ALTER TABLE user ADD COLUMN age INT; -- 会话2尝试查询被阻塞 SELECT * FROM user WHERE id1; -- 等待DDL完成锁表时间计算公式锁表时间 ≈ 表数据量 / 磁盘IO速度对于1000万行、单行1KB的表机械磁盘100MB/s需要100秒的不可用时间如果在一个高并发的系统中这个问题简直无法忍受。那么我们要如何解决问题呢2.原生Online DDL方案在MySQL 5.6版本中可以使用原生Online DDL的语法。例如ALTER TABLE user ADD COLUMN age INT, ALGORITHMINPLACE, LOCKNONE;实现原理致命缺陷仍可能触发表锁如添加全文索引磁盘空间需双倍实测500GB表需要1TB空闲空间主从延迟风险从库单线程回放3.停机维护方案适用场景允许停服时间如凌晨3点数据量小于100GB减少导入时间有完整回滚预案4.使用PT-OSC工具方案Percona Toolkit的pt-online-schema-change这个是我比较推荐的工具。工作原理操作步骤# 安装工具 sudo yum install percona-toolkit # 执行迁移添加age字段 pt-online-schema-change \ --alter ADD COLUMN age INT \ Dtest,tuser \ --execute5.逻辑迁移 双写方案还有一个金融级安全的方案是逻辑迁移 双写方案。适用场景字段变更伴随业务逻辑修改如字段类型变更要求零数据丢失的金融场景超10亿行数据的表实施步骤1. 创建新表结构-- 创建包含新字段的副本表 CREATE TABLE user_new ( id BIGINT PRIMARY KEY, name VARCHAR(50), -- 新增字段 age INT DEFAULT 0, -- 增加原表索引 KEY idx_name(name) ) ENGINEInnoDB;2. 双写逻辑实现Java示例// 数据写入服务 public class UserService { Transactional public void addUser(User user) { // 写入原表 userOldDAO.insert(user); // 写入新表包含age字段 userNewDAO.insert(convertToNew(user)); } private UserNew convertToNew(User old) { UserNew userNew new UserNew(); userNew.setId(old.getId()); userNew.setName(old.getName()); // 新字段处理从其他系统获取或默认值 userNew.setAge(getAgeFromCache(old.getId())); return userNew; } }3. 数据迁移分批处理-- 分批迁移脚本 SET start_id 0; WHILE EXISTS(SELECT 1 FROM user WHERE id start_id) DO INSERT INTO user_new (id, name, age) SELECT id, name, COALESCE(age_cache, 0) -- 从缓存获取默认值 FROM user WHERE id start_id ORDER BY id LIMIT 10000; SET start_id (SELECT MAX(id) FROM user_new); COMMIT; -- 暂停100ms避免IO过载 SELECT SLEEP(0.1); END WHILE;4. 灰度切换流程这套方案适合10亿上的表新增字段不过操作起来比较麻烦改动有点大。6.使用gh-ost方案gh-ostGitHubs Online Schema Transmogrifier是GitHub开源的一种无触发器的MySQL在线表结构变更方案。专为解决大表DDL如新增字段、索引变更、表引擎转换时锁表阻塞、主库负载高等问题而设计。其核心是通过异步解析binlog替代触发器同步增量数据显著降低对线上业务的影响。与传统方案对比触发器方案如pt-osc在源表上创建INSERT/UPDATE/DELETE触发器在同一事务内将变更同步到影子表。痛点触发器加重主库CPU和锁竞争高并发时性能下降30%以上无法暂停失败需重头开始外键约束支持复杂gh-ost方案伪装为从库直连主库或从库拉取ROW格式的binlog解析DML事件INSERT/UPDATE/DELETE异步应用将增量数据通过独立连接应用到影子表如REPLACE INTO处理INSERT事件与主库事务解耦优先级控制binlog应用优先级 全量数据拷贝确保数据强一致关键流程全量拷贝按主键分块chunk-size控制执行INSERT IGNORE INTO _table_gho SELECT ...避免重复插入增量同步INSERT →REPLACE INTOUPDATE → 全行覆盖更新DELETE →DELETE原子切换Cut-over短暂锁源表毫秒级执行原子RENAMERENAME TABLE source TO _source_del, _source_gho TO source清理旧表_source_del典型命令示例gh-ost \ --alterADD COLUMN age INT NOT NULL DEFAULT 0 COMMENT 用户年龄 \ --host主库IP --port3306 --usergh_user --passwordxxx \ --databasetest --tableuser \ --chunk-size2000 \ # 增大批次减少事务数 --max-loadThreads_running80 \ --critical-loadThreads_running200 \ --cut-over-lock-timeout-seconds5 \ # 超时重试 --execute \ # 实际执行 --allow-on-master # 直连主库模式2. 监控与优化建议进度跟踪echo status | nc -U /tmp/gh-ost.sock # 查看实时进度延迟控制设置--max-lag-millis1500超阈值自动暂停从库延迟过高时切换为直连主库模式切换安全使用--postpone-cut-over-flag-file人工控制切换时机7.分区表滑动窗口方案适用场景按时间分区的日志型大表需要频繁变更结构的监控表核心原理通过分区表特性仅修改最新分区结构。操作步骤修改分区定义-- 原分区表定义 CREATE TABLE logs ( id BIGINT, log_time DATETIME, content TEXT ) PARTITION BY RANGE (TO_DAYS(log_time)) ( PARTITION p202301 VALUES LESS THAN (TO_DAYS(2023-02-01)), PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01)) ); -- 添加新字段仅影响新分区 ALTER TABLE logs ADD COLUMN log_level VARCHAR(10) DEFAULT INFO;创建新分区自动应用新结构-- 创建包含新字段的分区 ALTER TABLE logs REORGANIZE PARTITION p202302 INTO ( PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01)), PARTITION p202303 VALUES LESS THAN (TO_DAYS(2023-04-01)) );历史数据处理-- 仅对最近分区做数据初始化 UPDATE logs PARTITION (p202302) SET log_level parse_log_level(content);8.千万级表操作注意事项主键必须存在无主键将全表扫描磁盘空间监控至少预留1.5倍表空间复制延迟控制SHOW SLAVE STATUS; -- 确保Seconds_Behind_Master 104.灰度验证步骤先在从库执行检查数据一致性低峰期切主库5.字段属性选择避免NOT NULL导致全表更新优先使用ENUM代替VARCHAR默认值用NULL而非空字符串9.各方案对比以下是针对千万级MySQL表新增字段的6种方案的对比。总结1.常规场景1亿行首选Online DDLALGORITHMINSTANTMySQL 8.0秒级加字段备选PT-OSC兼容低版本MySQL2.高并发大表1亿行必选gh-ost无触发器设计对写入影响5%3.金融核心表双写方案是唯一选择需2-4周开发周期4.日志型表分区滑动窗口最优仅影响新分区5.紧急故障处理超百亿级表异常时考虑停机维护 回滚预案给大家一些建议加字段前优先使用JSON字段预扩展ALTER TABLE user ADD COLUMN metadata JSON万亿级表建议分库分表而非直接DDL所有方案执行前必须全量备份mysqldump binlog流量监测PrometheusGranfa实时监控QPS在千万级系统的战场上一次草率的ALTER操作可能就是压垮骆驼的最后一根稻草。文章转载自苏三说技术原文链接https://www.cnblogs.com/12lisu/p/19362799体验地址http://www.jnpfsoft.com/?from001YH

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询