2010-08-31 80 views
8

Tôi đang làm tăng thêm phần cuối của ứng dụng Access của ứng dụng khách vào ngày mai và cần sẵn sàng với một kế hoạch cho một vấn đề cụ thể với khách hàng này. Các ông chủ cần để có thể lấy các tập tin dữ liệu ra khỏi văn phòng nơi SQL Server là một cách thường xuyên (thường là hàng tháng) và chạy phân tích thống kê về dữ liệu.Sao chép cơ sở dữ liệu SQL Server Express sang một máy tính khác

Tôi đã nhìn Easiest way to copy an entire SQL server Database from a server to local SQL Express, và các giải pháp đó không làm việc trong kịch bản này vì:

  1. không thể sử dụng một giải pháp một lần (Cơ sở dữ liệu Publishing Wizard), vì điều này cần phải có thể viết được.

  2. không thể sử dụng bất kỳ phương pháp nào phụ thuộc vào hai máy tính đang được nối mạng, vì đó không phải là tùy chọn - dữ liệu phải được truyền qua ổ USB (vì vậy, không sao chép).

  3. không thể sử dụng bất kỳ phương pháp nào phụ thuộc vào việc chạy công cụ quản lý SQL Server từ bảng điều khiển máy chủ hoặc từ máy trạm để sao lưu.

  4. không thể kết nối trực tiếp với cơ sở dữ liệu SQL Server để phân tích vì dữ liệu phải được di chuyển đến các vị trí khác.

Điều tôi nghĩ tôi cần là một số cách để gọi tập lệnh tạo tệp sao lưu, sau đó sao chép kết quả vào ổ USB. Sau đó tôi cần một kịch bản thứ hai để sao chép các tập tin sao lưu từ ổ đĩa USB và khôi phục nó vào máy chủ SQL khác.

Dữ liệu đang được chuyển là chỉ đọc (hoặc bất kỳ thay đổi nào không cần phải quay lại máy chủ chính) và dữ liệu sẽ không được cập nhật ở vị trí thứ hai. Nó hiện đang được viết kịch bản với một tệp hàng loạt cũ đơn giản để sao chép tệp MDB back-end và tôi cần một thứ đơn giản cho người dùng.

Nó không thể có bất kỳ sự phụ thuộc nào, Powershell (của SQL Server Management Studio), bởi vì tôi không muốn nó phải được cài đặt trên máy tính người dùng đang chạy tập lệnh từ (có một nửa tá máy trạm mà kịch bản cần phải được chạy từ, và tôi không muốn phải cài đặt một cái gì đó trên tất cả các máy trạm đó).

Tôi sẽ thiết lập tác nhân sao lưu để tạo bản sao lưu hàng đêm, vì vậy tôi có thể sao chép tệp đó mà không cần phải bắt đầu sao lưu trước khi sao chép. Vì vậy, tôi chỉ có thể cần phải tập lệnh khôi phục trên máy tính mục tiêu.

Suy nghĩ, đề xuất, con trỏ?

Trả lời

12

Bạn chắc chắn sẽ có thể tạo ra thứ gì đó như thế.

Một phần sẽ là một T-SQL CREATE BACKUP kịch bản như một kịch bản .sql, và thực hiện điều đó từ Windows batch chuẩn (*.bat) hoặc lệnh (*.cmd) tập tin bằng cách sử dụng công cụ dòng lệnh sqlcmd.

Đó sẽ là một cái gì đó như thế này:

backup.sql

BACKUP DATABASE YourDatabase 
TO DISK = 'Z:\Backup\YourDatabase.bak' 
WITH FORMAT; 

Phần thứ hai sẽ là một.sql tập tin với một kịch bản T-SQL RESTORE, về cơ bản đọc dữ liệu từ một vị trí nhất định trên đĩa và khôi phục nó vào trường hợp SQL Server ở đó.

restore.sql

