ShardingSphere-Proxy 单库分表迁移数据 (迁移数据遇到的坑)

首先官方迁移数据文档

  使用手册 :: ShardingSphere 

官方给的示例是 多库多表 也就是多库不分表;

我们公司要做的是单库分表 就是单库中多个分表;

说一下思想 :通过官方给的例子我们可以发现 

他们的配置目标库是多个 假如我配置A库-A库 然后 A库 是通过 ShardingSphere-Proxy 执行的数据 这样是不是就可以达到单库分表迁移数据了,试了一下果然是可以的

因为你做的单库分表配置的时候 是要配置一个逻辑表 和多个分表 也就是

也就是 table 对应--->  table-01,table-02,table-03,table-04

通过  ShardingSphere-Proxy 登录进去只能查到table  而看不到   table-01,table-02,table-03,table-04

通过 ShardingSphere-Proxy 插入数据 他会根据你配置的规则hash 算出来到不同的分表中。

通过这就可以想到我把目标数据源配置为  ShardingSphere-Proxy 代理的数据源应该就能达到迁移数据的效果。

话不多说直接开始

单库分表迁移数据示例

因为我这个地方迁移数据的时候是同库 也就是 A库table 迁移到A库table-01,table-02,table-03,table-04

通过ShardingSphere-Proxy 进入你是可以看到 逻辑表table 逻辑表背后对应真实表table-01,table-02,table-03,table-04(这个怎么配置官方文档中是有 的 可以看一下 单库分表的解决方案我这里就不详细的说了)

步骤一按照迁移数据步骤 先添加目标数据源 注意执行命令的时候 要通过ShardingSphere-Proxy 执行 

因为我是同库迁移 所以我的目标数据源也就是连接ShardingSphere-Proxy的数据源

看到控制台输出

表示执行成功 

 步骤二 这个地方要切记 按照官方文档 给的例子 是要配置规则表 但是那样只支持多库多表

我们这里不配置规则表

按照官方给的示例 是目标数据源配置多个 然后 规则表里面配置多个数据源

我们这里直接去掉这一步因为我们是A库迁移A库所以只会有一个数据源 所以直接配置源数据源也就是迁移数据要查询的原始库

 看到控制台输出

表示执行成功;

上面步骤没问题之后 我们就可以开始执行任务了

 MIGRATE TABLE ds_0.源数据表  INTO sharding_goods.目标表;

看到输出Query OK, 0 rows affected (0.09 sec) 也就是会开始执行 

这个时候通过官方提供的一些命令就可以看到执行过程了 是否执行完成等。

踩大坑

1 迁移数据必须要链接ZooKeeper 而且必须是集群 他们只支持集群模式 不支持单个的 

    官网上其实有的 本来我以为插入数据的时候就可以不连接 ZooKeeper 然后迁移数据应该也不需要 不懂原理那时候 直接硬上  然后每次执行到 配置源数据源 就会报错 

[ERROR] 2023-04-20 20:09:07.416 [Connection-8-ThreadExecutor] o.a.s.p.f.c.CommandExecutorTask - Exception occur:
java.lang.NullPointerException: null
        at org.apache.shardingsphere.data.pipeline.core.api.PipelineAPIFactory$1.initialize(PipelineAPIFactory.java:49)
        at org.apache.shardingsphere.data.pipeline.core.api.PipelineAPIFactory$1.initialize(PipelineAPIFactory.java:45)
        at org.apache.commons.lang3.concurrent.LazyInitializer.get(LazyInitializer.java:106)
        at org.apache.shardingsphere.data.pipeline.core.api.PipelineAPIFactory.getGovernanceRepositoryAPI(PipelineAPIFactory.java:60)
        at org.apache.shardingsphere.data.pipeline.core.api.impl.PipelineDataSourcePersistService.load(PipelineDataSourcePersistService.java:43)
        at org.apache.shardingsphere.data.pipeline.scenario.migration.api.impl.MigrationJobAPI.addMigrationSourceResources(MigrationJobAPI.java:437)
        at org.apache.shardingsphere.migration.distsql.handler.update.RegisterMigrationSourceStorageUnitUpdater.executeUpdate(RegisterMigrationSourceStorageUnitUpdater.java:56)
        at org.apache.shardingsphere.migration.distsql.handler.update.RegisterMigrationSourceStorageUnitUpdater.executeUpdate(RegisterMigrationSourceStorageUnitUpdater.java:41)
        at org.apache.shardingsphere.proxy.backend.handler.distsql.ral.UpdatableRALBackendHandler.execute(UpdatableRALBackendHandler.java:48)
        at org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.query.MySQLComQueryPacketExecutor.execute(MySQLComQueryPacketExecutor.java:92)
        at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:114)
        at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:109)
        at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

非常不清晰 把源码下来 还没跑通 他们的源码 需要jdk 11然后各种报错最后也没搞起来 后来通过各种百度 然后才想起来开启注册中心。

2 我迁移的数据中字段有负数 是以前做测试的时候留下来的   正好那个字段是分表规则配置的

  导致迁移数据的时候  给我报table_-3  找不到这个表 猜测应该是如果你字段的值是负数 正好 你又配置的分片规则是通过这个字段hash 估计是 ShardingSphere-Proxy 内部报异常 直接给你按照你的值去找表 只是猜测 没有看源码 不确定

3 迁移任务不能直接执行完成命令  执行完成命令的时候 增量就不会自动同步了。 所以一定要想好是否要完成 线上如果不停服迁移数据 一定要考虑清楚切换方案。

4 每次查询都报这个错误 但是 不影响查询结果 目前没有找到什么原因

 ] 2023-04-23 06:44:45.759 [ShardingSphere-pipeline-progress-persist-0] o.a.s.d.p.c.j.p.p.PipelineJobProgressPersistService - persist, jobId=j0101d2406376624c63ad732400618c9748ef, shardingItem=0, cost 3 ms
[INFO ] 2023-04-23 06:44:54.769 [ShardingSphere-pipeline-progress-persist-0] o.a.s.d.p.c.j.p.p.PipelineJobProgressPersistService - persist, jobId=j0101d2406376624c63ad732400618c9748ef, shardingItem=0, cost 3 ms
[ERROR] 2023-04-23 06:45:02.319 [Connection-27-ThreadExecutor] o.a.s.p.f.c.CommandExecutorTask - Exception occur: 
org.apache.calcite.runtime.CalciteContextException: At line 0, column 0: Object 'PROFILING' not found within 'INFORMATION_SCHEMA'
        at jdk.internal.reflect.GeneratedConstructorAccessor70.newInstance(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:505)
        at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:932)
        at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:917)

希望能帮助大家吧 我也研究的不深 小白一个  大家有啥想法 可以直接指出来  我可以补充上去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值