如何安全地变更数据库 Schema

这篇具有很好参考价值的文章主要介绍了如何安全地变更数据库 Schema。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近 Reddit 的 r/golang 下有人问了一个如何做数据库 schema 变更的问题,不到一天,就有了超过 40 条回复。

如何安全地变更数据库 Schema

数据库 schema 变更一直是让程序员头疼的问题,但又不得不面对,毕竟业务要发展,产品要迭代,添加新的功能往往需要去修改数据库的结构,比如添加一个新的字段来保存新的信息,那么这就涉及到数据库 schema 的变更。

先看提问者的 2 个问题:

问题 1 - 缺少变更的可见度

因为可能就开发者或者 DBA 直接连到数据库,就执行了变更语句,具体执行了什么语句,什么时候执行的这些只有当事人自己知道(或者说当事人回过头来也可能忘记了)。

问题 2 - 保证变更的唯一性和排他性

一个应用通常代码会部署多个副本,但都连着同一个数据库。从提问者的描述看,他们当前是在新的代码版本启动时,去尝试变更数据库的。那么问题来了,当多个新代码版本的副本同时启动时,到底如何保证只有其中一个副本可以对数据库进行变更,而其他副本先等待着呢。

提问者最后也在问有没有推荐的变更最佳实践和工具,可以用于生产环境。从最佳实践角度,主要就 2 点:

  • 像对待代码变更一样对待数据库变更
  • 把代码变更和数据库变更分离

而 Bytebase 就是结合这套最佳实践的数据库变更工具。

像对待代码变更一样对待数据库变更

我们先来看一下典型的代码变更流程:

  • 在 GitLab / GitHub 这样的代码平台提交变更请求,GitLab 里叫 MR (Merge Request),GitHub 上叫 PR (Pull Request)。
  • 如果有配的话,MR / PR 会先经过一系列的自动检察,比如最简单的比如代码是否可以编译,是否符合编码规范,以及一系列的自动化测试。
  • 会有一个或多个评审人对代码进行审核 (Code Review)。
  • 审核通过后,代码就提交到仓库了,提交历史也被记录了一下。
  • 经过手动或者自动的流程,代码会被打包成一个新版本,专业的术语叫做制品(Artifact)。
  • 代码部署系统会把新版本按照预先配置的流程,逐渐部署出去。通常先部署到测试环境,在测试环境里,会运行一些集成测试,也可能会有 QA 团队进行手工测试。在测试环境通过后,就会部署到预发环境,在预发环境验证后,最终会部署到生产环境,当然在生产环境,往往也会一点点的逐步更新,也就是所谓的灰度发布。

前面介绍的也就是大家现在所熟知的应用 CI/CD 流程,归纳出来不长,但其实也是花了业界 20 多年才摸索出了这套如今约定俗成的方案,解决了代码变更和发布里的协同,可见度,可靠性,效率等一系列问题。

而数据库的变更因为涉及到数据也就是状态(state)的变更,虽然流程上可以借鉴代码变更的思路,但还是更加复杂的。Bytebase 就是这样一套把代码变更的流程引入到数据库变更的工具。

可视化的变更审核界面

如何安全地变更数据库 Schema

Bytebase 提供了可视化的变更审核界面,开发者和 DBA 可以在同一个界面上对于数据库变更进行协作。

自动 SQL 审核规则

如何安全地变更数据库 Schema

Bytebase 提供了总共 100+ 多条自动 SQL 审核规则,无须 DBA 介入,就能前置地检察开发者提交的语句是否符合规范。这里可以进一步阅读来自用户的案例分享「SQL 审核案例分享回顾|如何搞定 300 个研发」

数据库代码化 Database as Code

如何安全地变更数据库 Schema

Bytebase 是数据库代码化的布道者和领导者,如果在 Google 上搜索 Database as Code 的话,Bytebase 关于 Database as Code 的阐述也是排名第一的,领先于像 Liquibase,DBmaestro 这样的老牌厂商。

如何安全地变更数据库 Schema

Bytebase 是目前业界唯一提供了点击式的配置交互,类似于 Terraform Cloud / Vercel 这样的体验,就可以配置好 GitOps 工作流。配置完成后,研发还是在他们熟悉的代码仓库中提交数据库的变更文件,在审核完成提交到代码仓库后,会自动触发在 Bytebase 这边的部署流程。

批量变更(企业版功能)

变一个数据库已经不容易了,同时变一堆数据库呢?这个需求其实在企业里很常见,比如不同研发环境就对应着不同的数据库;SaaS 公司,会给每一个租户分配独立的数据库;游戏公司,不同的服务器背后对应的其实也就是不同的数据库;因为容灾或者数据合规的要求,不同地区也会部署各自的数据库;当然也不能忘了互联网常见的分库分表场景。这些数据库的结构都是相同的,所以一旦变更,也要是能保持一致。Bytebase 就专门针对这种场景设计了批量变更的能力,像下图所示,展示了变更一次医院 SaaS 系统的数据库,针对不同的医院租户在不同环境上变更的一个二维进展图。

