sql - 在sql server中同步2个表

标签 sql sql-server sql-server-2008

我在服务器 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/

相关文章:

c++ - SQL Server 按工作日查询,一天不从午夜开始

SQL Server批量插入

sql - SQL Server 中的 SYS_CONNECT_BY_PATH

mysql - 在 groupby 期间聚合满足条件的列的部分部分

php - 使用mysql和php抓取没有订单的用户,简化了这个

mysql - 错误 1005 (HY000) : Can't create table?

sql - 从另一个表的行及其属性创建表

sql - 列出具有最大长度和最大长度的所有 SQL 列

sql - 具有可变数量参数的存储过程

映射表的 SQL 查询直接转换为 JSON