几千万记录,数据库表结构如何平滑变更?

news2024/9/20 20:48:29

27d87bcdaa0afe8930ac3919689b4b89.png

回答知识星球水友“逆光下的微笑”提问。

问题域:数据量大、并发量高场景,如何在流量低峰期,平滑实施表结构变更?

画外音,一般来说,是指增加表的属性,因为:
(1)如果是减column,升级程序不使用即可;
(2)如果是修改column,程序兼容性容易出问题;


首先,一起看下有哪些常见方案。

方案一:在线修改表结构。
画外音:alter table add column

数据量大的情况下,锁表时间会较长,造成拒绝服务,一般不可行。

方案二:通过增加表的方式扩展属性,通过外键join来查询。

举个例子,对:
t_user(uid, c1, c2, c3)
想要扩展属性,可以通过增加一个表实现:
t_user_ex(uid, c4, c5, c6)

数据量大的情况下,join性能较差,一般不可行。

方案三,通过增加表的方式扩展,通过视图来屏蔽底层复杂性。

同上,视图效率较低,一般不使用视图。

方案四,揍产品经理,阻止她修改需求。

...

方案五,提前预留一些reserved字段,加列可复用这些字段。

这个方案可行,但如果预留过多,会造成空间浪费。


方案六,pt-online-schema-change

对于MySQL而言,这是目前比较成熟的方案,被广大公司所使用。
画外音:我呆过的互联网公司,数据库均使用MySQL。

下面仍以用户表扩展为例,说下这个工具内部的原理与步骤。

假设:

user(uid, name, passwd)

要扩展到:
user(uid, name, passwd, age, sex)

第一步,先创建一个扩充字段后的新表:

user_new(uid, name, passwd, age, sex)

画外音:就是被扩展后的表。


第二步,在原表user上创建三个触发器,对原表user进行的所有insert/delete/update操作,都会对新表user_new进行相同的操作;

第三步,分批将原表user中的数据insert到新表user_new,直至数据迁移完成;


第四步,删掉触发器,把原表移走(默认是drop掉);

第五步,把新表user_new重命名(rename)成原表user;


扩充字段完成,整个过程不需要锁表,可以持续对外提供服务。

操作过程中需要注意:

(1)变更过程中,最重要的是冲突的处理,一条原则,以触发器的新数据为准,这就要求被迁移的表必须有主键(这个要求基本都满足);

(2)变更过程中,写操作需要建立触发器,所以如果原表已经有很多触发器,方案就不行(互联网大数据高并发的在线业务,一般都禁止使用触发器);
(3)触发器的建立,会影响原表的性能,所以这个操作必须在流量低峰期进行;

pt-online-schema-change是DBA必备的利器,比较成熟,在互联网公司使用广泛,要了解更详细的细节,亦可以Google一下。

任何脱离业务的架构设计都是耍流氓。

e1ab001e30ce04fd24653cb6eb4e28a9.jpeg

扫码免费加入,还有170个名额

欢迎大家继续提问。

调研:贵司是如何扩展表结构的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你,本地RabbitMQ服务搭建(windows)

本地RabbitMQ服务搭建(windows) 前言一、Erlang 环境准备1. 下载安装包2. 安装 二、RabbitMQ服务器安装1. 下载安装包2. 安装RabbitMQ server3. 启动RabbitMQ4. 启动状态检测5. 管理插件启用 三、登录管理界面 前言 前面已经对RabbitMQ介绍了很多内容&a…

Excel怎样对比两列数据的异同

很多用户在使用Excel的时候会碰到一种情况就是将两列数据进行对比,如果数据少则很好用肉眼去对比吗,但是数据一多则就麻烦咯,那么下面小编就来教教大家如何快速对比两列数据的异同。 一:适用于对比不同文字的异同; 首先…

提升测试开发工程师工作效率的法宝:ELK日志平台

目录 前言: 1.什么是ELK 2.如何构建ELK通道 3.使用ELK的思考 前言: ELK日志平台是一个非常有用的工具,可以大大提高测试开发工程师的工作效率。ELK是指Elasticsearch、Logstash和Kibana,这三个开源工具的结合构成了一个功能强…

利用阿里云物联网平台(IoT)实现WEB数据可视化

一年前在阿里物联网平台测试过一个项目,后来就搁置了,昨天有事需要用,发现出错了。 调整完后写一下使用思路,以便未来之需。 阿里云物联网(IoT)主页:https://iot.aliyun.com/ 阿里云物联网&…

JavaScript中数组高阶函数的使用

