如何通过一条SQL变更多个分库分表?

数据库发展到今天,分库分表已经不是什么新鲜话题了,传统的单节点数据库架构在数据量和访问频次达到一定规模时,会出现性能瓶颈和扩展性问题,而分库分表技术通过将数据分散到多个数据库实例中来分担负载,从而提升系统的整体性能和稳定性。

当然,本文并不是教你怎么去做分库分表,也不是夸分库分表技术有多牛,而是想具体谈一谈很多企业在分库分表场景下的数据变更难题。

相信很多同学都有深刻体会,在分库分表的实际应用中,由于把一个库的数据分别存在了不同的库,因此一个 DDL 语句往往需要到多个数据库实例中去执行,这就带来了一系列让人挠头的难题。

难题一:变更需要在每一个分表中去执行,如果企业有 1024 个分表,那就需要执行 1024 次,异常耗时还容易出错。

难题二:如果编写脚本去批量执行,技术门槛比较高是一回事,还需要注意各种各样的细节:

  • 挨个连接数据源:如果需要变更的库太多,有多少个库就得写多少个连接脚本,这对于开发者而言是一种负担。
  • 错误捕获:SQL 语句并不是 100% 执行成功的,可能会有各种因素导致执行失败,因此脚本必须能够捕获执行过程中可能出现的各种错误,并在错误发生后妥善处理,以保证脚本执行完成后 DDL 在所有表成功执行。
  • 脚本维护成本高:由于变更场景的多样性,在耗费好大精力写完脚本后,只能对当次变更使用,下次有其他新的变更需求,可能无法直接套用脚本,又得重新对脚本做优化。

看到这里,可能已经有同学产生共鸣了,欢迎对号入座,因为大部分企业的分库变更事实上就是这么干的,想要摆脱这些痛点,肯定是有办法的,不做分库分表是不是就行了?当然不是,分库分表对于企业的重要性不言而喻,我们需要在保证分库分表的前提下,给出解决方案。

我们试想如下场景:把所有需要统一进行变更的分库划分到一个库分组中,然后只需要对该库分组提交一次 DDL 变更,那该 DDL 语句就会自动在该库分组下的所有库中完成自动执行。

看上去是不是很方便?下面我们就来看一下,怎么去实现上述的流程。

通过 NineData 的库分组功能实现批量分库变更

在 NineData 的数据库 DevOps 专业版以上版本中,支持库分组的创建,可以将不同数据源中的库添加到该库分组中,用来进行统一的变更与查询。

先简单介绍下配置流程:

基于上面这个流程,我们来演示一下配置方法。

步骤一:录入数据源

将分库所在的数据源全部录入到 NineData 平台。

步骤二:建立库分组

将处于不同数据源中的分库全部添加到库分组中,下图示例中,创建了名为 Poc_Shard_DB 的库分组,包含了 MySQL-POC1 和 MySQL-POC2 数据源中的 poc_test01、poc_test02、poc_test03、poc_test04 4个分库。

步骤三:对库分组执行表结构变更

通过 NineData 的 SQL 任务功能,对库分组发起变更申请,经过系统(规范预审)和审批人员的双重审批后,DDL 语句将会在库分组中的所有分库中执行。

1. 提交 SQL 任务,选择库分组,输入 DDL 语句。本示例给 Poc_Shard_DB 库分组增加一个 age 列。

2. 系统自动规划出 DDL 执行的目标库(见下表),然后基于规范对 DDL 语句进行评估,通过后就可以提交人工审批了。

3. 提交审批,选择审批人,然后单击确定。

4. 待审批通过后就可以执行了。在执行过程中,如果 DDL 在某个分库中没有执行成功,就会在任务列表中展示出来,非常方便。

5. 执行完成后,可以查看这几个分组,发现所有分库的目标表中都增加了对应的 age 字段。

总结

本文的整个变更过程中,变更是围绕库分组进行的,库分组可以根据企业的实际业务场景自由添加,具有非常高的通用性,并且操作十分便利,因此可以适用于各种分库变更的场景。

而对于上文中提到的几个变更难题,NineData 的库分组解决方案都可以轻松化解,从此分库变更只需点几下鼠标就完事,不用再绞尽脑汁地写脚本了。

最后补充一个新手大礼包,如果企业的数据源数量不超过 10 个,那么就可以永久免费使用上述功能,不仅如此,所有专业版的高级功能也都可以永久免费使用,废话不多说,直接上手尝试吧。

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

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

相关文章

Electron的入门介绍与使用(1)共30节

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门指南​ Electron 是网页应用 …

IEDA怎么把springboot项目 启动多个

利用Idea提供的Edit Configurations配置应用参数。 点击Modify Options进行添加应用参数: 确保这里勾选

宿舍生活新升级:智能指纹锁的便捷体验(嘉立创EDA设计)

宿舍生活新升级:智能指纹锁的便捷体验 引言 宿舍生活总是充满挑战和乐趣,但有时也会因为一些小事情而变得复杂。比如,忘记带钥匙或者需要频繁地给室友开门。随着科技的发展,智能设备逐渐走进我们的生活,为日常带来便…

每日好题(2)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) {int arr[6] { 1,2,3,4,5,6 };char* p arr;int sz sizeof(arr) / sizeof(arr[0]);for (int a 0; a < sz; a){printf("%d\n", *p);p 4;}return 0; }这串代码遍历打印数组的结果是没…

