2011-11-03 69 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秒/分鐘計算

每個建議的解決方案都需要這些服務器的一些權限。您需要權限才能設置複製,鏡像,日誌傳送或創建觸發器+作業。