2012-12-22 32 views

Trả lời

43

SQL - Linked server

Nếu cả hai máy chủ là SQL Server, bạn có thể thiết lập Linked servers - Tôi sẽ đề xuất sử dụng tài khoản SQL để bảo mật ở đó.

Sau đó, bạn chỉ có thể thực hiện

insert into server2.database1.dbo.table1 
select * from server1.database1.dbo.table1 where col1 = 'X' 

Nếu bạn chạy các truy vấn trong studio Management SQL kết nối với server1, và cơ sở dữ liệu hiện tại thiết lập để database1, bạn sẽ không cần tiền tố

server1.database1.dbo. 

Ngoài ra, máy chủ được liên kết sẽ được cấu hình trên server1, để kết nối với server2 (thay vì cách khác).

Nếu bạn có trình điều khiển OLE DB chính xác, phương pháp này cũng có thể hoạt động giữa các loại RDBMS khác nhau (ví dụ: các máy chủ không phải SQL Server).

mở Query

Lưu ý: Hãy coi chừng không phải dựa trên các máy chủ liên kết quá nhiều đặc biệt đối với lọc và cho tham gia trên khắp các máy chủ, vì chúng đòi hỏi dữ liệu được đọc đầy đủ cho RDBMS có nguồn gốc trước khi bất kỳ điều kiện có thể được áp dụng. Nhiều biến chứng có thể phát sinh từ Máy chủ được Liên kết, vì vậy hãy đọc trước khi bạn bắt tay, vì ngay cả những khác biệt về phiên bản cũng có thể gây đau đầu.

Tôi khuyên bạn nên sử dụng lệnh OPENQUERY cho Máy chủ SQL để tránh xung đột như vậy.Dưới đây là một ví dụ, nhưng bạn nên tìm sự giúp đỡ cụ thể yêu cầu của bạn thông qua nghiên cứu thêm:

insert into server2.database1.dbo.table1 
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X'''); 

Đoạn mã trên là hiệu quả hơn, lọc dữ liệu trên máy chủ nguồn (và sử dụng chỉ số có sẵn), trước khi bơm các dữ liệu thông qua , tiết kiệm băng thông/thời gian/tài nguyên của cả máy chủ nguồn và đích.

(Cũng lưu ý các dấu nháy kép '', là một dãy thoát để tạo ra một dấu nháy đơn.)

SQL - Tạm thời trên cùng một máy chủ

Sẽ cho phép (chú ý dấu gạch dưới):

insert into server2_database1.dbo.table1 
select * from database1.dbo.table1 

Vẫn nằm trong miền truy vấn SQL. Nếu bạn có thể tạm thời di chuyển cơ sở dữ liệu trên server2 đến server1, thì bạn sẽ không cần máy chủ được liên kết. Một sự đổi tên của cơ sở dữ liệu sẽ xuất hiện được yêu cầu trong khi đồng định vị trên server1. Đạt được như vậy đồng vị trí có thể sử dụng phương pháp khác nhau, tôi khuyên bạn nên thu hẹp các file cơ sở dữ liệu trước khi tiếp tục với một trong hai:

  1. Backup/Restore - Backup trên server2, Restore trên server1 (với tên khác) - thực hiện chèn như mô tả ở trên , nhưng không có tiền tố server1 hoặc server2. Sau đó đảo ngược - sao lưu trên server1, khôi phục trên máy chủ2/
  2. Tháo/đính kèm - Đổi tên cơ sở dữ liệu, tách trên máy chủ 1, (giải nén), đính kèm trên máy chủ 1, thực hiện chèn. Sau đó, đảo ngược ...

Trong cả hai trường hợp, phiên bản SQL Server có thể là rào cản. Nếu server1 có phiên bản SQL thấp hơn, thì cả hai phương thức sao lưu và tháo/đính kèm đều có khả năng bị lỗi. Điều này có thể được làm việc xung quanh bằng cách di chuyển cơ sở dữ liệu server1 đến server2, có thể hoặc có thể không phù hợp hơn.

phương pháp khác

Có thể là phù hợp, không SQL/TSQL phương pháp không yếu tố môi trường thuận lợi cho các phương pháp đã đề cập. Và nếu bạn có quyền truy cập chính xác (OLE DB Drivers, vv ..), phương thức này cũng có thể làm việc giữa các kiểu RDBMS khác nhau (ví dụ: các máy chủ không phải SQL Server) và các nguồn dữ liệu (chẳng hạn như XML, flatfiles, Excel Spreadsheets) ...)

  • SSIS Rõ ràng với Phát triển Kinh doanh Management Studio - datapump trực tiếp hoặc sử dụng phân tập intermeditary.
  • SSIS Ngắt qua Phòng quản lý SQL, bằng cách nhấp chuột phải vào cơ sở dữ liệu1 trên máy chủ1> Công việc> Xuất, sau đó hoàn tất trình hướng dẫn. Có thể làm việc trực tiếp đến server2, hoặc sử dụng một tập tin phẳng tập trung.
  • . Lập trình Net với SqlBulkInsert (Tôi tin rằng gói dữ liệu SSIS sử dụng một đối tượng), tôi có thể đi vào chi tiết hơn về điều này, nếu bạn quan tâm.

Ví dụ:của 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); 
    } 
} 

Khá tuyệt huh? Nếu tốc độ/hiệu quả là một mối quan tâm - phương pháp tiếp cận dựa trên SqlBulkInsert (Chẳng hạn như SSIS) là tốt nhất.

Update - Sửa đổi bảng điểm đến

Nếu bạn cần cập nhật bảng điểm đến, tôi khuyên bạn nên:

  1. Viết thư cho một bảng dàn dựng trên cơ sở dữ liệu đích (một bảng tạm thời, hoặc bảng thích hợp mà bạn cắt ngắn trước và sau khi xử lý), sau này là thích hợp hơn. Trước đây có thể là lựa chọn duy nhất của bạn nếu bạn không có quyền TẠO TẠO. Bạn có thể thực hiện chuyển khoản bằng bất kỳ tùy chọn nào ở trên.
  2. Chạy lệnh MERGE INTO theo yêu cầu của bạn từ bảng dàn xếp đến bảng đích. Điều này có thể chèn, cập nhật và xóa theo yêu cầu rất hiệu quả.

Toàn bộ quá trình này có thể được tăng cường bằng cửa sổ trượt (thay đổi kể từ lần kiểm tra cuối cùng), chỉ sử dụng các hàng đã thay đổi gần đây trong nguồn mà áp dụng cho đích, vì vậy bạn nên thực hiện đơn giản hơn đầu tiên. Sau khi hoàn thành phiên bản cửa sổ trượt, bạn có thể chạy phiên bản cập nhật đầy đủ định kỳ để đảm bảo không có lỗi trong cửa sổ trượt.

+1

Cảm ơn bạn đã đề cập đến vấn đề với JOINing trên các máy chủ được liên kết. Ngay cả khi không được sử dụng trong JOIN, vẫn còn các vấn đề với DML trên các Máy chủ được Liên kết có thể thực sự làm chậm mọi thứ. +1. Ngoài ra, liên quan đến việc sử dụng 'SqlBulkInsert' thông qua SQLCLR, nếu ai đó muốn làm điều này nhưng không biết cách thực hiện nó hoặc chỉ không muốn dành thời gian cho nó, phiên bản miễn phí của [SQL #] (http : //www.SQLsharp.com/) thư viện (mà tôi là tác giả của) chứa một thủ tục được lưu trữ, ** DB_BulkCopy **, điều này thực hiện điều này và cho thấy hầu hết các tùy chọn (ví dụ:BulkCopyOptions, ánh xạ cột, kích thước hàng loạt, v.v.). –

+1

@srutzky Tôi thích sử dụng chức năng Nhập/Xuất dữ liệu của SQL Server Managment Studio cho các nhiệm vụ một lần và với bất kỳ ấn bản nào lớn hơn Express, bạn có thể lưu các quy trình đó dưới dạng Tập lệnh SSIS để chỉnh sửa/sử dụng lại. SQL # có vẻ tiện dụng, tôi sẽ dùng thử một ngày. – Todd

8

Để sao chép dữ liệu giữa hai máy chủ khác nhau mà bạn có nhiều lựa chọn:

+0

Tôi không có ý trình tự, tôi biết nó là 'chèn vào [,,,] ... chọn [,,,] từ ...' Ý tôi là làm thế nào để sao chép dữ liệu giữa hai máy chủ. –

+0

@mahditahsildari: Bạn có thể sử dụng các máy chủ được liên kết. –

1

Cách tốt nhất để làm điều này sẽ tạo ra một "máy chủ liên kết". Và sau đó bạn có thể sử dụng dưới đây tuyên bố vào tuyên bố chèn của bạn để xác định bảng

[linkedserver].databasename.dbo.tablename 
3

Tương tự như Todd C# SqlBulkCopy

Nói chung việc này dễ dàng hơn việc tạo các máy chủ được liên kết.

Tạo thử nghiệm đơn vị và chạy dưới đây, nếu bạn có trình kích hoạt thì hãy cẩn thận và bạn sẽ cần quyền 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); 
        } 
       } 
      } 
     } 
    } 
} 
0

Trước tiên, bạn cần thêm máy chủ Ví dụ: Server 1 và Server 2

sp_addlinkedserver 'Server-2'

sau đó sao chép dữ liệu từ máy chủ đến máy chủ của bạn bằng cách sử dụng sau đây truy vấn

Trong Server-1 Viết

select * INTO Employee_Master_bkp 
FROM [Server-2].[DB_Live].[dbo].[Employee_Master] 
0

Nếu bạn cần một sự thay thế mà không cần bằng cách sử dụng Máy chủ được Liên kết, tùy chọn ưa thích của tôi là sử dụng tiện ích BCP dòng lệnh. Với công cụ sao chép số lượng lớn này, bạn có thể xuất dữ liệu sang tệp phẳng, sao chép tệp trên mạng và nhập tệp (tải nó) lên máy chủ đích.

https://docs.microsoft.com/en-us/sql/tools/bcp-utility

Các vấn đề liên quan