Saas数据库迁移单租户数据
1、背景
租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据库的表数据抽取批量语句编写。
2、源数据库处理过程
2.1 数据库表类型
| 库类型 | 表业务数据类型 | 备注 |
|---|---|---|
| 数据量小 | 和租户关系不大,系统级数据。 | 不用单独抽取,直接全库导。然后再处理。 |
| 数据量大 | 没有租户id,系统级数据 | 抽取表所有数据 |
| 没有租户id,但可关联过滤 | 抽取表按租户过滤数据 | |
| 有租户id,通过两类租户id管理过滤 | 抽取表按租户过滤数据 |
2.2 抽取过程
1)源库(olddb)直接导出数据量小的几个库,通过工具和命令行均可以,详细方法略
2)源库新建一个库(newdb),将单租户数据抽取到该表
CREATE DATABASE newdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3)导出源库数据量大的库表结构,此处不包含视图、存储过程、函数等。并导入新库(newdb)
注:因为同一个库生成视图、存储过程、函数都会关联之前的源库(olddb)而不是新库(newdb),此类单独处理。通过工具和命令行均可以,详细方法略。
4)源库根据表类型生成抽取数据SQL
# 没有租户id表(如:TENANT_ID_、tenant_id)
SELECT 'insert into jghg.' , table_name, ' select * from ', table_name, ';'
FROM information_schema.TABLES WHERE table_schema='olddb'
AND table_type='BASE TABLE' AND table_name NOT IN (
SELECT table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE
table_schema = 'olddb' AND (column_name = 'TENANT_ID_' OR column_name ='tenant_id' )
AND table_name != 'bill_view' # 过滤视图
) ;
# 注此处也有坑,单独修改SQL处理
# a、有些表没有租户id,但数据也要过滤。b、有些表没有租户id但可以没用# 有租户id表 TENANT_ID_
SELECT 'insert into newdb.' , table_name, ' select * from ', table_name,
'where TENANT_ID_ ="116675" or TENANT_ID_ ="824853" or TENANT_ID_ = "000000"
or TENANT_ID_ IS NULL;' FROM INFORMATION_SCHEMA.COLUMNS WHERE
table_schema = 'olddb' AND column_name = 'TENANT_ID_' AND table_name != 'bill_view';
# 注:包括该租户和运营的数据# 有租户id表 tenant_id
SELECT 'insert into newdb.' , table_name, ' select * from ', table_name,
'where tenant_id ="116675" or tenant_id="824853" or tenant_id = "000000" or
tenant_id IS NULL ; ' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'olddb'
AND column_name = 'tenant_id' AND table_name != 'bill_view'
AND table_name != "xx_user"; # xx_user表特殊,有多余租户id字段需要过滤
# 注:包括该租户和运营的数据
5)上面第4点生成的SQL用uedit处理
a、将库名和表名中间的tab空格批量处理,Alt+c即可切换并进行批量处理
b、修改没有租户id表的特殊情况的SQL
c、由于是按表业务数据类型抽取数据,存在外检约束问题。需要在每类批量SQL数据执行前加SET SESSION FOREIGN_KEY_CHECKS = 0;
样例如下:


6)上面第5点生成的批量SQL到源库执行,将数据抽取到新库(newdb)
注:图方便没有写源库库名,需选中源库(olddb)执行。
7)通过命令行导出包含数据的新库(jghg)
mysqldump --max-allowed-packet=512M --skip-opt -v -u root -p -P3306 newdb> newdb2025010801.dump
8)通过命令行压缩导出的新库备份文件,并传到客户数据库服务器
注:同时上传一份到另外一台电脑同时做导入测试,原因是客户服务器导入太慢,两台同步进行。最后用mydql的data目录物理迁移速度最快。
zip newdb2025010801.dump.zip newdb2025010801.dump
3、客户数据库导入过程
客户自建服务器数据库版本需要和源库数据库版本完全一致,方便进行后面写mysql的data目录物理迁移。
3.1 新建数据库服务,此处过程略
注:新建数据库时,my.ini或my.cnf参数尽量少,方便排查问题,调参等数据迁移成功之后再进行。
3.2 新建数据库
CREATE DATABASE newdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 还包括其他数据量小的系统级库,此处略
3.3 通过命令行导入新库(jghg)
mysql > RESET MASTER; # 清除所有的二进制日志文件,并重置二进制日志索引。
mysql -u root -P3306 -p --default-character-set=utf8mb4 newdb < /data/newdb2025010801.dump
3.4 通过mysql客户端导入其他库和新库的视图、函数、存储过程等。此处详细步骤略
3.5 源库生成批量增加字段自增语句
注:当前使用的mysq5.7.28版本可能有bug引起字段自增没有导入
SELECT 'ALTER TABLE ', TABLE_NAME, 'MODIFY ', COLUMN_NAME , COLUMN_TYPE,
'AUTO_INCREMENT ;' FROM information_schema.COLUMNS WHERE EXTRA LIKE '%auto_increment%'
AND TABLE_SCHEMA = 'olddb';
3.6 客户服务器新库(newdb)执行批量增加字段自增语句

4、数据库data目录物理迁移方案
mysql5.7支持配置文件中指定的datadir目录整体迁移。可以跨操作系统,不过数据库版本必须完全一致。
主要在因为客户服务器导入mysql可能时间太长,不如另外一台上恢复时间快时需要
1、客户数据库服务器停止mysql服务
2、将另外一台包含租户完整数据的mysql 的data目录压缩,并上传客户数据库服务器
3、解压刚上传data目录并替换客户数据库服务器mysql的data目录
4、重启mysql
相关文章:
Saas数据库迁移单租户数据
1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...
LeetCode100之括号生成(22)--Java
1.问题描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()()&qu…...
阿里云ios镜像源
阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7...
芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…...
Linux系统之hostname相关命令基本使用
Linux系统之hostname相关命令基本使用 一、检查本地系统版本二、hostname命令的帮助说明中文帮助说明 三、hostname命令的基本使用1. 查看计算机名2. 查看本机上所有IP地址3. 查看主机FQDN4. 查看短主机名 四、hostnamectl命令的使用1. 查看主机详细信息2. 设置主机名3. hostna…...
Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)
1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...
在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
使用python调用JIRA6 REST API及遇到的问题
JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API,基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式:因为⽤户名和密码会被浏览器重复地请求和发送,即使采⽤ SSL/TLS 发送,也会有安全隐患,…...
基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)
一、项目概述 随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...
图片和短信验证码(头条项目-06)
1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...
2501,wtl显示html
原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…...
嵌入式C语言:什么是指针?
目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…...
解锁 KaiwuDB 数据库工程师,开启进阶之路
解锁 KaiwuDB 数据库工程师试题,开启进阶之路 一、KaiwuDB 数据库全方位洞察 (一)核心特性深度解析 原生分布式架构:摒弃传统集中式存储的局限,KaiwuDB 采用原生分布式架构,将数据分散存于多个节点。这不仅能有效避免单点故障风险,保障数据的高可用性,还能凭借并行处…...
ffmpeg7.0 aac转pcm
#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...
【Pandas】pandas Series rdiv
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...
线程安全问题介绍
文章目录 **什么是线程安全?****为什么会出现线程安全问题?****线程安全问题的常见场景****如何解决线程安全问题?**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目(为AI聊天工具增加一套知识系统)的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...
MyBatis-Plus 常用条件构造方法
1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...
