SyBase SQL 随处检查是不是需要同步?

Posted

技术标签:

【中文标题】SyBase SQL 随处检查是不是需要同步?【英文标题】:SyBase SQL anywhere check if Synchronization is needed?SyBase SQL 随处检查是否需要同步? 【发布时间】:2009-12-08 16:48:51 【问题描述】:

我有一个 Sybase SQL Anywhere 11.0.1 数据库,用于与 Oracle 整合数据库同步。

我知道 SQL Anywhere 数据库会跟踪对其所做的所有更改,以便知道要与统一数据库同步哪些内容。我的问题是是否有 SQL 命令可以告诉您数据库是否有要同步的更改。

我有一个移动应用程序,我想在用户对需要同步的手持设备进行更改时向他们显示一个小标志。我可以自己创建另一个表来跟踪这些内容,但我更愿意 ping 数据库并询问它是否有需要同步的更改。

【问题讨论】:

【参考方案1】:

没有什么自动告诉您有数据要同步。除了 Ben 的建议之外,另一个想法是查询远程数据库中的 SYS.SYSSYNC 表,以了解是否可能有更改。以下语句返回一个结果集,显示您上次同步的简单状态:

select ss.site_name, sp.publication_name, ss.log_sent,ss.progress 
from sys.syssync ss, sys.syspublication sp 
where ss.publication_id = sp.publication_id
and ss.publication_id is not null 
and ss.site_name is not null

如果progress < log_sent,那么最后一次同步的状态是未知的。上次上载可能已在合并中应用,也可能未应用,因为上载已发送,但未收到来自 MobiLink 服务器的响应。在这种情况下,建议同步并不是一个坏主意。

如果progress = log_sent,那么最后一次同步成功。知道了这一点,您可以检查db_property('CurrentRedoPos') 的值,它将返回远程数据库的当前日志偏移量。如果此值明显高于进度值,则自上次同步以来已对数据库应用了许多操作,因此很有可能有数据要同步。有很多原因导致即使进程和db_property('CurrentRedoPos') 存在很大差异也可能导致没有实际数据需要同步。

    当 ML 服务器确认上传时,dbmlsync 更新远程进度值后,dbmlsync 应用从 ML 服务器下载。 dbmlsync 在下载中应用的操作不会同步回 ML 服务器,因此整个偏移范围可能只是应用的最后一次下载。当#hook_dict 表值中的退出代码值为零时,可以通过跟踪sp_hook_dbmlsync_end 挂钩中的当前日志偏移来解决此问题。这将告诉您应用下载后数据库的日志偏移量,您现在可以将保存的值与当前日志偏移量进行比较。 事务日志中的所有操作都可能是对未同步的表的操作。 事务日志中的所有操作都可能已回滚。

我的解决方案并不理想。自己跟踪同步表的更改是最好的解决方案,但我认为我可以提供一个可能满足您需求的替代方案,其优点是您不会对同步表上执行的每个操作触发额外操作。

【讨论】:

这非常有用,因为我们还被要求发布一条消息,指示应用程序上次成功同步的时间。谢谢。【参考方案2】:

移动数据库不跟踪上次同步的时间,MobiLink 服务器将所有这些信息保存在统一数据库的 MobiLink 表中。

由于同步只传输必要的信息,您可以简单地启动同步。如果没有要同步的内容,那么您的应用程序将使用很少的数据。

附带说明,SQL Anywhere 有its own SO clone,由 Sybase 工程师监控。如果有人确定,那就是他们。

【讨论】:

警告标志是让用户知道他们应该将移动设备连接到扩展坞并开始同步,因此开始同步不是一个选项,因为设备没有连接。【参考方案3】:

从 SQL Anywhere 17 开始,SAP PM 映射到包含 TTRANSACTION_UPLOAD 表的本地 Sybase 数据库,因此要确定是否需要同步,我们只需查询该表以查看它是否有任何需要同步的记录到 HANA 整合数据库。

【讨论】:

以上是关于SyBase SQL 随处检查是不是需要同步?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Sybase 中是不是存在角色

Sybase 检查值是不是为数字

SQL Server 2008,Sybase - 低带宽上的大型选择查询

Sybase_游标

可能的sybase sql查询

*= 在 Sybase SQL 中