深入数据库同步技术(1)- 基础篇

下载网站:www.SyncNavigator.CN 

 客服QQ1793040

----------------------------------------------------------

 

 

关于HKROnline SyncNavigator 注册机价格的问题


HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发出来以来,经过8年不断地根据客户需求,加强功能,修复bug,现在已经具备强大的数据库同步功能,以前官方syncnavigator授权码的价格是2800元一套,授权码是绑定电脑硬件的,更换硬件或者电脑,软件无法正常运行,需要重新购买授权码。

今年官方团队有其他项目,没有重点开发市场,其中一个以前官方团队的程序员开发了syncnavigator注册机,用这款注册机也能进行syncnavigator授权激活,功能和以前官方,没有任何影响,只是改变了授权方式。

因为这个版本的syncnavigator注册机是程序员自己开发的,因而成本比以前官方成本要小,并且没有做过多市场开发营销,所以价格相对以前来说优惠很多,这对于有数据同步需求的公司和团队来说,无疑是巨大的福音。

因为这款HKROnline SyncNavigator 软件是目前为止,国内做的最好的数据库同步软件,傻瓜式同步数据库,只需要你设置好来源数据库和目标数据库的账号和密码,一键开启,后台自动同步,断点续传,增量同步,几乎不占内存和CPU资源。并且还支持异构数据库,也可以同步部分表或者部分字段,都可以进行更为精准的设置操作。

未经允许不得转载:syncnavigator数据库同步|syncnavigator 授权码 » 关于HKROnline SyncNavigator 注册机价格的问题

在大约十年前NoSQL概念刚刚提出来的时候,其雄心勃勃的目标就是将关系型数据库(RDB)完全淘汰掉。十年过去了,各类NoSQL产品逐步丰富(K/V,文档,图形,缓存等),它们在跌跌撞撞中找到了自己的定位,其当初的愿景也从“No SQL”演变为“Not Only SQL”。关系型数据库活得甚至比原来更加滋润(当然一些关系型数据库也会居安思危,在产品中加入NoSQL特性,比如Oracle)。

事实上,如果我们的系统需要落地数据,尤其是交易型数据,关系型数据库依然是我们的不二选择。在未来相当长的时间里,我们依然会重度依赖关系型数据库。

而在数据库的使用领域,数据同步绝对是一个绕不开的话题。

本文将以大家常见的数据库Oracle和MySQL为例,介绍如何做好数据同步,更确切地讲,是如何做好表数据同步。

一、数据同步涉及的业务场景

在很多业务场景下,我们都有可能会涉及到数据同步,常见的有:

▪ 基于较单纯的同步目的:

由于业务需要,我们就需要把A库的表同步到B库去,这个目的单一且直接。

▪ 出于构建数据总线目的:

我们知道一般系统中都有一个主数据库,该数据库是一个OLTP库,随时接受终端用户的业务请求,对数据库发生CRUD操作。

如果可以构建一个数据总线(Data Bus),在主数据库有变更事件发生时,可以将数据变更同步/传播到其他系统,比如:Memcached/Redis(更新缓存),ES(更新索引),通知其他业务方(某系统对某些表数据的变更事件很感兴趣)。

数据总线机制可以看做是实现数据发布,数据订阅,数据通知的基础载体。

▪ 其他目的:

我们可以通过数据同步实现Master/Slave,实现去O,或者实现异地机房间的数据同步(为了灾备或构建双主机房)等。

二、数据同步的分类

我们可以从不同维度和层面对数据同步进行分类,比如:

▪ 离线同步和在线同步

离线同步指源库已经脱线,不对外提供服务,这也意味着源库数据不会再发生变化。目前市面上的常见的开源同步工具基本都是面向离线同步,比如阿里的DataX。

在线同步则正好相反,源库依然对应用层系统提供数据服务,我们需要在数据不断发生变化的情况下将变化数据同步到其他目的库。这里面的变化包括插入、更新、删除,甚至包括DDL操作(添加/删除字段、修改字段类型、Truncate操作等),每一类变化都不好处理。

由此可见,在线同步比离线同步要复杂得多。

▪ 全量同步和增量同步

全量同步很好理解,就是将当前可以看到的源表上的所有数据一次性全部同步到目的库表(源表数量可能非常大);而后针对变化的数据,再进行增量同步。

▪ 实时同步、近实时同步和非实时同步

这是从实时性角度的划分,我们当然希望源库变化的数据越快同步到目的库越好。实时性在时间上并没有明确的定义,但一般我们认为基于binlog复制方式的同步是实时的(虽然大多数binlog复制方式是异步发生的)。

对于我们的自研工具da-syncer,在事务量不大的情况下会在1分钟之内将Oracle主站数据同步到其他目的库,可以看做是近实时同步。

非实时同步则对实时性没有太高要求,比如可以是T + 1。

三、数据同步的痛点

无论做何种数据库产品间的数据同步,我们都面临着一些普遍存在的痛点问题,这些痛点问题如果解决不好,会影响数据同步整体准确性和效果。

下面罗列出一些本人遇到的问题,并提供相应解决方案供大家参考。

 

(1)不同种类数据库字段的类型映射

好的同步工具在做同步任务前会解析源表表结构,并依据源表表结构自动在目的库创建出目的表,然后才进行数据同步操作。

那如何提取出源表的表结构呢?

除了使用JDBC的Metadata接口外,其实更直接更准确的方式是查询源库的元信息表,比如对于Oracle:

SELECT utc.column_id, utc.column_name, t_pk.position, utc.data_type, utc.data_length,

utc.char_length, utc.data_precision, utc.data_scale, utc.nullable

FROM user_tab_columns utc,

(

select ucc.column_name, ucc.position

from user_constraints uc, user_cons_columns ucc

where uc.table_name = ucc.table_name

and uc.constraint_name = ucc.constraint_name

and uc.constraint_type = 'P'

and uc.table_name = ?

) t_pk

where utc.table_name = ?

and utc.column_name = t_pk.column_name(+)

order by t_pk.position asc, utc.column_id asc;

可以将表结构信息,如主键(包括联合主键),数据长度、精度、刻度、是否为null等信息一次性提取到位。对于MySQL也类似,可以从information_schema.columns元信息表提取,这里不再赘述。

如果在同种类数据库间同步数据,则使用上述提取的源表表结构信息直接在目的表建表即可;如果我们需要在不同数据库产品间做数据同步时,则接下来需要知道它们之间字段类型的映射关系,以解决类似Oracle的Number对应MySQL什么数据类型的问题。

通过查阅Oracle官方文档,可以获取这种映射关系https://docs.oracle.com/cd/E12151_01/doc.150/e12155/oracle_mysql_compared.htm#g1034154

(2)主键要求

数据同步对源表上主键的存在性是有要求的,这是因为源表上的每条记录都应该有一个“身份”。尤其在增量同步中,当源表记录发生变化时,我们需要依据这些发生变化的源表记录的“身份”去目的表查找,如果找不到记录就进行插入操作,否则就进行更新操作。

如果同步源是MySQL,则我们可以强制必须存在主键才能进行同步操作,这是因为主键如果不存在,查找会退化成表的全字段匹配,效率非常低下。如果同步源是Oracle,则可以不存在主键,因为我们可以使用Oracle的伪列rowid作为主键。

(3)源表记录获取:游标

在目的表创建完和源表对应的表结构后,我们就可以从源表拉取数据,插入到目的表。

通常情况下我们在应用层程序中进行数据库查询操作,比如在MyBatis中,可以直接使用Mapper注解的方式(@SelectProvider注解),或者将我们的SQL登记在xml中(