一.数组高阶函数---forEach 它可以用来遍历数组中的每个元素,并对每个元素执行指定的操作。forEach函数接受一个回调函数作为参数,该回调函数在遍历数组的每个元素时被调用。 forEach函数的基本语法 array.forEach(callback(currentValue, index, arr…

java操作influxdb时,出现HTTP status code: 401; Message: unauthorized access

使用java操作influxdb出现HTTP status code: 401; Message: unauthorized access 在这里插入图片描述之前创建客户端是这样的 然后关闭客户端连接 后来我尝试吧influxDB null去掉,每次都创建新的连接 然后就行了哦,咱也不知道为啥,反正就…

Web概述

1.1 程序开发架构 1.1.1C/S体系结构介绍 C/S是Client/Server的缩写,即客户端/服务器结构。在这种结构中,服务器 通常采用高性能的机或工作站,并采用大型数据库系统(如Oracle或SQLServer)客户端 则需要安装专用的客户…

深入浅出设计模式 - 代理模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…

qt中c++获取图片qml实时显示的方式1——继承QQuickPaintedItem

通过c opencv获取rtsp视频流,或者视频源,在qml上进行实时视频显示。 一、在QML中通过QQuickPaintedItem动态加载图片 在QML中,可以使用QQuickPaintedItem来创建自定义的可绘制项。通过继承QQuickPaintedItem类,我们可以在QML中动…

这些面试攻略给你2023测试面试带来最强力的支持

在boss和拉钩上投了有几十份简历,其中70%未读状态,30%已读,已读的一半回复要求发送附件简历,然后这周接到面试的有七、八家公司,所以,当前这个大环境真的难 这半个月来,每天安排三到四场面试&a…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第八章 恶意软件概念及防范)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、恶意软件分类1、分类依据2、获取远程控制权类3、维持远程控制权类4、完成特定业务逻辑类 二、恶意软件运行症状1、查看网络连接2、查看系统进程3、查看隐藏文件 三、恶意…

PACS/RIS医学影像管理系统源码 提供先进图像处理和算法

PACS(医学影像存档与通信系统)主要应用于医学影像的存储、传输和显示。它可以使医生突破胶片的局限,对病人的影像进行全方位的处理和观察,以便得出更准确的诊断。同时,PACS可以节省大量的胶片,降低成本。医…

定积分与几何应用

定积分与几何应用 何谓定积分? ∫ a b f ( x ) d x \int_a^bf(x)dx ∫ab​f(x)dx需满足 a a a、 b b b有限(不是无穷)且 f ( x ) f(x) f(x)有界 定积分的计算主要依靠NL公式即牛顿莱布尼茨公式 定积分是否存在于原函数是否存在无关 定积分计…

骑士周游问题及优化

文章和代码已经归档至【Github仓库:https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 骑士周游问题算法优化意义经典算法面试题-骑士周游问题马踏棋盘算法介绍 骑士周游问题的解决步骤和思路分析 骑士周游问题…

什么是哈希表

哈希表 目录 哈希表哈希函数哈希碰撞拉链法线性探测法常见的三种哈希结构总结 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。…

Unity3D:Hierarchy 窗口

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 Hierarchy 窗口 打开 Unity 新项目时的默认 Hierarchy 窗口视图 Hierarchy 窗口显示场景中的每个游戏对象,如模型、摄像机或预制件。 可以使用 Hierarchy 窗口对场景中…

Nginx | 苹果电脑Mac安装和验证Nginx服务过程记录

common wx:CodingTechWork,一起学习进步。 引言 本文主要总结如何在Mac电脑上进行Nginx服务的安装,重点讲解使用brew命令进行安装和验证的过程及问题记录。 安装步骤 安装过程记录 查看nginx信息 首先使用命令brew info nginx进行本机ng…

网络规划工具

对于各种规模的企业和组织来说,应对安全威胁和可靠的网络性能至关重要。战略性地投资有效的网络监控解决方案可以节省时间和成本,减少停机时间并提高员工的生产力,还可以让管理员专注于重要的事情。重要的是要了解,随着业务的增长…

JAVA大作业——网络在线对战游戏——坦克大战

目录 大作业要求 实机演示 主机环回地址布置连接演示 多人联机对战演示 WASD控制坦克移动和按J键发射炮弹攻击 攻击到敌人后会爆炸并且消灭敌人 按下C键设置IP主机连接 大作业要求 简单的小游戏 要求1:能够实现例如贪吃蛇、坦克大战、俄罗斯方块等小游戏&#x…

红帽:多云和AI时代,开放混合云是最优选择

随着云计算市场群雄割据的格局逐渐定型,混合多云的环境已经成为大势所趋。而近年来AI人工智能技术的高速发展,则进一步为技术创新注入了澎湃动力。 那么问题就来了:在这个多云和AI大行其道的时代,企业应该选择什么样的云平台&…