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 模型…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...