2012-06-06 38 views
5

Tôi muốn sao lưu cơ sở dữ liệu SQL Server với tất cả các đối tượng cùng với dữ liệu nhưng dữ liệu trong tất cả các bảng nên được giới hạn là 100 hàng cho mỗi bảng. Tôi có thể làm điều này trong mysql rất dễ dàng nhưng trong SQL Server tôi không biết làm thế nào để làm gì ??Làm thế nào để sao lưu cơ sở dữ liệu với 100 hàng trong mỗi bảng?

Hãy giúp tôi.

Cảm ơn

Nitesh Kumar

+3

Đó không phải là dự phòng, đang xuất dữ liệu. Mục đích chính của sao lưu là khôi phục thảm họa, nó không có ý nghĩa để hạn chế số lượng hồ sơ. Bạn đang cố gắng để thực hiện? Bạn đã sử dụng các lệnh/công cụ nào với MySQL? –

+1

Trong khi bạn có thể làm được điều này, bạn sẽ sử dụng 100 hàng từ mỗi bảng như thế nào? Có hoàn toàn không có tính toàn vẹn tham chiếu ở tất cả? (Tôi nghi ngờ bạn không thể kéo 100 khách hàng và 100 đơn đặt hàng mà không vi phạm một số tính toàn vẹn hoặc viết báo cáo rất phức tạp.) –

+1

Có ý nghĩa nếu bạn có cơ sở dữ liệu 10 TB và chỉ cần một phiên bản đơn giản để làm việc trên đó. Và theo như tôi thấy, không có giải pháp dễ dàng cho SQL Server – Salim

Trả lời

0

Với SQL Server Tôi sẽ sử dụng công cụ "BCP"

này đòi hỏi một chút mã hóa mặc dù: tạo ra 100 lựa chọn công bố hàng đầu cho mỗi bảng và tạo ra một batch file

3

Bạn không thể sử dụng rõ ràng BACKUP DATABASE cho việc này. Tuy nhiên, bạn có thể làm điều gì đó như thế này - tuy nhiên, hãy nhớ rằng - như trong bình luận của tôi - dữ liệu này sẽ bị hạn chế sử dụng nếu bạn dựa vào bất kỳ loại dữ liệu toàn vẹn nào vì thứ tự sẽ tương đối tùy ý và trừ khi mọi thứ là 1: 1 và bạn tình cờ được sắp xếp một cách kỳ diệu thuận tiện trên tất cả các truy vấn nó sẽ chỉ là một người mập và lùn Hodge lớn của dữ liệu:

CREATE DATABASE copy_of_original; 
GO 

USE original_db; 
GO 

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N''; 

-- this assumes all tables are in `dbo` schema: 
SELECT @sql = @sql + CHAR(13) + CHAR(10) 
    + 'SELECT TOP (100) * INTO copy_of_original.dbo.' 
    + QUOTENAME(name) + ' FROM dbo.' + QUOTENAME(name) + ';' 
FROM sys.tables 
WHERE schema_id = 1; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

Khi bạn đã làm điều này, bạn có thể sao lưu copy_of_original - nhưng hãy nhớ nó sẽ không có bất kỳ chỉ mục hoặc ràng buộc nào có trong cơ sở dữ liệu gốc và rằng TOP sẽ chọn một tập hợp tùy ý gồm 100 hàng từ mỗi bảng (hoặc toàn bộ bảng, cho các bảng nhỏ có ít hơn 100 hàng).

0

Bạn có thể xin vui lòng thử giải pháp này

  1. Hãy Tạo một bản sao của cơ sở dữ liệu của bạn

  2. Execute mã dưới đây vào bản sao DB của bạn để xóa các hàng từ bảng có hơn 100 dòng.

    sp_msforeachtable
    'BẢNG ALTER? NOCHECK CONSTRAINT ALL , VỚI [DUMMYTABLE] AS (CHỌN RN = ROW_NUMBER() TRÊN (ORDER BY NEWID()), * FROM?) XÓA TỪ [DUMMYTABLE] WHERE RN> 100 ALTER TABLE? KIỂM TRA CONSTRAINT TẤT CẢ '

  3. Sao lưu cơ sở dữ liệu mới của bạn.

Hạn chế:Issue trong toàn vẹn dữ liệu của cơ sở dữ liệu sao lưu như chúng tôi vô hiệu hóa những hạn chế và xóa các hàng từ cơ sở dữ liệu.

+0

Giới hạn khác: 'ORDER BY NEWID()' có khả năng sẽ khá đắt trên các bảng lớn hơn.Tôi sẽ không đề nghị nó trừ khi có một yêu cầu rõ ràng cho các hàng * ngẫu nhiên *. Hơn nữa sao chép tất cả các dữ liệu chỉ để xóa 90 +% của nó không có vẻ giống như một đường dẫn hiệu quả (tôi ghét phải xem nhật ký giao dịch cho cơ sở dữ liệu mới khi thao tác này kết thúc). –

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