数据库不停机迁移方案

2024-08-26 05:28
文章标签 数据库 方案 迁移 停机

本文主要是介绍数据库不停机迁移方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在业务发展过程中,可能会有需要进行数据迁移的场景。

一般来说可以分为两种

(1)停机迁移

(2)不停机迁移

停机迁移比较简单,步骤如下

(1)根据业务流量数据低峰时间,制定迁移计划。

(2)发布停业公告

(3)届时先停机,保证老库数据不会再变动,然后使用迁移工具进行数据的全量迁移

(4)迁移完成后进行新老数据库数据的对比校验

(5)数据校验没问题,流程切换到新库,完成

停机迁移的问题在于

(1)有的业务压根就不能容忍停机。还有就是数据全量迁移的耗时可能也比较久,长时间停机更是不可能接受。

(2)一把切,万一新库、新应用有什么问题,由于新库中新增的数据在老库中并没有,所有也没法切回老库,有问题也不能回滚。

但是停机迁移最大的好处是:简单!

所以实际业务中一些数据量没那么大,或者一些内部系统,非关键系统,采用这种方式其实是主流。再重复一遍,没有最好的方案,只有最适合的方案,有利就有弊,都是权衡取舍罢了。

不停机迁移步骤

(1)对业务代码进行改造,数据库修改操作改为双写,即同时写入新库和老库

insert:两边同时成功

delete:有的数据新库中没有,也没关系

update:有的数据新库中没有,也没关系

老库的写入不受影响,必须成功。新库的如果不成功也没关系,记录一下日志进行排查即可。

为了不影响系统的响应时间等,写入新库可以弄成异步操作

(2)将旧库所有数据迁移到新表

从老库中查询数据,更新到新库,伪代码

select 所有字段 from 旧表 where id in (select id from 旧表 order by id asc limit #{start},#{batchSize})

如果数据为空就结束

 否则对于里面的每条数据

开启事务

select 所有字段 from 旧表 where id = xxx for update;

插入新库(注意需要先delete再insert)

提交事务

这里要注意,一定要加for update锁定数据。

为什么?因为业务代码里面双写还在继续,比如业务代码中更新

update 表xx set monney = 100,然后旧表写入了,但迁移数据数据的读取代码在这之前执行的,所以读到的事旧数据。迁移代码正要把数据写入新库,双写代码已经把新库更新为最新数据,然后迁移代码又把旧数据覆盖上去了。这样就出现了丢失更新的问题。

如果加上for update,则能保证这一条数据在迁移过程中不发生改变,保证新老数据的一致性。

(3)校验两边数据的一致性。数据量太大的时候可以采用一般数据抽查、关键数据全量检查结合的方式

(4)将流量逐步切换到新表。灰度切换。

切换到新表,也就是主要写新的表,旧表也要写,这样如果新库有啥问题可以随时切换回旧库。

(5)平稳运行一段时间后,确保都没问题了,再全部转到新库上。

这篇关于数据库不停机迁移方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107674

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(