频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

解决两相同数据库数据同步的问题

来源:互联网 作者: 出处:巧巧读书 2006-04-08 进入讨论组

为用户组建一套SQL Server应用系统时,用户经常提到这样的要求:
 
  如果其中一台服务器坏了,怎样才能防止数据丢失,并在最短的时间内恢复系统?

要解决这个问题,肯定需要两台服务器,并在两台服务器上装有相同的数据库,保持两台服务器中的数据同步,当主服务器坏了时,将另外一台服务器更改一下计算机名称,从而使得工作站可以继续运行.

那么如何保持两台数据库中的数据同步呢? SQL Server提供了出版-定阅机制,可以将数据实时的拷贝到定阅服务器中. 但在实际应用中,发现一旦建立起了出版-定阅关系,在定阅服务器数据库中的触发器,主键等东西都不见了!!! 当主服务器不能正常工作时,要想让另一台服务器转变为主服务器,除更改计算机名外,还需建立触发器,索引等,过程比较烦琐.特别当用户对数据库维护不熟悉时,这种操作更加麻烦.

Sql Server做为一种数据库管理系统,它与客户的接口都是通过SQL语句进行的, 用户在插入一条记录时,SQL Server会接收到Insert语句;更改一条记录时,会接收到 Update命令...
那么如果我们能在SQL Server中跟踪到所有发给SQL Server的SQL语句,那么我们就可以知道数据库发生了哪些改变,并可以将这种改变发给另外一到服务器,从而实现数据实时同步的功能.

值得高兴的是,SQL Server 提供了跟踪功能 ,它们是以 xp_trace_XXXXXX的一系列存储过程,
你可以设置过滤条件,从而只跟踪影响你的数据库 变化的SQL 语句,将这些SQL 语句存放在本地表中,再从本地表中读出,发送给另外一台服务器 ,从而实现数据同步功能. 这种方法可以跟踪任何类型的变化,包括Image类型数据的改变.

以下面是用BCB5.0语句实现建立跟踪过程:
bool TForm1 :: BuildTrace(int DBID,
                        AnsiString AppFilter,
                        AnsiString SQLFilter,
                        AnsiString DstTable,
                        int &TraceHandle)
{
    char tempBuf[512];

    Query1 -> Close();
    Query1 -> SQL -> Clear();
    TStrings *pSQL = Query1 -> SQL;


    pSQL -> Add("USE master");
    pSQL -> Add("DECLARE @queue_handle int");
    pSQL -> Add("DECLARE @column_value int");
    pSQL -> Add("SET @column_value = 67108864|1|512|1024|10384");
    pSQL -> Add("EXEC  xp_trace_addnewqueue 1000,5,95,90,@column_value,@queue_handle OUTPUT");
    pSQL -> Add("EXEC xp_trace_seteventclassrequired @queue_handle, 41,1 ");
  
    wsprintf(tempBuf,"EXEC xp_trace_setappfilter @queue_handle,'%s',NULL", AppFilter.c_str());
    pSQL -> Add(AnsiString(tempBuf));

    wsprintf(tempBuf,"EXEC xp_trace_setdbidfilter @queue_handle,%d",DBID);
    pSQL -> Add( AnsiString(tempBuf));

    wsprintf( tempBuf,"Exec xp_trace_settextfilter @queue_handle,'%s',NULL", SQLFilter.c_str());
    pSQL -> Add(AnsiString(tempBuf));

 

   

    wsprintf( tempBuf,
              "EXEC xp_trace_setqueuedestination @queue_handle,4,1,NULL,'%s'",
              DstTable.c_str()
            );
    pSQL -> Add( AnsiString(tempBuf));

    pSQL -> Add("EXEC xp_trace_startconsumer @queue_handle");
    pSQL -> Add("SELECT @queue_handle QueueHandle");

    try
    {
        Query1 -> Open();
    }
    catch(...)
    {
        return false;
    }
    TraceHandle = Query1 -> FieldByName("QueueHandle") -> AsInteger;
    return true;
}


 

保留地址 http://www.qqread.com/sqlserver/h252992005.html 更多文章 更多内容请看数据库专栏数据库处理专题城域网专题专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章