我在服务器 A 上有一张表,在另一台服务器 B 上有同一张表。 我想每天用服务器 B 的数据更新一次服务器 A 上的表。服务器 A 上的表有超过 1 亿条记录。我怎样才能做到这一点,以便在我更新服务器 A 上的表上的数据时,它仍然可用于读取以前的信息。
预期行为:
服务器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 上的表中的数据的行为,并且这是立即(几乎立即)完成的。
最佳答案
Andomar 已经建议如何通过使用暂存表和好的 ole'sp_rename
技巧使整个新数据集“立即”可见。该主题有多种变体,例如使用分区表并切换出现有数据,然后切换到暂存表,请参阅 Transferring Data Efficiently by Using Partition Switching .
另一种方法是使用快照隔离。使用快照隔离,您可以删除表中的所有行并在事务中插入新行,并且不会阻塞任何读取器,因为所有读取器将继续使用旧行版本。参见 Understanding Row Versioning-Based Isolation Levels .
但人们不得不质疑涉及每天传输 100M 的计划是否合理。是行不通的。在单个事务中操作 100M 行的想法也是如此,最有可能的结果是您的事务日志文件将增长,直到它们填满整个驱动器,然后服务器将翻转并死掉。
您最可能需要的是 Filip 建议的解决方案之一:复制、镜像或日志传送。这些解决方案的一个很好的比较是 High Availability with SQL Server 2008白皮书。
关于sql - 在sql server中同步2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996522/