数据库同步非常实用的工具,阿里数据迁移工具yugong使用细则

不得不说顶级大佬们都有一种理工的终极浪漫,yugong这个名字真的太贴切了Orz,哈哈哈哈

首先附上项目Github源地址:点击进入
项目官方文档:点击进入
下载地址:点击进入
(建议直接下载tar包,不建议自己编译,会遇到各种问题,需要改源码的大佬当我没说)

强烈建议先去把人家的文档好好看一遍,其实他的文档已经写的非常清楚了,愚公的使用相对简单,这里主要介绍一下yugong的几个模式的问题,以及在使用过程中的问题。

一、表主键的问题

这个是前提条件,所以放在第一个讲
如果表没有主键,是没有办法进行增量更新的!(增量模式INC)
这一点是必须要注意的,如果一定需要增量同步这里只有一个解决办法,就是给表加一个主键。如果表不是很大的话就每天全量把。

二、模式

  1. 全量模式(FULL):遍历源表所有的数据后,插入目标表,需要注意的是如果目标表有主键是不支持断点续传的,也就是说全量同步如果在中途意外终止,是不能够直接再次运行的,需要清空目标表之后再运行,因为会引发主键冲突。

  2. 增量模式(INC):同步方案的主要模式,在表规模变大时采用增量模式会极大的节省时间和减轻数据库压力。需要注意的是增量模式需要源表一定要有主键,而且需要源数据库有该表的物化日志表。物化日志并不是必须的,没有物化日志也能够正常运行增量模式,但是如果源表的字段发生变化并不会同步,这点尤其重要。

  3. 自动模式(ALL):首先进行全量模式,全量完成之后自动切换为增量模式

  4. MARK模式(MARK):愚公自带的创建物化视图的模式,运行此模式会给指定的表自动创建物化视图,需要注意的是操作的表也必须要有主键才会创建成功。

  5. CLEAR模式(CLEAR):自动删除创建的物化视图

  6. 对比模式(CHECK):当数据量极大时我们并不能知道两个数据库是否完全一致,对比模式可以便利两个数据库,查看是否一致。需要注意的是当数据表特别大时(百万数量级),运行会报游标错误,这个应该是数据库的设置问题,这个问题目前没有解决(我们并没有修改顶级数据库的权限)

三、增量模式细则

这个是yugong中的重点了,因为它是最常用的模式,在数据量非常大的时候不可能每天进行全量同步,这样对于数据库的压力太大。

  • 在正常情况下,增量更新是需要物化日志的,当有物化日志时才会进行真正意义上的更新。如果没有物化日至,在增量更新的时候只会检查增加和删除,并不会去检索字段的值
  • 也就是说,如果没有物化日志,源数据库修改一条记录的某一个字段的值,yugong在增量同步的时候就会忽略。
  • 其实从原理上是不难理解,当没有物化日志的时候,增加或删除源数据库的记录都会造成记录数的不一致,这样根据表的主键很容易就能作出跟源表一致的增加或者删除操作,但是如果需要探知字段的值三否一致,就需要一个字段一个字段的对此,这样性价比实在太低了,通过物化日至是非常实用和明智的。

四、物化日至相关

  • 物化日志的原理也非常简单,当表发生增删查改操作时,产生一条记录,记录修改的字段和操作,这样根据记录去反推改动就非常简单了。
  • yugong在Oracle中自动创建的表会有自动删除机制的,也就是只要被读过就会自动删除,所以完全不用操心。
  • 因为为自己的数据库都是Oracle,其他的数据库没有仔细做过实验。

五、yugong提供的自定义处理接口

  • 这个功能非常实用,在同步的时候就可以作一些字段处理。
  • 一些简单的,表名,列名不同的问题,同样的官方已经写的非常清楚了。
  • 这里展示一个为自己用到的小的需求转化
package com.taobao.yugong.translator;

import java.sql.Types;
import java.util.Date;

import org.apache.commons.lang.ObjectUtils;

import com.taobao.yugong.common.db.meta.ColumnMeta;
import com.taobao.yugong.common.db.meta.ColumnValue;
import com.taobao.yugong.common.model.record.Record;

public class AcdFileDataTranslator extends AbstractDataTranslator implements DataTranslator {

    public boolean translator(Record record) {
		//拿出源表的四个字段值
        ColumnValue qsrs = record.getColumnByName("qsrs");
        ColumnValue zjccss = record.getColumnByName("zjccss");
        ColumnValue zsrs = record.getColumnByName("zsrs");
        ColumnValue swrs = record.getColumnByName("swrs30");

        StringBuilder displayNameValue = new StringBuilder(64);
		//计算程度
        displayNameValue.append(ObjectUtils.toString(
            addOf(
                ObjectUtils.toString(qsrs.getValue())
                ,ObjectUtils.toString(zjccss.getValue())
                ,ObjectUtils.toString(zsrs.getValue())
                ,ObjectUtils.toString(swrs.getValue()))));
        
        //定义一个新字段,赋予字段名称,类型
        ColumnMeta gmtMoveMeta = new ColumnMeta("sgyzcd", Types.VARCHAR);
        //赋值
        ColumnValue gmtMoveColumn = new ColumnValue(gmtMoveMeta ,displayNameValue.toString());
        record.addColumn(gmtMoveColumn);

        return super.translator(record);
    }

    public String addOf(String qsr, String zjccs, String zsr, String swr){

        if(qsr==null || qsr=="" || zjccs==null || zjccs=="" || zsr==null || zsr=="" || swr==null || swr=="") {
            return "0";
        }

        int qsrs = Integer.parseInt(qsr);
        int zjccss = Integer.parseInt(zjccs)/10000;
        int zsrs = Integer.parseInt(zsr);
        int swrs = Integer.parseInt(swr);

        String a = "0";

        if((qsrs>0 && qsrs<=2) || zjccss<0.12){
            a = "1";
        }
         if((zsrs>=1 && zsrs<=2) || qsrs>=3 || zjccss<3){
            a = "2";
        }
         if((swrs>=1 && swrs<=2) || (zsrs>=3 && zsrs<=10) || (zjccss>=3 && zjccss<6)){
            a = "3";
        }
        if(swrs>=3 || zsrs>10 || (swrs==1 && zsrs>=8) || (swrs==2 && zsrs>=5) || zjccss>=6){
            a = "4";
        }

        return a;
    }
}

就是一个利用原表的四个字段来判断事故的严重程度,非常简单的一个需求。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值