Máy chủ SQL Sandbox


9

Tôi đang cố gắng thiết lập một hộp cát cho các nhà phát triển báo cáo của chúng tôi để họ làm việc. Kế hoạch hiện tại của tôi là "thiết lập lại" cơ sở dữ liệu mỗi tối nhưng tôi không chắc chắn cách thực hiện. Ý tôi là khi thiết lập lại là về cơ bản tôi muốn loại bỏ bất kỳ bảng người dùng, chế độ xem, thủ tục được lưu trữ, v.v. khỏi tất cả trừ một cơ sở dữ liệu trên máy chủ. Tôi cho rằng một tùy chọn khác cũng sẽ là loại bỏ và tạo lại cơ sở dữ liệu nhưng tôi khá chắc chắn rằng điều đó có nghĩa là sẽ lấy lại quyền truy cập vào tất cả các nhóm / người AD thích hợp.

Tôi thực sự không biết điều gì sẽ là cách tốt nhất để thực hiện điều này vì vậy tôi hy vọng một số bạn sẽ có thể cung cấp một số ý tưởng / đề xuất tốt. Cảm ơn.

Để rõ ràng, về cơ bản, chúng tôi muốn thực hiện điều này với cơ sở dữ liệu của chúng tôi: http://try.discference.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 . Điều khác biệt duy nhất là chúng tôi không muốn tạo lại người dùng của mình mỗi ngày.

Phiên bản: SQL Server 2008
Phiên bản: Nhà phát triển & Doanh nghiệp

Câu trả lời:


8

Một ý tưởng khác là chỉ cần thiết lập một công việc hàng đêm thực hiện sao lưu copy_only và khôi phục nó trên máy chủ dev (hoặc trên cùng một máy chủ, nếu bạn chỉ có một, nhưng đó có thể không phải là một ý tưởng tuyệt vời). Điều thú vị ở đây là việc khôi phục có thể đi đến bất kỳ máy chủ nào (hoặc nhiều máy chủ) và có thể được tách rời hoàn toàn khỏi mọi hoạt động trên cơ sở dữ liệu chính.

Trên máy chủ 1:

BACKUP DATABASE db TO DISK = '\\someshare\file.bak' 
  WITH COPY_ONLY, INIT, COMPRESSION;

Trên máy chủ 2:

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY;

Bạn cũng có thể cần thêm MOVEcác lệnh nếu bố trí đĩa giữa các máy chủ khác nhau (hoặc nếu bạn đang đặt bản sao trên cùng một máy chủ).

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'data_file_name' TO 'D:\somepath\somefile.mdf',
  MOVE 'log_file_name'  TO 'E:\somepath\somefile.ldf';

Nếu bạn đang khôi phục trên cùng một máy chủ, bạn không nên có bất kỳ vấn đề nào với người dùng. Nếu bạn khôi phục đến một máy chủ khác, người dùng của bạn sẽ tồn tại nhưng thông tin đăng nhập cấp máy chủ có thể không. Có các kịch bản để khắc phục điều đó và một tính năng mới trong SQL Server 2012 ( Cơ sở dữ liệu có chứa ) giúp loại bỏ hoàn toàn vấn đề.


Chúng tôi có dev / prod nhưng dev là máy chủ duy nhất trong đó điều này sẽ xảy ra. Prod chỉ dành cho các quy trình prod-ready.
Kittoes0124

Đây là giải pháp mà tôi sẽ chọn, xin vui lòng lưu ý rằng trong hầu hết các trường hợp, bạn không muốn đơn giản sao chép sản xuất vào môi trường dev. Vui lòng có một biện pháp (tập lệnh?), Ví dụ, sẽ xóa hoặc che khuất địa chỉ email của người dùng, chi tiết liên hệ, v.v. Bạn không muốn các nhà phát triển của mình vô tình bắt đầu gửi email cho người dùng.
zeroDivisible

5

Vì bạn có một phiên bản với công cụ Phiên bản doanh nghiệp, tôi sẽ sử dụng ảnh chụp nhanh cơ sở dữ liệu .

Điều này sẽ cho phép bạn nhanh chóng và dễ dàng khôi phục mọi thay đổi được thực hiện trong ngày mà không phải khôi phục toàn bộ cơ sở dữ liệu.

Lưu ý rằng nếu các nhà phát triển đang có kế hoạch thực hiện tải dữ liệu lớn (nghe có vẻ như họ không?), Thì điều này có thể không phù hợp.


Tại sao nó không thích hợp nếu họ đang tải dữ liệu lớn? Chúng ta có thể tải .... 8 triệu hàng 100 cột mỗi giờ và sau đó (ngay cả khi chúng "không nên") nhưng chúng ta không nhất thiết muốn ngăn chúng làm như vậy. Tất cả những gì chúng tôi thực sự quan tâm là mọi thứ sẽ được thu thập vào cuối ngày.
Kittoes0124

