实践篇-数据迁移
# 一、数据迁移
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
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
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
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
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
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
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
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
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)