关于sybase Mobilink同步

相信大家在前面的帖子中已经见过MobiLink了,只不过我的操作步骤在第一次写的时候不太正确,所以我整理了两个新的帖子,分为简单和复杂来介绍MobiLink同步技术。欢迎大家灌水,灌得好的就有书啊!

1、需要两个ASA的数据库咯。在命令行方式下,分别键入

dbinit con1.db

dbinit rem1.db

con1这个数据库代表中心数据库,rem1代表远程数据库,我们把中心数据库的数据通过MobiLink同步到rem1来。

2、当然中心数据库里面需要数据了!

在dbisql下,连接con1数据库(连接方法不会发帖子问啊,或者下载文档看)

输入命令:

对con1建表:

CREATE TABLE dept
(
deptno CHAR(4) NOT NULL PRIMARY KEY,
deptname VARCHAR(10) NOT NULL
);


CREATE TABLE employee
(
empno CHAR(5) NOT NULL PRIMARY KEY,
empname VARCHAR(20) NOT NULL,
deptno CHAR(4) NOT NULL,
FOREIGN KEY (deptno) REFERENCES dept(deptno)
);


对con1添加数据:

INSERT INTO dept VALUES('0001', 'admin');
INSERT INTO dept VALUES('0002', 'finance');
INSERT INTO dept VALUES('0003', 'sales');
INSERT INTO dept VALUES('0004', 'presales');
INSERT INTO dept VALUES('0005', 'marketing');
INSERT INTO dept VALUES('0006', 'CS&S');
INSERT INTO dept VALUES('0007', 'ADO');
COMMIT;

INSERT INTO employee VALUES('31274', 'Johnson Zhang', '0005');
COMMIT;

OK。然后再连接上rem1数据库,也要建表,但是不要数据:

CREATE TABLE employee
(
empno CHAR(5) NOT NULL PRIMARY KEY,
empname VARCHAR(20) NOT NULL,
deptno CHAR(4) NOT NULL,
);

我们要做的是一个双向同步的例子,也就是说con1和rem1的数据更改在同步后都会在两端保持一致。

2、通过ODBC管理器,分别建立对两个数据库的ODBC连接,名为“cons”和“rem1”。

3、在dbisql下,连接到rem1数据库,并建立发布:

CREATE PUBLICATION demo1
(
TABLE employee
);

     a. 发布的含义是什么呢?大家灌水回答问题,获赠图书!

     b. 如果我还想发布其他的表怎么办呢?

     c. 如果我只想发布employee表中的前两列,并且是empno大于40000的数据怎么办呢?

     答案可以在http://www.sybase.com.cn/gvswse/site/china/sdn/iAnyDOCIndex.jsp中的《MobiLink 服务器启动同步用户指南》中寻找。


4、创建同步用户:

在dbisql下,

CREATE SYNCHRONIZATION USER "51";


5、建立订阅:

在dbisql下,

CREATE SYNCHRONIZATION SUBSCRIPTION
TO "demo1"
FOR "51"
TYPE 'TCPIP'
ADDRESS 'host=localhost;port=2439'
OPTION ScriptVersion='demo1';

6、触发同步:
在命令行下,
启动MobiLink服务器(这是对Mobilink Server的启动命令,应该在con1所在的计算机上执行):
dbmlsrv9 -dl -v+ -zu+ -x tcpip -c "DSN=con1" -ot ml.txt -za

触发同步(这是客户端触发的同步,应该在rem1所在的计算机上执行):
dbmlsync -c "dsn=rem1" -o rem1.txt -v -e "SendColumnNames=ON"

在这个例子中,我们让MobiLink的服务器自动生成一些同步脚本,MobiLink自动掌管同步过程,双向数据就能保持一致。在复杂的例子中,我们会自己定义一些脚本,自己掌管需要同步的数据。

 

 


本《SQL Anywhere Studio 9开发指南》赠书计划系由Sybase软件(中国)有限公司举办,详细规则清参看:http://community.csdn.net/Expert/topic/4740/4740537.xml?temp=.4594385。请访问iAnywhere开发人员社区(http://www.sybase.com.cn/gvswse/site/china/sdn/iAnywhereDevCommunityIndex.jsp)获得更多关于SQL Anywhere Studio的相关技术信息。

本次活动的解释权归Sybase软件(中国)有限公司。

 

 

====================================================================================

====================================================================================

简单的那个例子相信大家都会做了,不过还是有很多地方不明白的,我们在复杂的这个里面讲。同样支持灌水,并赠书。

前面几步是一样的:

1、需要两个ASA的数据库咯。在命令行方式下,分别键入

dbinit con1.db

dbinit rem1.db

