Các tập tin của cơ sở dữ liệu có thể được sao chép trong khi cơ sở dữ liệu đang trực tuyến không?


9

Tôi đang làm việc để thiết lập một bản sao phát triển của cơ sở dữ liệu sản xuất trên SQL Server 2008 R2 SP1. Cơ sở dữ liệu trực tiếp đang được hai nhà phát triển sử dụng nhẹ cho các truy vấn chỉ đọc hiện tại, nhưng cơ sở dữ liệu mới cũng sẽ có các cập nhật được thực hiện trên đó.

Vì cơ sở dữ liệu là 2.1TB và mất tổng cộng 3 ngày để khôi phục và cập nhật lên bản dựng mới nhất mà chúng tôi cần để thử nghiệm, kế hoạch ban đầu của tôi là tạo một bộ tệp sao lưu mới và sau đó khôi phục từ các tệp đó. Điều này sẽ cho phép tôi tạo bản sao phát triển của cơ sở dữ liệu trên cùng một cá thể và máy SQL, mà không phải lấy cơ sở dữ liệu hiện tại ngoại tuyến.

Tuy nhiên, để tiết kiệm một vài ngày, tôi đã nghĩ rằng có thể nên sao chép các tệp cơ sở dữ liệu vật lý và đính kèm bản sao mới của cơ sở dữ liệu. Thật không may khi tôi cố gắng sao chép, tôi gặp lỗi liên quan đến khóa mà SQL Server đặt trên các tệp đó.

Vì tôi không thể lấy cơ sở dữ liệu ngoại tuyến cho bất cứ điều gì ngoài việc chuyển các tệp nhật ký (tôi có thể hoàn thành việc này trước khi mọi người vào buổi sáng), có cách nào để tôi có thể sao chép các tệp cơ sở dữ liệu trực tiếp mà không đưa cơ sở dữ liệu vào trạng thái ngoại tuyến không? Hay tôi nên đợi cho đến khi mọi người về nhà để làm điều đó?

Câu trả lời:


11

Tại sao phải mất 3 ngày để sao lưu / khôi phục cơ sở dữ liệu 2.1 TB? Nếu đó là tất cả về việc di chuyển bản sao lưu, tôi nghi ngờ việc sao chép các tệp MDF / LDF sẽ thực sự chậm hơn vì ít nhất bản sao lưu có thể bị nén. Và nếu đó chỉ là về việc khôi phục, thì việc viết các bản sao của tệp sẽ không nhanh hơn quá trình khôi phục - đảm bảo bạn đã bật khởi tạo tệp ngay lập tức . Hoặc nhận I / O nhanh hơn trên hệ thống thứ cấp.

Dù sao, không, bạn không thể sao chép các tệp MDF / LDF trong khi cơ sở dữ liệu đang trực tuyến, bạn phải đưa nó ngoại tuyến để làm như vậy. Và đây là cách an toàn tuyệt đối để sao chép cơ sở dữ liệu. Nếu có bất cứ điều gì xảy ra với các tệp trong khi chúng bị tách ra / ngoại tuyến, thì bây giờ bạn không có bản sao cơ sở dữ liệu của mình.

Tôi sẽ đề nghị xem xét các cách để sao lưu / khôi phục nhanh hơn - cho dù đó là đảm bảo bạn đang nén các bản sao lưu của mình và chuyển các tệp theo cách tốt nhất có thể, sử dụng hệ thống con I / O tốt nhất hiện có, làm cho I / O tốt hơn, làm cho chắc chắn rằng IFI đã được bật, v.v.

Một lựa chọn khác cần xem xét là vận chuyển nhật ký vòng tròn - giả sử sản xuất đang trong quá trình khôi phục hoàn toàn và bạn đang thực hiện sao lưu nhật ký thường xuyên, bạn có thể thực hiện vận chuyển nhật ký đến một cơ sở dữ liệu trong khi các nhà phát triển làm việc trên một điểm khác và khi bạn đến điểm ổn định, khôi phục bằng phục hồi và có các nhà phát triển chuyển đổi, thực hiện các thay đổi gần đây của họ với họ. Bây giờ hãy khởi tạo lại vận chuyển nhật ký trên bản sao mà họ vừa ngừng hoạt động, và nó sẽ sẵn sàng cho họ ở lần cắt "ổn định" tiếp theo, không phải chờ đợi.


Việc sao lưu sẽ mất một số giờ không xác định (Tôi không tạo bản sao lưu gốc). Quá trình khôi phục mất 10 giờ, sau đó chạy các bản cập nhật để nâng cấp lên bản phát triển của chúng tôi mất thêm 8 giờ. Vì vậy, thực sự, nếu chúng ta nói về một ngày 24 giờ thì chỉ mất 18 giờ. Nói về 8 ngày, về cơ bản là 3 ngày (thêm một số thời gian để sao chép các tập tin). Có những cách TUYỆT VỜI để tôi có thể tự điều chỉnh quá trình sao lưu / khôi phục và đó là những gì tôi sẽ làm bây giờ mà tôi biết đó là cách tôi muốn đi.
Sean Long

