2009-05-29 22 views
5

Tôi có cơ sở dữ liệu trực tiếp đã xóa một số dữ liệu và tôi cần dữ liệu đó trở lại. Tôi có một bản sao gần đây của cơ sở dữ liệu đó đã được khôi phục trên một máy khác. Những thay đổi không liên quan đã được thực hiện cho cơ sở dữ liệu trực tiếp từ bản sao lưu, vì vậy tôi không muốn xóa sạch cơ sở dữ liệu trực tiếp với khôi phục hoàn toàn. Dữ liệu tôi cần là nhỏ - chỉ một tá hàng - nhưng hàng chục hàng đó có một vài hàng từ các bảng khác với khóa ngoài, và vài hàng có thần biết bao nhiêu hàng có khóa ngoài trỏ tới chúng , vì vậy sẽ rất phức tạp để khôi phục bằng tay. Lý tưởng nhất là tôi có thể nói với bản sao lưu của cơ sở dữ liệu để chọn hàng chục hàng tôi cần, và đóng cửa chuyển tiếp mọi thứ mà họ phụ thuộc vào, và mọi thứ phụ thuộc vào chúng, và chỉ xuất dữ liệu đó, mà sau đó tôi có thể nhập vào cơ sở dữ liệu trực tiếp mà không cần chạm vào bất kỳ thứ gì khác.Làm cách nào để giải cứu một phần nhỏ dữ liệu từ bản sao lưu cơ sở dữ liệu SQL Server?

Cách tiếp cận tốt nhất để thực hiện ở đây là gì? Cảm ơn.

Mọi người đều đã đề cập đến sp_generate_inserts. Khi sử dụng điều này, làm thế nào để bạn ngăn chặn cột Identity khỏi làm rối tung mọi thứ? Bạn chỉ cần bật IDENTITY INSERT trên?

+0

+1, chúc may mắn! –

Trả lời

1

Tôi đã gặp phải các tình huống tương tự trước đây, nhưng nhận thấy rằng thực hiện nó bằng tay làm việc tốt nhất cho tôi.

Tôi đã khôi phục bản sao lưu sang máy chủ thứ hai và truy vấn để nhận thông tin tôi cần, sau đó tạo tập lệnh để chèn dữ liệu sp_generate_inserts và sau đó lặp lại cho mỗi bảng có các hàng quan hệ.

Tổng cộng, tôi chỉ có khoảng 10 bản ghi chính có dữ liệu quan hệ trong 2 bảng khác. Nó chỉ mất khoảng một giờ để có được mọi thứ trở lại như trước.

CẬP NHẬT Để trả lời câu hỏi của bạn về sp_generate_inserts, miễn là bạn chỉ định @ chủ sở hữu = 'dbo', nó sẽ thiết lập chèn sắc để ON và sau đó đặt nó để tắt ở phần cuối của kịch bản cho bạn.

+0

Tôi đã thành công. sp_generate_inserts là hữu ích, nhưng nó không thành công (như nó nói nó sẽ) trên các bảng với nhiều cột và bảng có cột nvarchar. Và, bạn được giới hạn 128 ký tự cho mệnh đề WHERE của bạn. Kết quả là, tôi khá nhiều đã phải làm ít nhất một điều bằng tay cho mỗi bảng. –

1

bạn sẽ phải khôi phục bằng tay. Các sp_generate_inserts là tốt cho dữ liệu mới. nhưng để cập nhật dữ liệu tôi thực hiện theo cách này:

SELECT 'Update YourTable ' 
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL') 
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL') 
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable 

bạn cũng có thể tạo chèn theo cách này, nhưng sp_generate_inserts thì tốt hơn. Xem những giá trị nhận dạng đó và chúc may mắn (tôi đã gặp vấn đề này trước đây và biết bạn đang ở đâu ngay bây giờ).

truy vấn hữu ích:

--find out if there are missing rows, and which ones 
SELECT 
    b.key,c.key 
    from backupserver.databasename.owner.YourTable b 
     LEFT OUTER JOIN YourTable     c ON b.key=c.key 
    WHERE c.Key is NULL 

--find differences 
SELECT 
    b.key,c.key 
    from YourTable            c 
     LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key 
    WHERE b.Key is not null 
     AND ( ISNULL(c.column1,-9999)  != ISNULL(b.column1,-9999) 
      OR ISNULL(c.column2,'~')  != ISNULL(b.column2,'~') 
      OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE()) 
      ) 
0

SQL Server Management Studio cho SQL Server 2008 cho phép bạn xuất dữ liệu bảng như báo cáo chèn. Xem http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx. Cách tiếp cận này thiếu một số tính linh hoạt của sp_generate_inserts (bạn không thể chỉ định mệnh đề WHERE để lọc các hàng trong bảng của bạn), nhưng có thể đáng tin cậy hơn vì nó là một phần của sản phẩm.

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