con1这个数据库代表中心数据库,rem1代表远程数据库,我们把中心数据库的数据通过MobiLink同步到rem1来。

2、当然中心数据库里面需要数据了!

在dbisql下,连接con1数据库(连接方法不会发帖子问啊,或者下载文档看)

输入命令:

对con1建表:

CREATE TABLE dept
(
deptno CHAR(4) NOT NULL PRIMARY KEY,
deptname VARCHAR(10) NOT NULL
);


CREATE TABLE employee
(
empno CHAR(5) NOT NULL PRIMARY KEY,
empname VARCHAR(20) NOT NULL,
deptno CHAR(4) NOT NULL,
FOREIGN KEY (deptno) REFERENCES dept(deptno)
);


对con1添加数据:

INSERT INTO dept VALUES('0001', 'admin');
INSERT INTO dept VALUES('0002', 'finance');
INSERT INTO dept VALUES('0003', 'sales');
INSERT INTO dept VALUES('0004', 'presales');
INSERT INTO dept VALUES('0005', 'marketing');
INSERT INTO dept VALUES('0006', 'CS&S');
INSERT INTO dept VALUES('0007', 'ADO');
COMMIT;

INSERT INTO employee VALUES('31274', 'Johnson Zhang', '0005');
COMMIT;

OK。然后再连接上rem1数据库,也要建表,但是不要数据:

CREATE TABLE employee
(
empno CHAR(5) NOT NULL PRIMARY KEY,
empname VARCHAR(20) NOT NULL,
deptno CHAR(4) NOT NULL,
);

我们要做的是一个双向同步的例子,也就是说con1和rem1的数据更改在同步后都会在两端保持一致。

2、通过ODBC管理器,分别建立对两个数据库的ODBC连接,名为“cons”和“rem1”。

3、在dbisql下,连接到rem1数据库,并建立发布:

CREATE PUBLICATION demo1
(
TABLE employee
);

     a. 发布的含义是什么呢?大家灌水回答问题,获赠图书!

     b. 如果我还想发布其他的表怎么办呢?

     c. 如果我只想发布employee表中的前两列,并且是empno大于40000的数据怎么办呢?

     答案可以在http://www.sybase.com.cn/gvswse/site/china/sdn/iAnyDOCIndex.jsp中的《MobiLink 服务器启动同步用户指南》中寻找。


4、创建同步用户:

在dbisql下,

CREATE SYNCHRONIZATION USER "51";


5、建立订阅:

在dbisql下,

CREATE SYNCHRONIZATION SUBSCRIPTION
TO "demo1"
FOR "51"
TYPE 'TCPIP'
ADDRESS 'host=localhost;port=2439'
OPTION ScriptVersion='demo1';


6、注意,我们到此为止做了三件事情:

     a. 搭建了中心数据库(con1)。包含建立ODBC
     b. 搭建了远程数据库(rem1)。包含建立ODBC
     c. 在远程数据库上定义发布、同步用户和订阅

因为MobiLink可支持ASA/UltraLite(远程端)和任何符合ODBC标准的数据源同步,所以要建立ODBC。当然,ASA 10(还没有发布呢)可以支持跟任何数据源的同步(XML、EXCEL、文本文件等)。

定义的发布指的是我们标定远程数据库的哪些表及其这些对这些表的相关投影和选择后的数据是需要同步的。

订阅可以让中心服务器与远程数据库的数据按照定义的订阅规则交互。

MobiLink是先做上载的,也就是说先把远程的数据上载到服务器端,当然你也可以不做上载。
MobiLink在做完上载后做下载,也就是把服务器端的数据下载到远程数据库上,这样就保持了con1和rem1两个数据库的一致。

另外,MobiLink在做上载的时候是做仅更改的数据,也就是做增量上载,做下载的时候需要一些技巧来完成增量下载,本次主题不讨论这个问题。

对于上载和下载来说,都是通过一些在中心数据库的事件来实现的。这些典型的事件包括:

upload_insert事件
upload_update事件
upload_delete事件

download_cursor事件
等等。

在这里我们仅介绍这几个事件。

对于upload开头的,肯定都是上载事件了。当远程服务器(rem1)和中心服务器(con1)通过MobiLink连接的时候,也就是MobiLink客户端与MobiLink服务器连接了之后,MobiLink客户端根据发布定义创建上载流。

如果在同步与同步期间,符合发布定义的数据有了改变,这些改变后的数据就会包含在上载流中。上载流通过MobiLink到达中心服务器,进而通过upload_insert, upload_update和upload_delete事件控制这些数据的走向。

比如,在这个例子中,我们可以在dbisql下,分别应用ml_add_table_script存储过程来完成对三个事件的定义:

