我想是這樣的:兩個服務器實例之間複製數據
insert into server2.database1.table1 select * from server1.database1.table1
兩個表是完全一樣的。
我該怎麼辦在兩個服務器實例之間複製數據?
我想是這樣的:兩個服務器實例之間複製數據
insert into server2.database1.table1 select * from server1.database1.table1
兩個表是完全一樣的。
我該怎麼辦在兩個服務器實例之間複製數據?
SQL - 鏈接服務器
如果兩個服務器的SQL Server,你可以設置Linked servers - 我會建議使用SQL帳戶來保證安全。
然後,你可以簡單地執行
insert into server2.database1.dbo.table1
select * from server1.database1.dbo.table1 where col1 = 'X'
如果您在連接到server1 SQL Management Studio中,和當前的數據庫設置爲數據庫1查詢,您將不再需要前綴
server1.database1.dbo.
另外,鏈接服務器將在server1上配置,以連接到server2(而不是其他方式)。
如果您具有正確的OLE DB驅動程序,則此方法也可以在不同類型的RDBMS(即非SQL Server服務器)之間工作。
打開查詢
注意:當心不要依賴於鏈接服務器太多特別適用於過濾,並加入跨服務器,因爲它們需要在全給始發RDBMS之前的任何條件來讀取數據應用。鏈接服務器可能會產生許多複雜問題,因此在開始之前請仔細閱讀,因爲偶數版本的差異可能會導致麻煩。
我建議您使用SQL Server的OPENQUERY命令來解決這些限制。這裏有一個例子,但你應該通過進一步的研究發現您的具體需要的幫助:
insert into server2.database1.dbo.table1
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X''');
上面的代碼更有效,過濾數據源服務器上(使用可用的索引),通過抽數據之前,節省源服務器和目標服務器的帶寬/時間/資源。
(還要注意雙引號「」,是產生一個單引號的轉義序列。)
SQL - 暫時在同一臺服務器
將使(注意下劃線)上:
insert into server2_database1.dbo.table1
select * from database1.dbo.table1
仍在SQL查詢域中。如果您可以臨時將server2上的數據庫移動到server1,那麼您將不需要鏈接的服務器。在服務器1上共同定位時,似乎需要重命名數據庫。在server2備份,在server1還原(具有不同的名稱) - -
無論哪種情況,SQL Server版本都可能成爲障礙。如果server1的SQL版本較低,則備份和分離/附加方法可能會失敗。這可以通過將server1數據庫移到server2來解決,server2可能更適合,也可能不適合。
其他方法
是合適的,非SQL/TSQL方法未能爲前面提到的方法有利的環境因素。如果您有正確的訪問權限(OLE DB驅動程序等),則此方法也可以在不同類型的RDBMS(即非SQL Server服務器)和數據源(如XML,平面文件,Excel電子表格...)
例如,SQLBulkInsert(psedo-C#code)
SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here");
SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here");
c.Open();
SqlCommand cm = new SqlCommand(c);
cm.CommandText = "select * from table1;";
using (SqlDataReader reader = cm.ExecuteReader())
{
using (SqlBulkInsert bc = new SqlBulkInsert(c))
{
c2.Open();
bc.DestinationTable = "table1";
bc.WriteToServer(reader);
}
}
很酷很棒吧?如果速度/效率是一個問題 - 基於SqlBulkInsert的方法(如SSIS)是最好的。
更新 - 修改目標表
如果您需要更新目標表,我建議你:
這樣的整個過程可以用一個滑動窗口來增強(自上次修改選中),僅考慮在應用到目的地的源最近更改的行,這個過程複雜,所以你應該至少完成首先比較簡單。完成滑動窗口版本後,您可以定期運行完整更新版本,以確保滑動窗口中沒有錯誤。
兩個不同的服務器之間複製數據,您有幾種選擇:
我不是故意的順序,我知道這是'插入[,,,] ...選擇[,,,]從...'我的意思是如何將兩個之間複製數據服務器。 –
@mahditahsildari:您可以使用鏈接的服務器。 –
在服務器A上添加一個鏈接服務器(B)
http://msdn.microsoft.com/en-us/library/ms188279.aspx
然後你就可以在兩者之間傳輸數據。
Export table data from one SQL Server to another
HTH
做到這將是創建一個 「鏈接服務器」 最好的辦法。 然後你就可以使用下面的語句到您的插入語句,以確定你的表
[linkedserver].databasename.dbo.tablename
託德C#SqlBulkCopy的
類似一般來說,這比創建鏈接的服務器更容易。
創建一個單元測試並運行下面的代碼,如果你有觸發器,那麼要小心,你需要ALTER權限。
[Test]
public void BulkCopy()
{
var fromConnectionString = @"fromConnectionString";
var destinationConnectionString = @"destConnectionString2";
using (var testConnection = new SqlConnection(fromConnectionString))
{
testConnection.Open();
var command = new SqlCommand("select * from MyTable;", testConnection);
using (var reader = command.ExecuteReader())
{
using (var destinationConnection = new SqlConnection(destinationConnectionString))
{
using (var bc = new SqlBulkCopy(destinationConnection))
{
destinationConnection.Open();
bc.DestinationTableName = "dbo.MyTable";
bc.WriteToServer(reader);
}
}
}
}
}
}
首先您需要添加服務器 例如,服務器1和服務器2
sp_addlinkedserver 'Server-2'
然後從服務器到服務器,通過使用下面的查詢
在服務器1寫
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]
複製您的數據。如果您需要在沒有替代使用鏈接服務器,我最喜歡的選擇是使用命令行BCP實用程序。 使用此批量複製工具,您可以將數據導出到平面文件,通過網絡複製文件並將其導入(加載)到目標服務器上。
感謝您提及跨鏈接服務器加入問題。即使沒有在JOIN中使用,鏈接服務器上的DML仍然存在問題,這可能會讓事情變慢。 +1。此外,關於通過SQLCLR使用'SqlBulkInsert',如果有人想這樣做但不知道如何完成它,或者只是不想花時間在其上,[SQL#]的免費版本(http ://www.SQLsharp.com/)庫(我是該作者的)包含一個存儲過程** DB_BulkCopy **,它可以完成這些操作並顯示大部分選項(例如BulkCopyOptions,列映射,批量大小等)。 –
@srutzky我喜歡使用SQL Server Managment Studio的導入/導出數據功能執行一次性任務,並且任何大於Express的版本都可以將這些過程另存爲SSIS腳本以進行編輯/重用。 SQL#看起來很方便,有一天我會嘗試一下。 – Todd