RESTORE DATABASE YourDatabase 
    FROM AdventureWorks2008R2Backups 
    WITH 
    MOVE 'YourDatabase_Data' TO 'C:\MSSQL\Data\YourDatabase.mdf', 
    MOVE 'YourDatabase_Log' TO 'C:\MSSQL\Data\YourDatabase_Log.ldf'; 
GO 

Tất nhiên, bạn cần phải thích nghi với những cái tên và đường dẫn đến yêu cầu thực tế của riêng bạn - nhưng điều đó chỉ nên cung cấp cho bạn một gợi ý làm thế nào để bắt đầu với nỗ lực này.

Để thực hiện một trong những kịch bản sql sử dụng sqlcmd, bạn cần một cái gì đó như:

sqlcmd -S (name of server) -U (login) -P (password) -I (name of script file) 

ví dụ

sqlcmd -S (local) -U someuser -P top$secret -I backup.sql 

Resources:

+0

Làm thế nào để bạn chạy SQLCMD từ một máy trạm không có SQL Server được cài đặt trên nó? Có cách nào để thực hiện những kịch bản SQL từ máy trạm, như trái ngược với từ giao diện điều khiển máy chủ, hoặc từ một máy trạm với các công cụ quản lý SQL Server được cài đặt? Những thứ đó sẽ không được cài đặt trên các máy trạm mà người dùng sẽ sử dụng để sao chép dữ liệu vào ổ USB (đó chính là phụ thuộc bên ngoài mà tôi không muốn giới thiệu). –

+0

OK, tôi thấy rằng tôi phải cài đặt các tiện ích dòng lệnh riêng biệt cho tiện ích SQLCMD. Vì tôi phải cài đặt SQL Server Native Client, tôi đoán nó không phải là không hợp lý để cài đặt chúng cùng một lúc. Thật không may, các tài liệu tải xuống cho rằng (http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C) nói rằng nó đòi hỏi Windows Installer 4.5, nhưng một cài đặt nặng (yêu cầu khởi động lại máy trạm WinXP). Điều này có vẻ khó sử dụng trên đầu nguồn (mặc dù OK trên mục tiêu, sẽ được cài đặt SQL Server Express). –

+0

Tải xuống R2 có tại http://www.microsoft.com/downloads/details.aspx?FamilyID=ceb4346f-657f-4d28-83f5-aae0c5c83d52 –

0

Tại sao không tiếp tục sao chép toàn bộ tập tin cơ sở dữ liệu? Điều này đọc giống như một hoạt động đủ nhỏ để thoát khỏi tạm dừng tạm thời: Bạn có thể thu nhỏ cơ sở dữ liệu, tách và sao chép các tệp trực tiếp. Trên hệ thống đích, bạn có thể attach the SQLExpress DB by file name trong chuỗi kết nối.

+0

Có thể đọc được? Runnable bởi một người không phải quản trị viên? Runnable từ một máy trạm hơn là từ giao diện điều khiển máy chủ? –

+0

Tôi đã xem xét tuyên bố cuối cùng về việc sử dụng bản sao lưu hàng đêm, cho phép sao chép nó vào một phần, và chỉ cần một kịch bản khôi phục. Nếu kế hoạch dự phòng bao gồm một nhiệm vụ để sao chép db (E.G .: thông qua một nhiệm vụ T-SQL trong kế hoạch bảo trì), và chuỗi kết nối nhắm vào tên tệp db, thì sẽ không cần phải là một kịch bản khôi phục. – Steve

+0

Vâng, tôi chưa tạo kế hoạch sao lưu, vì tôi chưa thực hiện việc tăng kích thước - đó là ngày mai! Nhưng, vâng, tôi nghĩ rằng tôi muốn chia sẻ điểm đến cho tập lệnh sao lưu và việc sao chép sẽ dễ dàng, nhưng điều đó sẽ không yêu cầu bất kỳ điều gì bạn đã đề nghị về việc dừng máy chủ db và vv. Dừng máy chủ và sao chép các tệp thực sự là một trình khởi động hoàn chỉnh, trong mọi trường hợp, vì vậy URL được trích dẫn không thực sự hữu ích. –