call ml_add_table_script( 'demo1', 'employee', 'upload_insert','INSERT INTO employee( empno, empname, deptno) VALUES (?, ?, ?)')

call ml_add_table_script('demo1', 'employee', 'upload_update', 'UPDATE employee SET deptno=?, empname=? WHERE empno=?')

call ml_add_table_script('demo1', 'employee', 'upload_delete', 'DELETE employee WHERE empno=?')

这样的话,上载上来的数据就可以按照这三个事件的要求进入中心数据库了。当然,你可以根据自己的要求改变这三个事件中的SQL语句。demo1作为版本编号来讲非常重要,他要与客户端的订阅中的版本号一致。

然后,上载完成了。MobiLink服务器就会根据download_cursor事件的要求来组织下载,下载的数据传到MobiLink客户端后会应用到远程数据库。

call ml_add_table_script('demo1', 'employee', 'download_cursor', 'SELECT empno, empname, deptno FROM employee')

这条语句定义了download_cursor事件,这个事件中的结果集将下载并应用到远程数据库。

所以,这样的话,整个同步的搭建工作就差不多了,接下来,我们就启动同步服务器并触发同步。

7、启动同步服务器:

在cmd下
dbmlsrv9 -dl –v+ –zu+ -x tcpip -c "DSN=cons" –ot ml.txt
这样,MobiLink服务器就启动了,同时也不像简单的那个例子一样,它不支持自动生成脚本,因为脚本我们已经定义了。本命令在con1所在的计算机上执行。

触发同步:
在cmd下,
DBMLSync –c "dsn=rem1" –v –dl  –o rem1.txt
本命令在rem1所在计算机上执行。这样的话呢,我们就从客户端触发了一次同步,对数据进行了同步。

在同步完成后,你可以关闭DBMLSync所开启的窗口,把中心和远程的数据都更改一下,再次DBMLSync,再看看。

 

今天早上6:50起床,赶早一个小时到公司写这个,希望能帮助大家!这次没有做实验了,工作实在太忙了。中间有疏漏,有问题希望大家原谅阿!

有问题欢迎提问,欢迎灌水,Sybase的iAnywhere开发者计划管事的告诉我了,书还有,大家快抢啊!!自己先寒一个!

 


本《SQL Anywhere Studio 9开发指南》赠书计划系由Sybase软件(中国)有限公司举办,详细规则清参看:http://community.csdn.net/Expert/topic/4740/4740537.xml?temp=.4594385。请访问iAnywhere开发人员社区(http://www.sybase.com.cn/gvswse/site/china/sdn/iAnywhereDevCommunityIndex.jsp)获得更多关于SQL Anywhere Studio的相关技术信息。

本次活动的解释权归Sybase软件(中国)有限公司。

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

ygh1828(), MobiLink的同步过程是先从远程数据库上载到中心数据库,然后再下载中心数据库的数据。

这样的话,要同步哪些数据,首先是远程数据库说了算的。也就是说,远程数据库定义了发布,即要同步的表,或某些表的列,或某些表的行,将来MobiLink服务器在同步过程中首先会去看看那些数据是可以同步的。

那同步用户就不用描述了。

订阅呢,我翻译可能有点问题。我也不知道应该怎么翻译了,刚查了一下帮助,叫 预订发布。

预定发布指的是一个名为什么样的发布(比如刚才我们定义的demo1发布),应该发布到/通过何种方式发布到哪个MobiLink Server上面去。

所以,发布、同步用户和预订发布都是用来规范远程数据库的数据同步的,应该在远程数据库端执行。

服务器端通过脚本事件控制(比如download_cursor, upload_insert等)。

--------------------------------------------------------------------------------------------------------------------
======================================

=========================================

在前面两个例子中,我们已经简单讲述了如何通过MobiLink同步数据,事件的基本含义和如何编写事件脚本。我们将一直把这个例子继续下去,尽量覆盖多的MobiLink问题。

在本例中,可能会延续前面例子的配置,请大家参照:

Book Award Plan: 重新整理的MobiLink例子(复杂) (http://community.csdn.net/Expert/topic/4869/4869937.xml?temp=.1179773)

Book Award Plan: 重新整理的MobiLink例子(简单) (http://community.csdn.net/Expert/TopicView1.asp?id=4869837)

本次讨论的问题是“数据分区”的上半部分。

所谓“数据分区”,并非向各位看到题目所想到的那个表分区。我们并非把物理表按照一定规则划分成小片,而是通过适当的手段将合适的数据同步到不同的地方,让数据寻找自己的路,叫“数据分区”。

数据同步有几个要点,其中很重要的一个就是“只传输需要的数据”。为什么这么讲呢,其中包含两个方面,第一个方面指的是要增量传输,第二个方面讲的是不是所有的数据都传到一个地方,而是可能一个表中的数据有的需要传到这个地方,有的需要传到另外一个地方。

关于“增量同步”,MobiLink在远程数据库端已经完全可以满足要求,因为它是通过读取日志的方法完成的。这也是为什么远程数据库一定要是ASA / UltraLite的原因。那么中心数据库端呢?由于中心数据库端可以使用任何符合ODBC标准的数据源,所以,MobiLink就没有办法读取其日志,也很难自动实现增量的功能。当然,MobiLink有一些控制机制以达到效果。这个主题我们下次介绍。

今天的主题是,把表中的一部分数据传输到一个地方。

假设这样的情况,我们在前两个例子中已经有了employee这张表,这张表里面有很多员工信息,这些员工信息都需要同步到领导的手里。大家在前面的例子实验过程中可能不难发现,数据是全部同步的,也就是说,con1和rem1的employee表的数据是完全一致的。但是,如果这个领导是某个部门的经理,只需要该部门的数据,而不需要其他部门的数据,怎么办呢?

有的人马上会说,那么把download_cursor里面的语句改一下,变成where deptno = 'XXXX'不就可以了么?当然,但是这只能解决这一个用户的问题。如果有大量用户同时同步,而download_cursor事件是表级别的事件,也就是说,一个表才一个download_cursor,那where子句是固定的,也就意味着所有的同步用户将只能得到XXXX部门的信息,怎么办呢?

仔细研究一下download_cursor事件你就会发现,里面会包含两个参数,last_download和ml_username。

还记得我们在前面的例子中都建立了一个叫51的用户么?今天我们就来用它。

在实验之前,请务必一定要把中心数据端的数据和远程数据库端的数据弄得不一致。比如,我现在在con1的employee里面的数据是这样的:

empno   empname          deptno
'31274' 'Johnson Zhang'  '0001'
'7195'  'Grace Chow'     '0005'


rem1里面的employee只有:

empno   empname          deptno
'31274' 'Johnson Zhang'  '0001'


上次同步的结果。

接下来,在dbisql中连上con1,书写SQL:

INSERT INTO employee VALUES('7550', '51', '0001');
COMMIT;

注意,我们这个新数据里面的empname有一个字段的值是51,字符串类型的。

接下来,修改一下我们的download_cursor脚本,在dbisql下,连接到con1,

call ml_add_table_script('demo1', 'employee', 'download_cursor', 'SELECT * FROM employee WHERE ? IS NOT NULL AND empname = ?')

其中,第一个?是download_cursor事件中参数last_download的占位符,第二个?是ml_username的占位符。这两个参数是在事件触发的时候自动传入的,并且自动匹配的,两个问号都必须出现,自动匹配数据类型。所以,empname字段的数据类型是字符串的,正好和传入参数一致。

当dbmlsync触发同步的时候,触发同步的同步用户名称将代替第二个?的值,这样的话,就解决我们前面讲的所谓“灵活”的问题了。

我们应该在中心数据库端(con1)建立同步用户(这是前面的例子都忽略了的):

CREATE SYNCHRONIZATION USER "51";

接下来,我们同步一下。当然,先启动MobiLink服务器:

在cmd下,

dbmlsrv9 -dl -v+ -x tcpip -c "DSN=cons" -ot ml.txt

和上两次不一样的是,不需要-zu选项了,看看帮助,-zu选项是无论任何用户都可同步的,其实这个选项不建议使用。不过我们前两次没有在中心数据库端建立匹配的同步用户。

在cmd下,触发同步:

DBMLSync -c "dsn=rem1" -v -dl  -o rem1.txt -u 51

这次的DBMLSync里面加上了51用户,这样的话,51传入download_cursor事件,将来在rem1里面只会有原来那条数据和51这条数据,Grace Chow那条数据是不可能有的。

这样,我们就达到了数据分区的效果,让数据分别到达他想到达的地方。


总结:为了达到同步不同数据的效果,可在服务器端设立字段与同步用户相关。在相应的同步事件中使用传入参数即可。


有问题欢迎提问,欢迎灌水!

 


本《SQL Anywhere Studio 9开发指南》赠书计划系由Sybase软件(中国)有限公司举办,详细规则清参看:http://community.csdn.net/Expert/topic/4740/4740537.xml?temp=.4594385。请访问iAnywhere开发人员社区(http://www.sybase.com.cn/gvswse/site/china/sdn/iAnywhereDevCommunityIndex.jsp)获得更多关于SQL Anywhere Studio的相关技术信息。

本次活动的解释权归Sybase软件(中国)有限公司。

你可能感兴趣的:(sybase,数据库,insert,download,upload,服务器)