在 VM 虚拟机中安装 openEuler + 桌面

在 VM 虚拟机中安装 openEuler 1 介绍2 步骤语言Root 账户安装位置网络和主机名自动检索到【推荐】手动配置网络 软件选择安装完成登录测试网络curl ip / ping ipip link show / ip a如网络不通&#xff0c;可检查网卡状态和dns配置 安装命令设置以图形界面的方式启动【dde】第…

Python Django功能强大的扩展库之channels使用详解

概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…

封装分页组件(Pagination)v2版本

使用须知&#xff1a;基于项目内已安装vue2eleme-ui&#xff0c; 则可以百分百直接套用&#xff0c;使用简介明了&#xff01;&#xff01; 一、封装component组件 component/Pagination/index.js <template><div :class"{ hidden: hidden }" class"…

动态规划之三—— 从暴力递归到动态规划_数字字符串转字母字符串

题目&#xff1a; 规定1 和A 对应&#xff0c;2 和B对应&#xff0c;3 和C 对应 ... 那么一个数字字符串&#xff0c;比如“111” 就可以转化为&#xff1a;“AAA” 、“KA”、“AK” 。要求&#xff1a;给定一个只有数字字符组成的字符串str&#xff0c; 返回有多少种转化结果…

客户端与服务器通讯详解(4):支持实时通讯的协议

在之前的章节中&#xff0c;贝格前端工场给大家分享了客户端与服务器通讯详解定义、流程、协议、方式。本次重点分享实时通讯方式是什么&#xff0c;该如何实现&#xff0c;有哪些协议&#xff0c;欢迎大家点赞评论转发。 一、客户端与服务器实时通讯是什么 客户端与服务器实…

SQL labs-SQL注入(二)

环境搭建参考 SQL注入&#xff08;一&#xff09; 一&#xff0c;SQL labs-less2。 http://192.168.61.206:8001/Less-2/?id-1 union select 1,2,group_concat(username , password) from users-- 与第一关没什么太大的不同&#xff0c;唯一区别就是闭合方式为数字型。 二…

解决:uniapp 小程序 使用swiper 内部嵌套另外一个拥有左右滑动组件导致滑动冲突

解决办法 在swiper-item 内增加这个属性进行包裹 touchmove.stop <div touchmove.stop><qiun-data-charts type"area" :opts"optsStg" :chartData"dateDataStg" /> </div>

微信小程序中Map组件Marker中把Label文字信息通过按钮显示或隐藏

wxml页面按钮 <button bindtap"toggleLabel">Toggle Label</button>js data:{labelMarkerId: null // 记录当前显示文本的标记的 id }, //按钮切换显示 toggleLabel() {// 判断当前是否有显示的文本标记if (this.data.labelMarkerId ! null) {// 如果…

zabbix添加钉钉告警机器人使用bash和python两种脚本

zabbix添加钉钉告警机器人使用bash和python两种脚本 查看脚本目录 vi /etc/zabbix/zabbix_server.conf# 脚本存放路径 AlertScriptsPath/usr/lib/zabbix/alertscripts编写脚本&#xff08;二选一&#xff09; bash脚本 编写脚本 cd /usr/lib/zabbix/alertscripts vi zabbi…

AV1技术学习:Quantization

量化是对变换系数进行&#xff0c;并将量化索引熵编码。AV1的量化参数 QP 的取值范围是0 ~ 255。 一、Quantization Step Size 在给定的 QP 下&#xff0c;DC 系数的量化步长小于 AC 系数的量化步长。DC 系数和 AC 系数从 QP 到量化步长的映射如下图所示。当 QP 为 0 时&…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑&#xff0c;输入框能提示相关项。 主要借助qt的QCompleter 类&#xff08; Qt 框架中提供的一个用于自动补全和模糊搜索的类&#xff09;&#xff0c;结合一些控件&#xff0c;比如QComboBox和QLineEdit&#xff0c;实现模糊查询的功能。 1&…

科普文:百度交易中台之系统对账篇

百度交易中台作为集团移动生态战略的基础设施&#xff0c;面向收银交易与清分结算场景&#xff0c;赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线&#xff0c;主要包括&#xff1a;度小店、小程序、地图打车、文心一言等。本文主要介绍了百度交易中台的交易链…

海康威视综合安防管理平台 detection 前台RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

总结——TI_音频信号分析仪

一、简介 设备&#xff1a;MSPM0G3507 库&#xff1a;CMSIS-DSP TI 数据分析&#xff1a;FFT 软件&#xff1a;CCS CLion MATLAB 目的&#xff1a;对音频信号进行采样&#xff08;滤波偏置处理&#xff09;&#xff0c;通过FFT获取信号的频率成分&am…

keras框架的to_categorical方法

在阅读keras的中文文档时候&#xff0c;对于这里的代码不了解 y_train keras.utils.to_categorical(np.random.randint(10, size(1000, 1)), num_classes10)这里应该拆分为两部分看待 第一个是np.random.randint() 查看numpy文档知道&#xff1a; random.randint ( low , hi…

AWS DMS MySQL为源端,如何在更改分区的时候避免报错

问题描述&#xff1a; 文档[1]中描述MySQL compatible Databases作为DMS任务的源端&#xff0c;不支持MySQL 分区表的 DDL 更改。 在源端MySQL进行分区添加时&#xff0c;日志里会出现如下报错&#xff1a; [SOURCE_CAPTURE ]W: Cannot change partition in table members…