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

如何通过一条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 个,那么就可以永久免费使用上述功能,不仅如此,所有专业版的高级功能也都可以永久免费使用,废话不多说,直接上手尝试吧。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iptables 限制端口仅特定IP访问。
  • Apache DolphinScheduler 3.2.2 版本正式发布!
  • 一文解析:代理IP的五大优势
  • 【C#】获取DICOM图像像素的像素值
  • 【CTFWP】ctfshow-web42
  • Spark实时(一):StructuredStreaming 介绍
  • 推荐系统三十六式学习笔记:工程篇.常见架构25|Netflix个性化推荐架构
  • 【SpringBoot教程:从入门到精通】掌握Springboot开发技巧和窍门(四)-Vue项目配置环境、导航栏
  • MySQL常见指令
  • Python 高阶语法
  • MiniExcel:.NET中处理Excel的高效方案
  • 金蝶插件调用HTTP请求 并解析JSON
  • RabbitMQ普通集群搭建指南
  • 【React】JSX:从基础语法到高级用法的深入解析
  • 【云原生】Docker搭建知识库文档协作平台Confluence
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • canvas 五子棋游戏
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ESLint简单操作
  • jdbc就是这么简单
  • js对象的深浅拷贝
  • mysql_config not found
  • node入门
  • PermissionScope Swift4 兼容问题
  • 高程读书笔记 第六章 面向对象程序设计
  • 解析 Webpack中import、require、按需加载的执行过程
  • 区块链分支循环
  • python最赚钱的4个方向,你最心动的是哪个?
  • 湖北分布式智能数据采集方法有哪些?
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #大学#套接字
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十六)一篇文章学会Java的常用API
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)程序员技术练级攻略
  • (转)重识new
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ***通过什么方式***网吧
  • .NET 命令行参数包含应用程序路径吗?
  • .Net6使用WebSocket与前端进行通信
  • .Net的DataSet直接与SQL2005交互
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /proc/vmstat 详解
  • @RequestMapping用法详解
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [C++初阶]string类的详解
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [dart学习]第四篇:函数