首先非常感谢zlp321002(龙卷风2006)的回答。数据实时同步并不要求很高。不过,只采用sqlserver2000自带的复制功能实现起来应该不会有问题吧。但是如果采用网络通信方面的数据包机制效果会怎样呢。例如采用udp方式传送,socket协议等。我想实现数据传输时,只传输连锁店上次传输后修改的数据,不知道这样怎样从数据库日志文件中提取这些记录。

解决方案 »

  1.   

    数据库日志文件中提取这些记录,邹建书上有一个示例,参考下:/*--说明:
    下面的代码演示了如何利用日志还原功能,将主数据库中的数据变化及时反馈到备用数据库中
    备用数据库的数据可以随时用于查询,但不能被更新(备用数据库只读)。
    --*/--首先,创建一个演示用的数据库(主数据库)
    CREATE DATABASE Db_test
    ON
    ( NAME = Db_test_DATA,
          FILENAME = 'c:\Db_test.mdf' )
    LOG ON 
    ( NAME = Db_test_LOG,
       FILENAME = 'c:\Db_test.ldf')
    GO--对数据库进行备份
    BACKUP DATABASE Db_test TO DISK='c:\test_data.bak' WITH FORMAT
    GO--把数据库还原成备用数据库(演示主数据库与这个备用数据库之间的同步)
    RESTORE DATABASE Db_test_bak FROM DISK='c:\test_data.bak' 
    WITH REPLACE,STANDBY='c:\db_test_bak.ldf'
    ,MOVE 'Db_test_DATA' TO 'c:\Db_test_data.mdf'
    ,MOVE 'Db_test_LOG' TO 'c:\Db_test_log.ldf'
    GO--启动 SQL Agent 服务
    EXEC master..xp_cmdshell 'net start sqlserveragent',no_output
    GO--创建主服务器数据训与备用服务器数据库之间同步的作业
    DECLARE  @jogid uniqueidentifier
    EXEC msdb..sp_add_job
    @job_id = @jogid OUTPUT,
    @job_name = N'数据同步处理'--创建同步处理步骤
    EXEC msdb..sp_add_jobstep 
    @job_id = @jogid,
    @step_name = N'数据同步',
    @subsystem = 'TSQL',
    @command = N'
    --主数据库中进行日志备份
    BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT--备用数据库中还原主数据库的日志备份(应用主数据库中的最新变化
    --实际应该时主数据库备份与备用数据库的还原作业应该分别在主服务器和备用服务器上建立,并且备份文件应该放在主服务器和备用都能访问的共享目录中
    RESTORE LOG Db_test_bak FROM DISK=''c:\test_log.bak'' WITH STANDBY=''c:\test_log.ldf''',
    @retry_attempts = 5,
    @retry_interval = 5--创建调度(每分钟执行一次)
    EXEC msdb..sp_add_jobschedule
    @job_id = @jogid,
    @name = N'时间安排',
    @freq_type=4,
    @freq_interval=1,
    @freq_subday_type=0x4,
    @freq_subday_interval=1,
    @freq_recurrence_factor=1-- 添加目标服务器
    EXEC msdb.dbo.sp_add_jobserver 
    @job_id = @jogid,
    @server_name = N'(local)' 
    GO--通过上述处理,主数据库与备用数据库之间的同步关系已经设置完成
    --下面开始测试是否能实现同步--在主数据库中创建一个测试用的表
    CREATE TABLE Db_test.dbo.TB_test(ID int)
    GO--等待1分钟30秒(由于同步的时间间隔设置为1分钟,所以要延时才能看到效果)
    WAITFOR DELAY '00:01:30'
    GO--查询一下备用数据库,看看同步是否成功
    SELECT * FROM Db_test_bak.dbo.TB_test/*--结果:
    ID          
    ----------- (所影响的行数为 0 行)
    --*/--测试成功
    GO--最后删除所有的测试
    DROP DATABASE Db_test,Db_test_bak
    EXEC msdb..sp_delete_job @job_name=N'数据同步处理'
    GO
    /*===========================================================*//*--服务器档机处理说明
    使用这种方式建立的数据库同步,当主数据库不可用时(例如,主数据库损坏或者停机检修)
    可以使用以下两种方法使备用数据库可用。
    --*/--1. 如果主数据库损坏,无法备份出最新的日志,可以直接使用下面的语句使备用数据库可读写(丢失最近一次日志还原后的所有数据)。
    RESTORE LOG Db_test_bak WITH RECOVERY
    --2. 如果主数据库可以备份出最新日志,则可以使用下面的语句。
    --先备份主数据库的最新的事务日志
    BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT
    --再在备用数据库中恢复最新的事务日志,并且使备用数据库可读写(升级为主数据库)
    RESTORE LOG Db_test_bak FROM DISK='c:\test_log.bak'
      

  2.   

    再次感谢zlp321002(龙卷风2006) 给予的详细的答复。这种数据库之间的数据同步。在多个连锁店数据库同一个中心数据库之间实现起来难度大吗?是不是采用这样方式就能够完全实现了需求呢。不需要另外写程序实现吗