元月's blog 元月's blog
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多

元月

临渊羡鱼,不如退而结网
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多
  • Redis

  • Nginx

  • Kafka

  • Shardingsphere

    • shardingsphere源码编译
    • shardingsphere基础介绍
    • 实践篇-快速开始
    • 实践篇-混合部署架构搭建
    • 实践篇-数据迁移
      • 一、数据迁移
        • 1.1、准备阶段
        • 1.2、配置阶段
        • 1.3、执行阶段
        • 1.4、执行数据一致性校验
      • 二、FAQ
        • 2.1、can not get table metadata
    • 设计改造篇-多租户隔离方案
  • Otter

  • nexus

  • 中间件
  • Shardingsphere
元月
2023-10-19
目录

实践篇-数据迁移

# 一、数据迁移

Shardingsphere5.2.1版本当前只支持库和表级别的迁移,不支持行级别(输入条件)迁移。如果想做支持,可以考虑改动其源码,使其支持行级别迁移

# 1.1、准备阶段

在 MySQL 准备源端库、表、数据

DROP DATABASE IF EXISTS migration_ds_0;
CREATE DATABASE migration_ds_0 DEFAULT CHARSET utf8;

USE migration_ds_0;

CREATE TABLE t_order (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));

INSERT INTO t_order (order_id, user_id, status) VALUES (1,2,'ok'),(2,4,'ok'),(3,6,'ok'),(4,1,'ok'),(5,3,'ok'),(6,5,'ok');

select * from t_order;
1
2
3
4
5
6
7
8
9
10

在 MySQL 准备目标端库

DROP DATABASE IF EXISTS migration_ds_10;
CREATE DATABASE migration_ds_10 DEFAULT CHARSET utf8;

DROP DATABASE IF EXISTS migration_ds_11;
CREATE DATABASE migration_ds_11 DEFAULT CHARSET utf8;

DROP DATABASE IF EXISTS migration_ds_12;
CREATE DATABASE migration_ds_12 DEFAULT CHARSET utf8;
1
2
3
4
5
6
7
8

# 1.2、配置阶段

在 proxy端 配置源端资源

ADD MIGRATION SOURCE RESOURCE ds_0 (
    URL="jdbc:mysql://mysql:3306/migration_ds_0?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true",
    USER="root",
    PASSWORD="*********",
    PROPERTIES("minPoolSize"="1","maxPoolSize"="20","idleTimeout"="60000")
);
1
2
3
4
5
6

在 proxy端 配置逻辑数据库资源和规则

CREATE DATABASE sharding_db;

USE sharding_db;
#添加数据库资源
ADD RESOURCE ds_2 (
    URL="jdbc:mysql://mysql:3306/migration_ds_10?serverTimezone=UTC&useSSL=false",
    USER="root",
    PASSWORD="*********",
    PROPERTIES("minPoolSize"="1","maxPoolSize"="20","idleTimeout"="60000")
), ds_3 (
    URL="jdbc:mysql://mysql:3306/migration_ds_11?serverTimezone=UTC&useSSL=false",
    USER="root",
    PASSWORD="*********",
    PROPERTIES("minPoolSize"="1","maxPoolSize"="20","idleTimeout"="60000")
), ds_4 (
    URL="jdbc:mysql://mysql:3306/migration_ds_12?serverTimezone=UTC&useSSL=false",
    USER="root",
    PASSWORD="*********",
    PROPERTIES("minPoolSize"="1","maxPoolSize"="20","idleTimeout"="60000")
);

#查看数据库资源
SHOW DATABASE RESOURCES;

#删除数据库资源
DROP RESOURCE ds_2,ds_3,ds_4 ignore single tables;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

在 proxy端 配置分片资源和规则

#创建分片规则
CREATE SHARDING TABLE RULE t_order(
RESOURCES(ds_2,ds_3,ds_4),
SHARDING_COLUMN=order_id,
TYPE(NAME="hash_mod",PROPERTIES("sharding-count"="6")),
KEY_GENERATE_STRATEGY(COLUMN=order_id,TYPE(NAME="snowflake"))
);

#查看分片表
SHOW SHARDING TABLE RULES;

#查看分片算法
SHOW SHARDING ALGORITHMS;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 1.3、执行阶段

MIGRATE TABLE ds_0.t_order INTO t_order;
#或者指定目标端逻辑库
MIGRATE TABLE ds_0.t_order INTO sharding_db.t_order;

#查看数据迁移作业列表
SHOW MIGRATION LIST;

#查看数据迁移详情
SHOW MIGRATION STATUS 'j01016e501b498ed1bdb2c373a2e85e2529a6';

#撤销作业
ROLLBACK MIGRATION 'j01014e471bea5d9e4100957ceeec6e7b8bba';
1
2
3
4
5
6
7
8
9
10
11
12

# 1.4、执行数据一致性校验

CHECK MIGRATION 'j01016e501b498ed1bdb2c373a2e85e2529a6' BY TYPE (NAME='CRC32_MATCH');

#查询数据一致性校验进度
SHOW MIGRATION CHECK STATUS 'j01016e501b498ed1bdb2c373a2e85e2529a6';

#完成作业
COMMIT MIGRATION 'j01016e501b498ed1bdb2c373a2e85e2529a6';

#刷新元数据
REFRESH TABLE METADATA;
1
2
3
4
5
6
7
8
9
10

# 二、FAQ

# 2.1、can not get table metadata

执行数据迁移时,出现如下问题

MIGRATE TABLE ds_0.t_order INTO t_order
> 18083 - Can not split by range for table `t_order`, reason is: can not get table metadata
> 查询时间: 0.286s
1
2
3

问题原因:

迁移时,shardingsphere-proxy会查询数据源ds_0的table metadata,由于ds_0 配置了错误的schema,导致没有获取到table metadata,应该配置migration_ds_0,实际上配置了其它schema

解决方式:

将schema更换成正确的配置即可

参考:

Shardingsphere数据迁移 (opens new window)、Shardingsphere数据迁移RAL语法 (opens new window)

#Shardingsphere
实践篇-混合部署架构搭建
设计改造篇-多租户隔离方案

← 实践篇-混合部署架构搭建 设计改造篇-多租户隔离方案→

最近更新
01
otter二次开发-支持按目标端主键索引Load数据
08-03
02
mvnw简介
06-21
03
gor流量复制工具
06-03
更多文章>
Theme by Vdoing | Copyright © 2022-2024 元月 | 粤ICP备2022071877号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式