为方便完成指定数据表的同步 *** 作,可以采用dblink与merge结合的方法完成。
*** 作环境: 此数据库服务器ip为19216819676,有center与branch两个库,一般需要将center的表数据同步到branch,center为源库,branch为目标库,具体步骤如下:
1在源库创建到目标库的dblink
create database link branch --输入所要创建dblink的名称,自定义
connect to dbuser identified by “password” --设置连接远程数据库的用户名和密码
using '19216819676/branch'; --指定目标数据库的连接方式,可用tns名称
在创建dblink时,要注意,有时候可能会报用户名和密码错误,但实际上我们所输入的账户信息是正确的,此时就注意将密码的大小写按服务器上所设置的输入,并在账号密码前号加上双引号(服务器版本不同造成的)。
2成功后验证dblink
select from tb_bd_action@branch; --查询创建好的brach库
正常情况下,如果创建dblink成功,可采用该方式访问到远程数据库的表
3通过merge语句完成表数据同步
此例中需要将center库中的tb_sys_sqlscripe表同步到branch,简单的语法如下:
merge into tb_sys_sqlscripe@branch b using tb_sys_sqlscripe c on (bpk=cpk) --从center将表merge到branch,同步的依据是两个表的pk
when matched then update set bsqlscripe=csqlscripe,bauthor=cauthor --如果pk值是相同则将指定表的值更新到目标表
when not matched then --如果pk值不一至,则将源表中的数据整条插入到目标表中
insert values (cpk, cfk, ccreatetime, clastmodifytime,cauthor,cmodule,cdeleteflag, cscripttype);
commit; --记得merge后必须commit,否则更改未能提交
4为方便每次需要同步时自动完成同步工作,可将该语句做成存储过程或脚本来定时执行或按要求手动执行,简单说一下创建脚本的方法:
a创建merge文件夹
b先将merge语句写完整后,存到mergesql文件中
c新建mergebat文件,编辑后写入以下内容
sqlplus user/password@serverip/database @"%cd%\mergesql"
你说的数据同步,既然同步,客户端是一定要有存储数据的,这个存储无论是数据库还是XML或者其他的格式。以一个小型应用为例,比如通讯录吧。服务端应该是一个数据中心,客户端对应的也应该有一个相同的数据表,存储本地数据。正如你说的没有网络的时候,不影响使用。如果你的软件是多用户或者多租户版本的。服务端的表结构应该多出一个tenantID和userID来区分用户和租户的数据。客户端和服务端的表结构应该都有创建时间和最后更新时间(可以作为谁同步谁的依据,但不是唯一的。)正如@任文彬提供的思路,但是我觉得这个思路还是比较适合文件类的同步,对于数据库信息的同步,经常涉及到查询比较,性能上可能不会太好。所以不如再增加一个字段“状态”,状态可以分为1待更新,2更新中,3已更新,4待删除,5删除中,6已删除等等。比如客户端进行新增 *** 作,数据插入本地表中,状态为1待更新,同步数据从服务器返回2更新中,更新本地表状态为2,服务器同步完成,更新本地表状态已更新。这样做的好处是,其中无论哪个环节出了问题,比如机器突然断电,或者突然断网,等下次重新使用的时候,都可以根据表的状态码来确定数据是否需要更新。软件的应用场景比如是这样的:客户端是在公司的内网,供用户在公司的桌面端使用,那么内网服务器保存的就是本地数据,但是用户还可能外出的时候通过移动设备来使用软件,这个移动端使用的就应该是服务端的同步数据了。按照这种思路,客户端增删改->改变本地状态码->同步数据中->改变本地状态码->同步完成->改变本地状态码,那如果移动设备对服务端的数据 *** 作呢?也需要改变服务端状态码为待更新、待删除(删除应该区分对待),下次登录客户端的时候自动检查服务端的“状态”为“待 *** 作的”,然后服务端同步到客户端。这样无论是对本地表 *** 作,还是对服务端的直接 *** 作,都可以保证两个表的数据是同步的。涉及数据同步的还需要考虑到数据表主键同一时空唯一性的问题。有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据。不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。假设我们这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步。1在Oracle中建立对应的contract 和 contract_project表,需要同步哪些字段我们就建那些字段到Oracle表中。
这里需要注意的是Oracle的数据类型和SQLServer的数据类型是不一样的,那么他们之间是什么样的关系拉?我们可以在SQLServer下运行:
SELECT
FROM msdbdboMSdatatype_mappings
SELECT
FROM msdbdbosysdatatypemappings
来查看SQLServer和其他数据库系统的数据类型对应关系。第一个SQL语句是看SQL转Oracle的类型对应,而第二个表则更详细得显示了各个数据库系统的类型对应。根据第一个表和我们的SQLServer中的字段类型我们就可以建立好Oracle表了。
SQLServer和Oracle的对应
2建立链接服务器。我们将Oracle系统作为SQLServer的链接服务器加入到SQLServer中。l 当出现同步异常的游戏,可以通过同步日志查看,并可通过重新执行失败任务功能再次同步。%26Oslash; 自动触发游戏同步l 当服务器游戏升级(或者通过手动更新游戏版本号)后,自动触发服务器同步功能。l 相应游戏会自动按照分组方式同步到指定服务器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)