首页 > 开发 > 综合 > 正文

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

2024-07-21 02:09:09
字体:
来源:转载
供稿:网友

在上一篇<<解决两相同数据库数据同步的问题>> ,由于时间关系,没有对buildtrace函数给出说明,在此做以补充 .

笔者是在山东潍坊出差时,遇到了用户要求的提供双机热备份功能,
最终的解决方案是:
 在主服器上运行同步程序(用bcb5.0编写的程序),同步程序在启动时,在sql server 中建立跟踪过程,跟踪过程将跟踪到的sql 语句存放在主服务器的跟踪表中;
  同步程序每隔半分钟访问跟踪表,将其中的sql 语句发送到备份服务器,并将其删除!


/* 功能: 在sql server中建立跟踪
  输入参数: dbid  - 想要跟踪的数据库的id号,可以用数据库名在      master.dbosysdatabases中查出。
           appfilter - 限制跟踪哪个客户端应用程序提交给sql server的sql语句
           sqlfilter - 限制跟踪哪类的sql 语句,可以控制只跟踪update,insert,delete 语句
           dsttable - 将跟踪到的信息存储到数据库的哪一个表中
           tracehandle -引用类型变量,返回给调用者建立起的跟踪句柄
  返回值: true 成功,false 失败
*/

bool tform1 :: buildtrace(int dbid,
                        ansistring appfilter,
                        ansistring sqlfilter,
                        ansistring dsttable,
                        int &tracehandle)
{
    char tempbuf[512];                

query1 -> close();            //query1 为 tadoquery的组件
                              //实验中发现若用bde中的tquery组件,对跟踪到的 
                              //image类型数据会操作时会发生错误.
    query1 -> sql -> clear();
    tstrings *psql = query1 -> sql;

  
    psql -> add("use master");   //将当前数据库设为master       
    psql -> add("declare @queue_handle int");  
    psql -> add("declare @column_value int");
       // 可以跟踪很多种信息,但通常只需要其中一部分, @column_value用来确定需要哪些信息.
    //下行每个数字代表一列,具体可参见transact -sql help
    psql -> add("set @column_value = 67108864|1|512|1024|10384");
     
       // 加入一个跟踪过程,若成功, @queue_handle将是一个有效的值
    psql -> add("exec  xp_trace_addnewqueue 1000,5,95,90,@column_value,@queue_handle output");
   
   // 以下句设置跟踪条件
   //设置跟踪何种事件, 41为tsql complete事件, 还有其它事件,如连接事件等等,
   // 但对同步功能来说,只需要tsql complete事件.
    psql -> add("exec xp_trace_seteventclassrequired @queue_handle, 41,1 ");
  
   //设置跟踪哪种客户端的发过来的sql 语句,客户端在向sql server发出命令时,都有一个
 // application name
    wsprintf(tempbuf,"exec xp_trace_setappfilter @queue_handle,'%s',null", appfilter.c_str());
    psql -> add(ansistring(tempbuf));
  
    // 设置跟踪针对哪个数据库的sql 语句
    wsprintf(tempbuf,"exec xp_trace_setdbidfilter @queue_handle,%d",dbid);
    psql -> add( ansistring(tempbuf));

  //设置sql 语句的过滤条件,可设置成" update%;delete%;insert%",则只跟踪update
  // insert 和 delete语句
    wsprintf( tempbuf,"exec xp_trace_settextfilter @queue_handle,'%s',null", sqlfilter.c_str());
    psql -> add(ansistring(tempbuf));

 

  //设置将跟踪到的信息存放在哪个表里 ,
   //如果表不存在,则自动创建,表的列数由前面的@colomun_value控制.
   // 为以后方便读出控制,可以在自动创建了这个表后,手工的为其加上id字段(自动增长字段),
  // 并做为主索引.

    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");

   
     // 将批命令提交到sql server, 执行完毕后,跟踪过程就建立起来了
      
    try
    {
        query1 -> open();
    }
    catch(...)
    {
        return false;
    }
    tracehandle = query1 -> fieldbyname("queuehandle") -> asinteger;
    return true;
}

//调用过程
...
int tracehandle
int dbid;

dbid = getdbid("mydb1");    //根据数据库名从sql server的sysdatabases中查询dbid

if( buildtrace( dbid,
                    "myapp",
                     "insert%;update%;delete%",
                     "mydb1.dbo.mytrace")
   == true)
{
    application -> messagebox("跟踪过程已被建立","提示",mb_ok);
}
else
{
 application -> messagebox("跟踪过程建立失败","提示",mb_ok);
}
....

 


收集最实用的网页特效代码!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表