2011-11-03 68 views
3

我在服务器A上有一个表,在另一个服务器B上有同一个表。 我想用服务器B的数据每天更新一次服务器A上的表。服务器A上的表有超过1亿条记录。我该如何做到这一点,以便在更新服务器A上的表格上的数据时,它仍然可以使用以前的信息进行阅读。在sql server中同步2个表

预期的行为:

服务器A:

create table tbl_transaction_test (
    tabid int identity, 
    first_name nvarchar(255), 
    last_name nvarchar(255), 
    [address] nvarchar(255), 
    update_dt datetime 
) 

服务器B:

create table tbl_transaction_test (
    tabid int identity, 
    first_name nvarchar(255), 
    last_name nvarchar(255), 
    [address] nvarchar(255), 
    update_dt datetime 
) 

begin transaction transaction1 
truncate table A 
Insert into A.tbl_transaction_test 
    select * from B.tbl_transaction_test 
commit transaction transaction1 

,并在同一时间,我想从表服务器A上选择

如何才能获得以下行为:服务器A上的表中的数据仅在tr ansaction被提交,并立即(几乎立即)完成。

+0

类似:http://stackoverflow.com/questions/5082585/drop-and-create-table-inside-transaction-on-sql-server-impact-on-other-processe –

回答

2

Andomar已经建议如何使整个新数据集“一次”可见,通过使用临时表和良好的技巧。这个主题有各种变化,例如使用分区表并切换现有数据,然后切换登台表,请参阅Transferring Data Efficiently by Using Partition Switching

另一种方法是使用快照隔离。通过快照隔离,您可以删除表中的所有行,并在事务中插入新行,并且不会阻止任何读者,因为所有读者都将继续使用旧行版本。见Understanding Row Versioning-Based Isolation Levels

但人们不得不质疑每天转移100M的计划的完整性。仅仅是不可行的。在一次交易中操纵100M行的想法也是如此,最可能的结果是您的交易日志文件将会增长,直到它们填满整个驱动器,然后服务器将翻身并死亡。

您最需要的是Filip建议的解决方案之一:复制,镜像或日志传送。这些解决方案的一个很好的比较是High Availability with SQL Server 2008白皮书。

1

一种方法是使用临时表。将整个源表复制到新表中,并在完成复制时,删除旧表并重命名临时表。

select * 
into A.tbl_transaction_test_staging 
from B.tbl_transaction_test 

begin transaction 
drop A.tbl_transaction_test 
exec sp_rename 'A.tbl_transaction_test_staging', 'A.tbl_transaction_test' 
commit transaction 

重命名操作相当快。

+0

这不是OP问的问题。表位于不同的服务器上,他要求在同步和同步过程中查询两个表以立即发生(几乎)。 –

+0

@FilipPopović:这个答案不提供哪部分? – Andomar

+0

问题是,当我删除表格时,我无法再查询表格。这也是一种解决方案,也跨越了我的想法 –

2

也许你应该从High Availability Solutions Overview文章开始,如果你想内置功能。请注意,为了使用这些功能,您应该在两台服务器上拥有适当的权限。简而言之:

  • Replication - 保持由
  • Log shipping同步源数据库和目标数据库 - 从一个数据库/服务器发送事务日志备份到一个或多个数据库/服务器和应用它们的目标数据库
  • Mirroring - 基本上,它将活动事务日志记录流发送到目标服务器并将其应用到目标数据库

不要忘记检查您的SQL Server版本s和许可证支持复制/镜像/日志传送(或者如果您决定使用它,则在文章中提到的群集故障转移)。

也可以使自定义解决方案(复制等)与触发源表:

  1. 触发将保留更改的记录在日志表时间戳列和状态(更新,插入,删除)。
  2. 复制这个单独的表中的目的地服务器,其中时间戳> last_timestamp_you_transfered上预定义的间隔(使用作业)
  3. 将更改应用到目标服务器(改变其中时间戳> last_timestamp_applied)

注:

  • 您可以随时保持日志表小删除记录,其中时间戳小于上次处理的时间
  • 您可以通过编写将执行转换的应用程序来避免作业每x秒/分钟计算

每个建议的解决方案都需要这些服务器的一些权限。您需要权限才能设置复制,镜像,日志传送或创建触发器+作业。