0

Không, bạn sẽ phải mang ngoại tuyến để sao chép các tệp. Nếu cơ sở dữ liệu của bạn được chia thành các tệp / nhóm nhỏ hơn, nó có thể giúp khôi phục sao lưu nhanh hơn sau khi bạn thực hiện một lần (tùy thuộc vào dữ liệu nào đang thay đổi và dữ liệu nào là cần thiết cho bản sao phát triển).


0

Tôi đã thấy các câu trả lời khác và chúng có ý nghĩa hoàn hảo. Tuy nhiên, chỉ để trả lời câu hỏi của bạn, bạn chắc chắn có thể sao chép các tệp cơ sở dữ liệu mà không cần lấy DB ngoại tuyến. Bạn sẽ cần sử dụng lập trình SMO cho mục đích này. Hãy xem cái này: http://technet.microsoft.com/en-us/l Library / ms162175 (v = sql.100) .aspx

Xin lưu ý rằng liên kết được cung cấp là dành cho các đối tượng lập trình SMO chung và không phải là câu trả lời cụ thể cho câu hỏi này. Tôi chưa làm như vậy nhưng tôi sẽ sớm thử nó và sẽ cho mọi người biết (nếu tôi nhớ), những gì tôi tìm ra.


-1

Các tập tin của cơ sở dữ liệu có thể được sao chép trong khi cơ sở dữ liệu đang trực tuyến không?

Đúng.

Tất cả bạn phải làm là đặt cơ sở dữ liệu thành chỉ đọc:

  1. Chạy:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
    
  2. Sao chép các tệp cơ sở dữ liệu - MDF, LDF, v.v. đến đích mới của chúng

  3. Sau khi sao chép xong, bạn có thể tách ra và gắn lại vào vị trí mới. Chỉ cần đảm bảo đặt lại tùy chọn chỉ đọc và bạn đang sử dụng cùng một tài khoản người dùng khi thao tác với các tệp này. Ngoài ra, bạn có thể muốn xóa các tập tin cũ sau khi di chuyển.

Một phương pháp khác

Sau khi các tệp được sao chép thành công (bước 2 ở trên):

Bạn có thể đặt cơ sở dữ liệu thành: Single_Usermode sau đó:

  1. Chạy:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
    
  2. D:\ là địa điểm mới

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
    
  3. Đảm bảo các tệp dữ liệu ở vị trí mới ( D:\) có toàn quyền truy cập vào tài khoản dịch vụ đang chạy SQL Server.

  4. Khởi động lại dịch vụ SQL

  5. Chạy:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO
    

Làm xong!


Đầu tiên lưu ý rằng việc đặt DB ở chế độ chỉ đọc gây ra sự cố ngừng hoạt động hiệu quả nếu việc sử dụng bình thường yêu cầu ghi vào cơ sở dữ liệu. Thứ hai, tôi hy vọng SQL Server vẫn có các tệp bị khóa để sử dụng nếu chúng được đọc; nếu kinh nghiệm cá nhân của bạn hoặc tài liệu MS nói khác, vui lòng chỉnh sửa nó thành câu trả lời của bạn. Thứ ba, lời khuyên mà tôi thường thấy khi thay đổi vị trí tệp là đưa DB ngoại tuyến , không chỉ vào chế độ người dùng đơn lẻ .. Một lần nữa, nếu bạn có kinh nghiệm cá nhân hoặc tài liệu MS đề xuất khác, vui lòng chỉnh sửa thành câu trả lời. Cảm ơn!
RDFozz

Đúng rồi! Chỉ đọc sẽ ngăn người dùng viết nhưng họ sẽ có thể đọc. Ở điểm thứ hai của bạn - có, bạn có thể lấy cơ sở dữ liệu ngoại tuyến - nhưng câu hỏi là trong khi trực tuyến. Quá trình tôi mô tả ở trên hoạt động với thời gian chết tối thiểu. Cảm ơn.
RAVicioso

@RAVicioso cơ sở dữ liệu chỉ được đọc là mất điện. Nếu bạn không thể viết dữ liệu mới (tức là nhận đơn đặt hàng), hệ thống của bạn sẽ ngừng hoạt động. Đây có vẻ là một ý tưởng tồi, phải không?
Erik Darling

@sp_BlitzErik - Giải pháp hoạt động, nhưng bạn sẽ không thể viết trong loại bảo trì này. Trong ví dụ của bạn: "nhận đơn đặt hàng", nó sẽ không.
RAVicioso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.