2
@Kittoes vì ​​một ảnh chụp nhanh phải được duy trì khi dữ liệu nguồn thay đổi. Nó cần phải kéo các trang hiện có từ nguồn nếu nguồn thay đổi, để nó duy trì chế độ xem "trước". Nó không làm điều đó cho đến khi dữ liệu nguồn thay đổi (ảnh chụp nhanh sử dụng một tệp thưa thớt, ngoại trừ deltas). Việc bảo trì này có thể trở nên khá tốn kém. Xem cách chụp ảnh cơ sở dữ liệu hoạt động .
Aaron Bertrand

@AaronBertrand Ok, vậy nếu cơ sở dữ liệu tăng lên 8GB trong một ngày thì khi ảnh chụp nhanh được khôi phục, tất cả dữ liệu mới sẽ bị xóa nhưng cơ sở dữ liệu vẫn có kích thước 8GB? Hay tôi đang hiểu lầm?
Kittoes0124

@ Ảnh chụp nhanh là chỉ đọc, vì vậy bạn chỉ có thể tải dữ liệu mới vào cơ sở dữ liệu nguồn. Nếu bạn thêm 8GB vào ban ngày, nó sẽ không hiển thị với ảnh chụp nhanh. Khi bạn hoàn nguyên / thả ảnh chụp nhanh, cơ sở dữ liệu nguồn sẽ vẫn có 8GB dữ liệu đó và sẽ có kích thước tương ứng. Nếu sau đó bạn chụp một ảnh chụp nhanh khác, dữ liệu mới sẽ hiển thị. Nếu bạn loại bỏ 8GB trong ngày, nó sẽ được thêm vào ảnh chụp nhanh.
Aaron Bertrand

1
@Kittoes nếu bạn có nghĩa là bạn muốn hoàn tác tải dữ liệu 8GB bằng cách quay lại thời điểm mà ảnh chụp được thực hiện, vâng, nó sẽ trả lại các tệp dữ liệu của bạn về kích thước của chúng (cho dù bạn có thực sự muốn có các tệp nhỏ lại không bạn chỉ có thể tự động thêm nhiều hơn khi bạn tải lại 8GB vào ngày mai là một vấn đề khác). Nhưng tôi đã không kiểm tra kịch bản đó một cách rõ ràng. Và như bài viết tôi liên kết với đề cập, điều này không nhất thiết phải là hoàn hảo, vì nó cũng ảnh hưởng đến độ tin cậy của bộ lưu trữ cơ bản. Một bản sao lưu là một cách an toàn hơn để làm điều đó.
Aaron Bertrand

0

Hãy để tôi thêm vài xu của tôi để xem nó có giúp bạn không:

Trong công ty của tôi, chúng tôi đang gặp phải tình huống giống như mỗi đêm các nhà phát triển muốn làm mới cơ sở dữ liệu mà họ đã sử dụng suốt cả ngày. Điều này có nghĩa rằng chúng ta có một tập hợp các cơ sở dữ liệu của Dev không chạm - cho phép nói A và một tập hợp các cơ sở dữ liệu là chính xác sao chép A nhưng họ làm công cụ của họ, nhưng muốn được làm mới mỗi đêm - cho phép nói B . Điều này xảy ra trên 1 trường hợp máy chủ duy nhất.

Những gì tôi đã thực hiện là một QUY TRÌNH PHỤC HỒI ĐÊM để đạt được điều này. Dưới đây là cách nó hoạt động:

Tạo một bảng điều khiển với danh sách các cơ sở dữ liệu cần được khôi phục mỗi tối (như bạn đã đề cập).

Bảng: nightly_restore (OriginalDB, RestoreDB, sao lưu, enable_YN, Kết quả, PASS_FAIL)

Sau đó, bạn có thể viết một số TSQL sẽ lặp qua danh sách các cơ sở dữ liệu từ bảng trên và sau đó thực hiện khôi phục và ghi lại bất kỳ thành công hoặc thất bại nào trong Kết quả và một chút 1 = Đạt hoặc 0 = Thất bại. Enables_YN sẽ xác định xem cơ sở dữ liệu đó có cần được khôi phục hay không.

Nếu có thêm cơ sở dữ liệu sẽ được thêm vào trong tương lai thì bạn chỉ cần chèn chúng vào bảng và đặt bit enable_YN thành Y (đã bật).

Bằng cách này, quá trình sẽ linh hoạt và dễ quản lý hơn.

Nếu bạn muốn SQL mà tôi đã viết (tôi chắc chắn, bạn sẽ có thể viết nó :-)), chỉ cần ping tôi hoặc thêm một nhận xét và tôi sẽ chia sẻ nó.

HTH

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.