1

Chỉ là một suy nghĩ nhưng nếu anh ta hiện đang đi với một bản sao của một tập tin MDB với tất cả các dữ liệu chỉ cho chính mình thì tại sao không thực hiện như thế. Bạn chỉ có thể làm tất cả trong truy cập với một truy vấn cho mỗi bảng.

Nếu bạn thiết lập MDB “báo cáo” với bảng được liên kết và được gọi là “tblFoo_LINKED” và bảng cục bộ được gọi là “tblFoo”, bạn có thể chạy một đoạn mã VBA lặp lại tất cả các bảng và thực thi

INSERT INTO tblFoo SELECT * FROM tblFoo_LINKED 

các máy chủ sao lưu SQL khôi phục vẫn sẽ là lựa chọn tôi sẽ đi cho nhưng chỉ cung cấp một spin khác nhau vào những thứ mà có thể phù hợp với nhu cầu của bạn

+0

Không hoạt động vì người dùng từ xa cũng phải sử dụng ứng dụng hiện có. Tôi không muốn phải duy trì hai phiên bản của giao diện người dùng, một phiên bản để sử dụng với Máy bay phản lực và một phiên bản để sử dụng với SQL Server. Ngay bây giờ, ứng dụng đã không thay đổi đủ cho vấn đề này, nhưng một khi tôi bắt đầu di chuyển mọi thứ phía máy chủ để tăng cường hiệu suất, ứng dụng sẽ không hoạt động nữa. Mặt khác, hầu hết những thứ sẽ được di chuyển phía máy chủ sẽ là những thứ như chèn (sử dụng SPROC), mà người dùng sẽ không làm. Hmm. Đáng suy nghĩ. –

+0

Tôi bắt đầu đưa ra suy nghĩ này, vì tôi không nghĩ rằng mối quan tâm của tôi về ứng dụng chính làm việc là quan trọng. Tôi đã nhận nó làm việc bằng cách sử dụng DoCmd.TransferDatabase (nên hiệu quả hơn một MakeTable và có được các kiểu dữ liệu chính xác hơn), nhưng nó không nhập các chỉ mục. Hmm. Gotta làm một số gameunking .... –

+0

Tôi không chấp nhận điều này như là câu trả lời, mặc dù nó gần nhất với những gì tôi đã chọn là giải pháp của tôi. Lý do của tôi là tôi nghĩ tốt hơn là chấp nhận câu trả lời phù hợp hơn với câu hỏi mà tôi đã hỏi (chỉ là SQL Server). Nhưng tôi upvoting nó bởi vì nó làm cho tôi suy nghĩ và thử nghiệm phương pháp này. Tôi sẽ sử dụng một trong hai cách tiếp cận (tôi chưa thử nghiệm hiệu suất): A. chèn dữ liệu vào mẫu trống MDB với các chỉ mục đã được xác định, hoặc B. nhập với TransferDatabase và thêm các chỉ mục với DAO. –

2

tôi đã cùng một vấn đề này vận chuyển db giữa sản xuất (máy chủ) và thử nghiệm phát triển (địa phương ở một vị trí khác) và cũng vận chuyển db thành công để lưu trữ ser ver.

Khi hóa ra tôi chỉ có thể tự vận chuyển .MDF.

  1. Đảm bảo rằng db mục tiêu không có db được đính kèm, trước tiên hãy xóa nó trong SSMS.
  2. Di chuyển bản thân .MDF (không có tệp nhật ký).
  3. Tại vị trí mục tiêu mặc định c: \ program files ... sql .. \ DATA đảm bảo tất cả phiên bản trước của MDF và LDF được di chuyển hoặc xóa - nếu nó thấy tệp .ldf ở đó sẽ bị nhầm lẫn.
  4. Trong SSMS, chọn đính kèm. Nhấn Thêm, chọn .mdf.
  5. Tại thời điểm này, trong hộp bên phải bên dưới, nó sẽ cho thấy rằng một MDF và LDF được đính kèm và thiếu LDF. Nhấp vào LDF và nhấn nút XÓA.
  6. Hiện tại, MDF sẽ được đính kèm và một LDF mới/trống sẽ được thêm vào.

