Tôi muốn một cái gì đó như:dữ liệu Sao chép giữa hai trường hợp máy chủ
insert into server2.database1.table1 select * from server1.database1.table1
cả hai bảng là giống hệt nhau.
làm cách nào tôi có thể Sao chép dữ liệu giữa hai phiên bản máy chủ?
Tôi muốn một cái gì đó như:dữ liệu Sao chép giữa hai trường hợp máy chủ
insert into server2.database1.table1 select * from server1.database1.table1
cả hai bảng là giống hệt nhau.
làm cách nào tôi có thể Sao chép dữ liệu giữa hai phiên bản máy chủ?
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:
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) ...)
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:
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.
Để 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:
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ủ. –
@mahditahsildari: Bạn có thể sử dụng các máy chủ được liên kết. –
Trên Server Một thêm một máy chủ liên kết (B)
http://msdn.microsoft.com/en-us/library/ms188279.aspx
Sau đó, bạn có thể chuyển dữ liệu giữa hai người.
Export table data from one SQL Server to another
HTH
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
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);
}
}
}
}
}
}
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]
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.
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.). –
@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