如何安全地变更数据库 Schema

自定义审批流(企业版功能)

自从 1.16.0 版本,Bytebase 也推出了基于风险模型的自定义审批流。用户首先定义数据库操作的风险等级,然后再根据不同的风险等级来配置相对应的审批流。

如何安全地变更数据库 Schema如何安全地变更数据库 Schema

审批节点可以自定义,因为 Bytebase 有独特的项目概念,所以说在审批节点上,还可以指定具体该项目的 DBA,测试负责人这些。

Image

把代码变更和数据库变更分离

一个应用有两大部分组成,一块是代码,一块是数据,前者专业的术语叫无状态(stateless),后者则对应有状态(statefull)。无状态的代码变相对好解决,因为如果变更有问题,直接回滚就完事了。但有状态的数据变更就难多了,变更的时候要考虑是否会把数据库锁住导致整个服务的不可用,回滚也不是那么好弄的,因为有脏数据的问题。

小团队起步时,通常会把数据库变更和代码变更放在一起,但就像那个 Reddit 提问者遇到的一样,规模上去后就会面临问题

  • 当变更出问题后,可控力很小。应用程序将无法启动,这需要人工干预。
  • 一些变更可能需要很长时间才能完成,这意味着在部署新版本发布时需要停机。
  • 不适合于有多个服务器实例访问同一数据库的应用。因为任何一个服务器实例都可以执行变更,而且需要额外的锁机制来协调变更(就是 reddit 提问者提到的那个问题)
  • 不适合有专门的 DBA 或平台工程团队来中心化管理数据库的团队协作模式。集中的 DBA 或平台工程师不知道什么时候发生了变更,他们只会在收到监控系统告警后,然后花费大量的精力去诊断后,才发现是由一个应用团队鲁莽的变更引起的。

有状态的数据和无状态的代码是两个完全不一样的物种,针对代码的变更发布,有 GitLab / GitHub + Octopus / Jenkins 这样的集中式 CI/CD 平台,而针对数据库的变更发布,Bytebase 起到的就是类似的作用。

如何安全地变更数据库 Schema

所以 Bytebase 也把自己称为数据库届的 GitLab,承担了 Database DevOps 的职责。我们也像 GitLab 一样,采用了类似的开源策略,也同时既有托管的 SaaS 服务,也支持私有化部署。

Image

升舱的免费版,让更多团队可以进行安全高效的数据库变更

市面上也有像 Yearning, Archery 这样个人维护的社区项目,而 Bytebase 走的则是商业化路线,有完整建制的产研团队。Bytebase 之前也提供免费版,但因为能力上的限制,使得许多团队有所顾忌,还是采用了社区里完全免费的方案。于是在上周,我们进行了 Bytebase 有史以来最大的版本功能调整,主要是针对 Bytebase 免费版的定位进行了调整,从定位于服务个人兴趣项目以及团队产品验证,调整为了可以覆盖大多数研发团队中心化管理数据库生命周期的所有核心场景。具体到功能点上,免费版的功能得到了大大的增强💎

  • 本来只存在于付费版的 RBAC 功能移到了免费版。
  • 100+ 条的自动 SQL 审核策略全部开放给了免费版。
  • 不再有 10 个用户,10 个实例的限制,而是无限用户,20 个实例。

相应的,也是因为免费版也具备了足够服务团队的产品能力。所以本来付费的团队版名字就不那么贴切了,所以我们也把本来的团队版名字改成了专业版(Pro)。

这次调整的底气,也是因为经过 2 年多的开发, 我们也构建了足够的产品功能梯度,可以在提供覆盖核心场景的免费版基础上,还能进一步提供差异化的功能点,提供给我们的企业级用户。比如单点登录,DBA 工作流,自定义审批,批量变更,环境分级,数据脱敏,访问控制,水印,审计日志,读写分离等都是专门提供给我们企业级用户的能力。

Bytebase 作为一款 infra 层的开源工具,从第一天起的定位就是做一款全球化的产品。事实上,目前 Bytebase 海外的整体营收也高于国内。只要开发应用,就需要和数据库打交道,不限行业,不限地域。而 Bytebase 就是要帮助全球各地,来自不同行业的研发团队一站式管理云上云下,不同云之间,不同数据库的变更,查询,安全,治理四大问题。

就像提到代码托管,大家会想到 GitLab / GitHub,提到监控仪表盘,就是 Prometheus / Grafana,提到多云管理,就是 Terraform。而我们将要变成的现实,就是当大家提到数据库的开发管理时,想到的就是 Bytebase😇。


