mysql修改表结构大表_在线修改MySQL大表的表结构
由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段。此表在设计之时完全按照需求实现,并没有多余的保留字段。
我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通过制作原来表的一个临时副本来工作。对于表结构的修改在副本上施行,然后将新表替换原始表,此时会产生锁表,用户可以从原始表读取数据,而用户的更新和写入操作都会被lock,待新表准备好后写入新表。
这对于在线的数据量较大的表来说是绝对无法容忍的,并且由于这种在线操作时间会很长,此时如果show processlist,会发现有若干的MySQL进程处于lock状态,当这种进程太多超过单台服务器允许的MySQL进程数,其它进程可能会被拒绝连接。
有哪些方案可以处理这个问题呢?
方案1、直接ALTER TABLE
这个方案只能说这仅仅是一种方案,在某些非实时在线或数据量较小时有较好的表现。
方案2、模拟数据库修改表结构的操作,在非数据库层实现整个过程。
实现业务中对于数据的读写分离
创建一个已经按需求修改好结构的新表
修改业务逻辑,将读操作指向旧表,将写操作指向新表。如果读旧表没有,再读新表,并将旧的数据写入到新表,当然这一步写入操作我们可以不用,我们可以在后台做一个定时任务将旧数据同步到新表。
这种方案有一个较大的缺点,需要业务逻辑层配合实现数据的迁移,对于业务逻辑有修改,并且如果有多台机器的话,需要一台一台的修改,较费时间,但是对于MySQL的两种主要存储引擎都适用。
按需求创建新表
针对原始表创建触发器
对于原始表的更新操作都会被触发器更新到新表中
把原始表中的数据复制到新表中
将新表替换旧表
fb的osc方案从数据库层解决了方案2的问题,但是它仅支持InnoDB存储引擎。
方案4、换一个思路,保留字段。
假设一切可以从头再来,我们也许可以加多一些冗余字段,各个类型都加一些,备用。只是,回不去了!
方案5、再换一个思路,增加扩展表。
我们不在原有的表的基础上修改了,以增加扩展表的方式,将新字段的数据写入到扩展表中,修改业务逻辑,这些字段从新表中读取。
志强同学说这是典型的维表结构设计。
暂时解决了问题,如果这些字段后续使用频率高的话,可能会有对后期维护或业务有一定的影响。
后记
基于现有的需求,只是需要记录新的字段,所以采用了扩展表的方案。
转载【http://www.phppan.com/2012/05/online-schema-change/】
问题描述
由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段。此表在设计之时完全按照需求实现,并没有多余的保留字段。
我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通过制作原来表的一个临时副本来工作。对于表结构的修改在副本上施行,然后将新表替换原始表,此时会产生锁表,用户可以从原始表读取数据,而用户的更新和写入操作都会被lock,待新表准备好后写入新表。
这对于在线的数据量较大的表来说是绝对无法容忍的,并且由于这种在线操作时间会很长,此时如果show processlist,会发现有若干的MySQL进程处于lock状态,当这种进程太多超过单台服务器允许的MySQL进程数,其它进程可能会被拒绝连接。
有哪些方案可以处理这个问题呢?
方案1、直接ALTER TABLE
这个方案只能说这仅仅是一种方案,在某些非实时在线或数据量较小时有较好的表现。
方案2、模拟数据库修改表结构的操作,在非数据库层实现整个过程。
实现业务中对于数据的读写分离
创建一个已经按需求修改好结构的新表
修改业务逻辑,将读操作指向旧表,将写操作指向新表。如果读旧表没有,再读新表,并将旧的数据写入到新表,当然这一步写入操作我们可以不用,我们可以在后台做一个定时任务将旧数据同步到新表。
这种方案有一个较大的缺点,需要业务逻辑层配合实现数据的迁移,对于业务逻辑有修改,并且如果有多台机器的话,需要一台一台的修改,较费时间,但是对于MySQL的两种主要存储引擎都适用。
按需求创建新表
针对原始表创建触发器
对于原始表的更新操作都会被触发器更新到新表中
把原始表中的数据复制到新表中
将新表替换旧表
fb的osc方案从数据库层解决了方案2的问题,但是它仅支持InnoDB存储引擎。
方案4、换一个思路,保留字段。
假设一切可以从头再来,我们也许可以加多一些冗余字段,各个类型都加一些,备用。只是,回不去了!
方案5、再换一个思路,增加扩展表。
我们不在原有的表的基础上修改了,以增加扩展表的方式,将新字段的数据写入到扩展表中,修改业务逻辑,这些字段从新表中读取。
志强同学说这是典型的维表结构设计。
暂时解决了问题,如果这些字段后续使用频率高的话,可能会有对后期维护或业务有一定的影响。
后记
基于现有的需求,只是需要记录新的字段,所以采用了扩展表的方案。
mysql修改表结构大表_在线修改MySQL大表的表结构相关推荐
- 图片修改分辨率怎么改?一键在线修改分辨率
如果要将图片用于印刷,需要将其分辨率调整为更高的分辨率,以保持清晰度和细节,那么怎么改图片分辨率(https://www.yasuotu.com/dpi)呢?想要将图片修改分辨率可以试试这款在线修改图 ...
- mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题
本帖最后由 jan_1985 于 2014-1-15 13:28 编辑 Mysql繁忙主从库在线修改表结构与添加索引问题 一直以来,生产情况下都有修改索引和修改字段的需求,但是对锁表引起的访问不便是会 ...
- mysql怎么修改表的列名字_怎么修改mysql的表名和列名
怎么修改mysql的表名和列名 在mysql中,可以通过"ALTER TABLE 旧表名 RENAME 新表名;"语句来修改表名,通过"ALTER TABLE 表名 CH ...
- mysql怎么修改表的列名字_怎么修改mysql的表名和列名?
在mysql中,可以通过"ALTER TABLE 旧表名 RENAME 新表名;"语句来修改表名,通过"ALTER TABLE 表名 CHANGE 旧字段名/列名 新字段 ...
- mysql索引列是锁表还是锁行_[转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 做项目时由于业务逻辑的需要,必须 ...
- hive导数据到mysql 自增主键出错_面试官:MySQL表设计要注意什么?
本文公众号来源:孤独烟 作者:孤独烟 引言 这篇文章的很多问题,都是面试中实打实会问到的! 比如 OK,具体有下面这些问题 1.为什么一定要设一个主键? 2.你们主键是用自增还是UUID? 3.主键为 ...
- 怎么运用索引查处mysql表中的数据_深入理解MySQL数据库索引原理及实现,快速检索数据库 MySQL数据库使用教程...
免费学习推荐: 一.索引的概念 1.索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 (类似于C语言的链表通过指针指向数据记录的内存地址) . 2.使用索引后可以不用 ...
- mysql联表查询多记录显示_数据库:MySQL(多表的表记录的查询)(三)
一.外键约束 1.创建外键 ---每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...
- mysql 中中间表是什么意思_为什么会有这么多中间表?
中间表的由来 中间表是数据库中专门存放中间计算结果的数据表.报表系统中的中间表是普遍存在的.那么,这些中间表是如何出现的?为什么中间表会越来越多?中间表会给项目组带来什么样的困扰,如何解决这些困扰?这 ...
最新文章
- 浏览器渲染原理及可能出现的bug
- dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API...
- 一分钟学会看k线图_看K线图:阴跌如钝刀
- 2015级C++第10、11周程序阅读 继承和派生
- 最实用的logback讲解(2)—appender
- Pycharm 输出中文或打印中文乱码现象的解决办法
- kafka 怎么样连接图形化界面_从零开始搭建Kafka+SpringBoot分布式消息系统
- python 操作word docproprety_Python 的 类方法 静态方法 和 proprety
- 修改本地数据库root权限密码
- Matlab中的数据类型
- Win10 wifi、蓝牙打不开
- python连接数据库mysql失败_python连接mysql失败怎么解决
- 远程操作安卓手机——所见即所控
- Mybatis的批量插入数据库的两种方法及代码自动生成工具的使用方法
- 【虚幻】武器插槽:拾取武器
- 【转】全国各地做生意十年的心得,忍不住上来感慨一下,诚信才是根基!
- 27岁年入千万的李佳琦:以为钱很好赚,是年轻人的最大错觉
- [全程建模]关于UML与新概念名词的问题讨论
- qt找不到打印机_Qt之打印机总结
- 基于Transformer的中英文翻译