Tôi làm điều này mọi lúc; hoạt động hoàn hảo - tiết kiệm sự cố khi vận chuyển một tệp .ldf lớn. (Tôi thường sử dụng dropbox.com thay vì ổ USB và mã hóa tệp bằng PKZIP/SecureZip trước.)

Tôi không chắc điều gì sẽ xảy ra nếu bạn sao chép MDF bằng máy chủ, mặc dù tôi không dừng trước khi sao chép. Tôi không chắc chắn làm thế nào để làm cho kịch bản này - đính kèm có thể được scriptable nhưng tôi không chắc chắn về việc xóa các .LDF trước khi tiếp tục.

Bạn có thể tạo kịch bản cho máy chủ để tạo bản sao chụp nhanh của cơ sở dữ liệu, sau đó vận chuyển MDF biết rằng nó không được cập nhật.

Một ý tưởng khác - viết chương trình để chèn tất cả các bản ghi vào một tệp phiên bản nhỏ gọn SQL Server và vận chuyển không? Tôi đã không thử nó, nhưng đọc về nó.

+0

Mặc dù nó có thể tốt cho sự hoàn chỉnh để có câu trả lời này ở đây, nó không phù hợp với những hạn chế trong câu hỏi của tôi. Nó không kém hiệu quả hơn tệp sao lưu. Cơ sở dữ liệu tôi đã làm điều này cho có một tập tin MDF 64MB, và các tập tin sao lưu là 63MBs! Vì vậy, không có khoản tiết kiệm thực nào khi chỉ lấy tệp MDF và nếu bạn lấy cả hai tệp, bạn đang sao chép nhiều dữ liệu hơn. Ngoài ra, bãi chứa sao lưu chỉ chạy trong vài giây, trong khi dừng và khởi động máy chủ sẽ mất khá nhiều thời gian. Cuối cùng, điều này phải được thực hiện trong ngày làm việc, và máy chủ không thể dừng lại. –

+0

Tôi đọc lại hai lần nữa và không thấy nơi bạn muốn một tập tin "nhỏ hơn" - vì vậy anyway ... sao lưu nên chứa MDF/LDF combo - MDF một mình nên nhỏ hơn. Tôi không chắc bạn phải dừng máy chủ để lấy nó. Nó có thể kéo xuống. Nhưng đây là một vài ý tưởng khác nếu bạn không nghĩ rằng phiên bản SQL/Server Compact sẽ hoạt động: 1. Sử dụng bản sao của nhà xuất bản/người đăng ký SQL/Server để "cập nhật" db - chỉ những thay đổi mới kết thúc. Nếu không được nối mạng như bạn đã nói thì có một "trung tâm" được lưu trữ - tôi sử dụng serverintellect.com - quá nhanh nó gần giống như là địa phương – pghcpa

+0

Hoặc 2. Thử dịch vụ đồng bộ hóa: http://msdn.microsoft.com/en-us /sync/default.aspx - mà nó nói sẽ đồng bộ hóa với SQL/Server phiên bản nhỏ gọn. Nếu yêu cầu không có mạng bao giờ, không có Internet bao giờ (ổ đĩa USB di động nhỏ như Seagate) thì không chắc chắn làm thế nào bạn có thể tránh sao chép trên toàn bộ db trừ khi bạn sao chép các bản ghi chỉ thay đổi kể từ lần cập nhật cuối cùng. Hy vọng nó giúp. – pghcpa

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