💡 你可以访问官网,免费注册云账号,立即体验 Bytebase。文章来源地址https://www.toymoban.com/news/detail-497875.html

到了这里,关于如何安全地变更数据库 Schema的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Jetpack】使用 Room Migration 升级数据库并导出 Schema 文件 ( Schema 文件简介 | 生成 Schema 文件配置 | 生成 Schema 文件过程 )

    使用 Room Migration 升级数据库 , 需要根据当前数据库版本和目标版本编写一系列 Migration 迁移类 , 并生成一个升级的 Schema 文件 , 该文件是 json 格式的文件 , 其中包含如下内容 : 版本信息 : 包括 当前版本 和 目标版本 ; 创建表语句 : 包括 新增的表的 定义 和 字段信息 ; 删除表语

    2024年02月09日
    浏览(50)
  • 数据库字段变更监控平台设计开发

      在开发过程中,在值班解决客服问题时,在分析定位别人写的业务代码问题时, 重点是不是自己写的代码 ,只看到了数据库中落库最终数据,并不知道业务逻辑问题发生时数据库表中当时数据情况?如果能知道当时数据情况,就能更准,更快的定位到问题,可能大家对

    2024年02月15日
    浏览(60)
  • MySQL只有information_schema一个数据库

    背景:centos新安装的mysql数据库。使用DbEaver连接mysql库时,发现左边不显示表。使用命令框mysql -uroot回车登录时,发现只能看到information_schema一个数据库了。 原因: 因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿

    2024年02月05日
    浏览(37)
  • Hive(14):Database|schema(数据库) DDL操作

    1 Create database Hive中DATABASE的概念和RDBMS中类似,我们称之为数据库。在Hive中, DATABASE和SCHEMA是可互换的,使用DATABASE或SCHEMA都可以。 COMMENT:数据库的注释说明语句 LOCATION:指定数据库在HDFS存储位置,默认/user/hive/warehouse WITH DBPROPERTIES:用于指定一些数据库的属性配置。 下面

    2024年02月11日
    浏览(58)
  • 一文详解向量数据库Milvus Cloud动态 Schema

    在数据库中,Schema 常有,而动态 Schema 不常有。     例如,SQL 数据库有预定义的 Schema,但这些 Schema 通常都不能修改,用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构,确保每行数据都符合该表的 Schema。NoSQL 数据库通常都支持动态 Schema

    2024年01月18日
    浏览(49)
  • Java 实现实时监听MySQL数据库变更MySQLBinListener

    目录 1、导出需要的类和接口 2、 定义 MySQLBinlogListener类 3、私有方法,启动重连定时器 4、完整代码   编写一个MySQL数据库实时变更的监听器。 为什么要编写这个一个监听器:为了实时监测和响应MySQL数据库中的变更事件 实时数据同步:通过监听MySQL Binlog,可以捕获数据库的

    2024年02月16日
    浏览(50)
  • Ladp数据库安装和配置自定义schema ,Centos7环境

    最近安装ldap看了不少教程,整理下用到的有用的资料,并把自己的搭建过程分享。 ldap介绍:openLDAP入门与安装 官方文档:https://www.openldap.org/doc/admin22/schema.html 安装配置:Centos7 搭建openldap完整详细教程(真实可用) bug解决:ldap运维中遇到的问题 schema自定义:导入schema到openL

    2024年02月12日
    浏览(53)
  • 实战Java springboot 采用Flink CDC操作SQL Server数据库获取增量变更数据

    目录 前言: 1、springboot引入依赖: 2、yml配置文件 3、创建SQL server CDC变更数据监听器 4、反序列化数据,转为变更JSON对象 5、CDC 数据实体类 6、自定义ApplicationContextUtil 7、自定义sink 交由spring管理,处理变更数据         我的场景是从SQL Server数据库获取指定表的增量数据,查

    2024年02月10日
    浏览(87)
  • 德迅云安全数据库审计——如何保障企业数据库安全

    在当今快速发展的数字环境中,以人工智能 (AI) 的兴起和云计算的无处不在为标志,数据库安全的重要性从未如此突出。随着数据库日益成为人工智能算法和基于云的服务的支柱,它们积累了大量的敏感信息,使其成为网络攻击的主要目标。这些技术的融合不仅放大了潜在

    2024年04月26日
    浏览(39)
  • restful web服务实现mysql+debezium+kafka对mysql数据库的业务实时变更数据监控

    请写java程序,创建restful web服务,示范利用RestController、Debezium和KafkaListener通过binlog日志监控并获得mysql业务数据库变更,请用具体数据集举例说明以上程序各步骤处理结果 该问题首先要了解restful web服务,Debezium和kafka相关知识。 1.restful web服务 RESTful是HTTP接口调用的一种特殊

    2024年01月21日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包