Có phải SQL Server nâng cấp tại chỗ không được khuyến khích như trước đây không?


78

Tôi đã làm việc với và tắt máy chủ SQL kể từ SQL Server 6.5, lời khuyên cũ vẫn còn vang lên trong đầu tôi là không bao giờ thực hiện nâng cấp tại chỗ.

Tôi hiện đang nâng cấp các hệ thống DEV và TEST 2008 R2 của mình lên SQL Server 2012 và cần sử dụng cùng một phần cứng. Ý nghĩ không phải khôi phục cấu hình dịch vụ Báo cáo của tôi là rất hấp dẫn và tôi thực sự đang chống lại thời gian. Không có dịch vụ phân tích liên quan hoặc bất kỳ điều gì bất thường hoặc không chuẩn - chỉ có công cụ cơ sở dữ liệu và dịch vụ báo cáo được cài đặt.

Có ai gặp vấn đề nghiêm trọng với nâng cấp tại chỗ? Hay tôi nên đánh giá lại vị trí của mình về việc nâng cấp tại chỗ?


Tôi đã chọn thực hiện nâng cấp tại chỗ trên 1 máy chủ với cài đặt dịch vụ báo cáo. Vấn đề duy nhất tôi gặp phải là cố gắng sử dụng công cụ xuất nhập khẩu trong SSMS với máy khách gốc 11. Cố gắng chuyển đổi không thành công với lỗi về các kiểu dữ liệu không được nhận dạng. cách giải quyết tôi đã sử dụng là lưu gói và chạy nó trong Công cụ dữ liệu SQL (thay thế BIDS) hoạt động tốt. Tôi nghĩ rằng điều này phải được thực hiện với tệp cấu hình cho SSIS 2008 không bị ghi đè. Nó xảy ra với tôi sau này, đơn giản là bạn có thể thay đổi ứng dụng khách gốc trở lại 10.
Damagedoods

Câu trả lời:


92

Câu trả lời thực sự ngắn - Tại chỗ là được. Bạn có thể xem lại cấu hình của mình sau đó và triển khai các thực tiễn tốt nhất cho SQL Server 2012.

Câu trả lời dài hơn về nâng cấp / di chuyển máy chủ SQL

Vì vậy, đây là một ý kiến ​​và không nhất thiết phải trả lời sai hoặc đúng nhưng tôi thích nâng cấp kiểu di chuyển hơn tại chỗ vì nhiều lý do. Điều đó đang được nói - một số khách hàng của tôi vì nhiều lý do không có lựa chọn nào khác ngoài việc thực hiện tại chỗ và thực sự kể từ SQL Server 2005, việc nâng cấp tại chỗ không còn tệ như trước đây.

Tại sao tôi thích Di chuyển đến Nâng cấp tại chỗ

  • Rollback dễ dàng hơn - Nếu có sự cố xảy ra, bạn có thể khôi phục bằng cách nói đơn giản "chúng tôi đã hủy bỏ nâng cấp .. Vui lòng thay đổi chuỗi kết nối sang máy chủ cũ trong khi chúng tôi giải quyết vấn đề này". Với một vị trí bạn đang sửa chữa nó hoặc bạn đang xuống.
  • Làm mới phần cứng - Phần cứng thay đổi nhanh chóng. Bạn có thể dễ dàng bị mắc kẹt trên phần cứng phù hợp với công ty của bạn 4 năm trước nhưng không phù hợp cho ngày hôm nay và bốn năm tiếp theo với việc nâng cấp tại chỗ. Bạn có thể sẽ phải thực hiện di chuyển tại một số điểm cho phần cứng mới.
  • Cảm thấy tốt hơn - Chắc chắn ... Điều này là chủ quan, nhưng tôi cảm thấy tốt khi biết bạn đang bắt đầu với một cài đặt hệ điều hành mới, một cài đặt SQL mới không có mạng nhện từ người làm việc trước bạn (hoặc bạn trước khi bạn biết những gì bạn biết hôm nay) có thể khiến bạn đau đầu trong tương lai.
  • Hệ điều hành mới - Việc di chuyển mang đến cho bạn cơ hội bắt đầu với phiên bản HĐH mới nếu bạn không có phiên bản mới nhất và tốt nhất hiện nay.
  • Bạn có thể kiểm tra nó - Bạn đã bao giờ muốn có được một bộ đường cơ sở trên một máy mới trước khi bạn cài đặt SQL và kết nối nó với cơ sở dữ liệu và cách sử dụng chưa? Bạn có thể làm điều đó bây giờ.
  • Đôi khi việc lén lút thực hiện tốt nhất sẽ dễ dàng hơn - Có thể tài khoản dịch vụ SQL Server là quản trị viên cục bộ. Có thể Quản trị viên được xây dựng trong vai trò máy chủ SA. Có lẽ mọi thứ đã được hack cùng nhau để làm cho nó hoạt động trước đây. Bạn có thể sửa tất cả và bắt đầu mới.
  • Môi trường thử nghiệm miễn phí và ngủ thêm - Thật là một lợi ích tuyệt vời khi có một môi trường bạn có thể làm việc trước ngày cắt giảm thực tế khi bạn thực hiện môi trường mới này. Thực hiện di chuyển đến một môi trường mới có nghĩa là bạn có thể xây dựng nó trong giờ làm việc, trước ngày cắt giảm thực tế của bạn và kiểm tra nó theo nhiều cách trước thời hạn. Bạn có thể chạy thử nghiệm hồi quy hoàn toàn trên tất cả các ứng dụng và hệ thống trong nhiều ngày và rất yên tâm trước khi bạn thực sự thực hiện bộ khôi phục / đính kèm cuối cùng và cắt tất cả các ứng dụng và truy cập vào môi trường mới.
  • Bạn không cần phải làm tất cả cùng một lúc - Một tình huống rất phổ biến tôi gặp phải là một môi trường đang cố gắng hợp nhất chỉ trong một vài trường hợp. Có lẽ một cho mỗi phiên bản, có thể một cho mỗi "tầng" và phiên bản. Rất nhiều trong số các dự án này có các mốc thời gian khác nhau cho các ứng dụng và cơ sở dữ liệu khác nhau dựa trên thử nghiệm, kế hoạch dự án và tính kịp thời chứng nhận của nhà cung cấp. Thực hiện di chuyển có nghĩa là bạn có thể di chuyển các cơ sở dữ liệu đã sẵn sàng, khi chúng sẵn sàng và vẫn xử lý các yêu cầu cho các cơ sở dữ liệu không thể di chuyển vì lý do này hay lý do khác.

Tâm trí bạn Tôi không nói bạn phải làm điều này như một sự di cư. In-Place hoạt động và nó hoạt động tốt nếu bạn không có kế hoạch mua phần cứng mới trong ngân sách của mình và không thể làm điều đó cho việc nâng cấp này. Sự hỗ trợ trong quá trình nâng cấp tốt hơn rất nhiều so với trong 6,5 ngày, do đó bạn không đặt mình vào vị trí xấu khi làm việc này.

Nếu bạn có kế hoạch thực hiện tại chỗ cho dev / test nhưng muốn thực hiện di chuyển cho sản xuất, bạn có thể cân nhắc thực hiện ít nhất một lần di chuyển trước khi sản xuất. Bằng cách này, bạn có thể tìm ra danh sách kiểm tra của mình trước thời hạn và xử lý mọi vấn đề tiềm ẩn mà bạn không nghĩ tới.

Đính kèm / tách so với Sao lưu / Khôi phục để di chuyển

Nếu bạn quyết định thực hiện phương pháp di chuyển, vẫn còn một quyết định nữa bạn vẫn có thể có một cuộc tranh luận và đó là cách bạn di chuyển cơ sở dữ liệu của mình sang môi trường mới. Bạn có thể tách cơ sở dữ liệu của mình khỏi máy chủ cũ và đính kèm với cơ sở dữ liệu mới hoặc sao lưu và khôi phục nó ở đó.

Tôi thích sao lưu / khôi phục. Ưu điểm lớn nhất tôi nghe được về tách / đính kèm là nó tiết kiệm thời gian. Đối với tôi sao lưu / khôi phục chiến thắng vì một vài lý do:

  • Giữ cái cũ có thể truy cập - Điều này cho phép bạn vẫn có cơ sở dữ liệu có thể truy cập trên máy chủ nguồn. tách / đính kèm nên làm như vậy, nhưng nó sẽ yêu cầu một vài bước và có chỗ cho lỗi của con người với tách / đính kèm có thể làm phức tạp điều này.
  • Bạn đang đảm bảo rằng bạn có một bản sao lưu - Thay vì chỉ lấy một cơ sở dữ liệu từ một tách và có khả năng quên một bước sao lưu, bạn đã chắc chắn rằng bạn đã lấy bản sao lưu đó.
  • Lỗi của con người - Nếu bạn xóa tệp sai, quên nơi bạn đang gửi một cái gì đó hoặc làm rối các bước của bạn, bạn sẽ gặp nhiều rủi ro khi di chuyển dữ liệu và ghi nhật ký tệp cho cơ sở dữ liệu của mình. Bây giờ bạn có thể giảm thiểu điều này bằng cách sao chép thay vì cắt (và nếu bạn tách ra, bạn nên thoát khỏi thói quen cắt và dán) nhưng bạn có thể làm hỏng mớ hỗn độn. SQL Server không còn khóa các tệp đó nữa và thật quá dễ dàng để xóa một tệp vô tình khiến tôi gặp rủi ro.
  • Nó không phải là thực sự chậm hơn - Lấy một bản sao lưu và sao chép nó là một thời gian chút, nhưng nó không phải là nhiều mà tôi sẵn sàng trả thêm nguy cơ cho nó. Trong thực tế - sử dụng mô hình khôi phục hoàn toàn và sao lưu nhật ký, bạn có thể giảm thời gian ngừng hoạt động xuống thấp hơn cho các phần cắt như mô tả bên dưới trong "Cách thực hiện phương pháp di chuyển nhanh hơn"

Nếu bạn quyết định thực hiện sao lưu / khôi phục - điều đó có nghĩa là cơ sở dữ liệu nguồn cũ của bạn sẽ vẫn trực tuyến. Tôi muốn mang cơ sở dữ liệu ngoại tuyến sau khi thực hiện sao lưu. Đôi khi tôi tiến thêm một bước và đưa toàn bộ phiên bản SQL ngoại tuyến sau khi tôi viết kịch bản bảo mật, công việc, máy chủ được liên kết, chứng chỉ, cài đặt thư cơ sở dữ liệu và thông tin rộng khác. Điều này tránh được một vấn đề trong quá trình thử nghiệm khi ai đó nói "Mọi thứ đều tuyệt!" Chỉ sau một hoặc hai ngày, họ đã nói chuyện với cơ sở dữ liệu cũ trên máy chủ cũ. Lấy các cơ sở dữ liệu ngoại tuyến hoặc toàn bộ ngoại tuyến cho phép bạn ngăn chặn các kết quả dương tính giả đó và mớ hỗn độn mà chúng tạo ra.

Cách thực hiện phương pháp di chuyển nhanh hơn

Bạn có thể giảm thiểu thời gian chết cần thiết cho việc cắt từ môi trường cũ sang môi trường mới cho môi trường sản xuất bận rộn với ít thời gian chết bằng cách sử dụng mô hình khôi phục hoàn toàn. Về cơ bản - giai đoạn môi trường bạn đang di chuyển bằng cách khôi phục bản sao lưu đầy đủ mới nhất, mọi bản sao lưu vi sai và mọi bản sao lưu nhật ký đã được chỉ định NORECOVERY- sau đó, tất cả những gì bạn sẽ phải làm cho lần cắt cuối cùng là khôi phục bản sao lưu nhật ký chưa được khôi phục và bản sao lưu nhật ký cuối cùng mà bạn muốn khôi phục chỉ định WITH RECOVERY. Theo cách này đối với một cơ sở dữ liệu lớn, cửa sổ thời gian ngừng hoạt động thực tế có thể được giảm thiểu đáng kể bằng cách trả chi phí cho toàn bộ, chênh lệch và hầu hết các bản ghi khôi phục trước cửa sổ thời gian chết. Cảm ơn Tao đã chỉ ra điều này trong các ý kiến!

Cách nâng cấp tại chỗ an toàn hơn

Một vài điều bạn có thể làm để cải thiện trải nghiệm và kết quả của mình khi chọn phương pháp tại chỗ.

  • Sao lưu - Thực hiện sao lưu thích hợp tất cả các cơ sở dữ liệu người dùng và hệ thống của môi trường của bạn trước thời hạn và đảm bảo chúng tốt (tôi bị hoang tưởng .. Tôi thực sự sẽ khôi phục chúng ở đâu đó trước tiên để thực sự biết rằng chúng tốt .. Có thể lãng phí thời gian của bạn. . Nhưng bạn có thể cảm ơn chính mình trong trường hợp xảy ra thảm họa) .. Tập lệnh ra bất kỳ thông tin cấu hình nào về cài đặt SQL và HĐH tại môi trường đó.
  • Kiểm tra mọi thứ tốt trước khi bạn bắt đầu - Xác minh rằng bạn có một môi trường tốt và cơ sở dữ liệu tốt. Bạn nên làm những việc như xem nhật ký lỗi và chạy DBCC CHECKDB một cách thường xuyên, nhưng trước khi thực hiện nâng cấp tại chỗ là thời điểm tuyệt vời để bắt đầu. Khắc phục mọi sự cố trước thời hạn.
  • Đảm bảo sức khỏe hệ điều hành - Đừng chỉ đảm bảo rằng SQL khỏe mạnh, hãy đảm bảo rằng máy chủ của bạn khỏe mạnh. Bất kỳ lỗi nào trong nhật ký sự kiện lỗi hệ thống hoặc ứng dụng của bạn? Không gian trống của bạn thế nào?
  • Chuẩn bị cho điều tồi tệ nhất - Tôi đã có một loạt bài đăng blog một thời gian trước đó đã đi trên tiền đề rằng nếu bạn không chuẩn bị cho thất bại - bạn đang thực sự chuẩn bị để thất bại .. Tôi vẫn tin rằng. Vì vậy, hãy suy nghĩ về các vấn đề bạn có thể có và giải quyết chúng cho phù hợp trước thời hạn. Hãy để bản thân trong suy nghĩ "thất bại" và bạn sẽ nghĩ về những thứ mà bạn sẽ không có.

Tầm quan trọng của danh sách kiểm tra nâng cấp hoặc di chuyển

Nếu bạn quyết định thực hiện nâng cấp (cho dù tại chỗ hoặc di chuyển), bạn nên nghiêm túc xem xét việc tạo danh sách kiểm tra và sử dụng danh sách kiểm tra này trong mỗi môi trường. Bạn nên bao gồm một loạt các thứ trong danh sách kiểm tra này, không phải là ít nhất trong số đó:

  1. Khi bắt đầu - Thực hiện một số việc như thực hiện nâng cấp thử nghiệm, kiểm tra các ứng dụng của bạn ở mức Tương thích cơ sở dữ liệu mới nhất và xem xét việc chạy một công cụ như Trình tư vấn nâng cấp máy chủ SQL trước để xem loại nhiệm vụ nào bạn cần hoàn thành trước khi thực hiện SQL Nâng cấp hoặc di chuyển máy chủ.
  2. Các bước trước - Dọn dẹp, thực hiện các tác vụ hệ điều hành, vá lỗi trước thời hạn, chuẩn bị các ứng dụng để nâng cấp (tắt máy sạch, làm việc chuỗi kết nối), sao lưu , v.v.
  3. Các bước nâng cấp / di chuyển - Mọi thứ bạn phải làm để nâng cấp hoặc di chuyển thành công và theo đúng thứ tự. Cài đặt, thay đổi (hoặc không thay đổi tùy thuộc vào thử nghiệm và cách tiếp cận của bạn) thay đổi chế độ tương thích với cơ sở dữ liệu, v.v.
  4. Đăng các bước di chuyển / nâng cấp - Các thử nghiệm khác nhau, đăng phiên bản mới hoặc tùy chọn cấu hình máy chủ mới, triển khai thực hành tốt nhất, thay đổi bảo mật, v.v.
  5. Các bước rollback - Tất cả trên đường đi, bạn nên có các bước rollback và các mốc quan trọng. Nếu bạn đi xa và điều này xảy ra, bạn sẽ làm gì? Tiêu chí "làm một rollback đầy đủ" là gì? Và làm thế nào để bạn thực hiện việc khôi phục đó (thay đổi chuỗi kết nối ngược, thay đổi cài đặt trở lại, quay lại phiên bản cũ, cài đặt lại nếu có tại chỗ, quay lại máy chủ cũ nếu di chuyển, v.v.)

Và sau đó, người sẽ thực hiện nâng cấp sản xuất theo dõi danh sách kiểm tra trong một số môi trường khác ngoài sản xuất - đặc biệt là đóng cửa sản xuất nếu có thể ("South of prod", như tôi nói ...) và lưu ý bất kỳ vấn đề hoặc điểm nào nơi họ phải chuyển hướng khỏi danh sách kiểm tra hoặc ứng biến vì thiếu trong danh sách kiểm tra. Sau đó, nhận được các thay đổi được hợp nhất và vui vẻ với thay đổi sản xuất của bạn.

Tôi không thể quá nhấn mạnh tầm quan trọng của việc kiểm tra kỹ lưỡng việc di chuyển hoặc nâng cấp và trước khi di chuyển của bạn đủ. Đưa ra quyết định rollback ở giữa bản nâng cấp sẽ là một điều dễ dàng - đặc biệt là trong quá trình di chuyển. Nếu có điều gì đó không thoải mái, hãy khôi phục và tìm ra nếu bạn không thể khắc phục sự cố một cách hiệu quả và đáng tin cậy trong sức nóng của việc di chuyển. Khi bạn sống trên môi trường mới này và người dùng kết nối - rollback trở thành một nhiệm vụ khó khăn. Bạn không thể khôi phục cơ sở dữ liệu SQL Server về phiên bản cũ hơn. Điều đó có nghĩa là công việc thủ công và di chuyển dữ liệu. Tôi luôn chờ đợi một vài tuần để giết môi trường cũ nhưng bạn nên làm tất cả những gì có thể để tránh cần môi trường cũ đó bằng cách tìm tất cả các vấn đề của bạn trước khi người dùng trực tiếp của bạn chạm vào môi trường mới. Tốt nhất là trước khi bạn bắt đầu nâng cấp / di chuyển.

Lưu ý nhanh về di chuyển / nâng cấp Dịch vụ báo cáo SQL Server Di chuyển cài đặt SSRS không phải là một nhiệm vụ khó khăn mà nhiều người nghĩ rằng đó là. Đây TechNet / sách bài viết trực tuyến thực sự là khá tiện dụng . Một trong những lời khuyên quan trọng nhất trong bài viết đó là "Sao lưu các khóa mã hóa" đặc biệt là nếu bạn có nhiều thông tin nhạy cảm được lưu như địa chỉ e-mail người nhận báo cáo theo lịch trình, thông tin kết nối cho vô số kết nối, v.v. có thể hỏi một trong những khách hàng của tôi từ lúc nào đó quan trọng như thế nào. Họ biết vì tôi đã nhầm lẫn rằng bước lên và dành khá nhiều thời gian để sửa đổi lịch trình báo cáo và quyền chuỗi kết nối.


14

Theo kinh nghiệm của tôi, quá trình ra quyết định tương tự nên được thực hiện như trước. AFAIK chưa có bất kỳ 'thay đổi thế giới' nào khi cài đặt SQL Server, trong chính sản phẩm MS SQL Server và các vấn đề tiềm ẩn mà bạn gặp phải khi triển khai phần mềm với hàng triệu dòng mã. Một cái gì đó xấu có thể xảy ra và bây giờ bạn bị mắc kẹt với không có tùy chọn 'ROLLBACK'.

Tuy nhiên, bạn có những lựa chọn thay thế khác. Bạn có thể xem xét thực hiện một ảnh chụp nhanh của hệ thống, khôi phục ở nơi khác, thực hiện nâng cấp và xem điều gì sẽ xảy ra. Thử nghiệm này sẽ mang lại cho bạn rất nhiều sự thoải mái, nhưng nó không hoàn toàn đảm bảo sẽ không có vấn đề gì phát sinh trên hộp sản phẩm. Tuy nhiên, đây là một tùy chọn không có sẵn trong SQL 6.5 ngày.

Tôi sẽ chỉ giả sử trường hợp xấu nhất. Bạn thực hiện nâng cấp tại chỗ và nó thất bại thảm hại. Sau đó, bạn phải phục hồi từ điều này trong RTO và RCO của bạn. Doanh nghiệp có hiểu các rủi ro và bạn có kế hoạch để giảm thiểu không?

Nếu việc kinh doanh không ổn với điều này, thì đừng làm điều đó sẽ là lời khuyên của tôi.


2

Nếu bạn có máy chủ của mình chạy trong môi trường ảo, bạn có thể thực hiện một ảnh chụp nhanh trên bản sao và sau đó áp dụng nâng cấp tại chỗ và kiểm tra phiên bản để xác minh việc nâng cấp đã thành công. Nếu nó hoạt động, bạn có thể áp dụng ảnh chụp nhanh và tạo bản sao máy chủ sản xuất. Nếu nó không tốt, bạn có thể xóa ảnh chụp nhanh và quay lại hình ảnh nâng cấp trước để thử lại hoặc xóa bản sao và di chuyển đầy đủ.


1
Chỉ khi lưu trữ cũng được ảo hóa và là một phần của ảnh chụp nhanh. Nếu bộ lưu trữ được gắn trực tiếp vào VM, nó sẽ không bị 'quay lại' khi ảnh chụp nhanh được khôi phục ...
Remus Rusanu

1

Do đầu tư phần cứng lớn, chúng tôi được yêu cầu chỉ nâng cấp HĐH trong khi vẫn giữ phiên bản SQL Server hiện tại (2012, 3 máy chủ, 22 phiên bản, ~ 300 cơ sở dữ liệu). Không có thiết lập phức tạp như phản chiếu, vv

Ví dụ này không khớp chính xác với câu hỏi vì SQL Server không được nâng cấp. Tôi nghĩ rằng đây vẫn là một câu trả lời tốt bởi vì các bước được hiển thị thực sự sẽ đơn giản hơn so với di chuyển đúng chỗ.

Tổng quan: Một ổ đĩa ngoài được gắn vào để sao lưu toàn bộ chủ yếu để phòng ngừa. Chỉ mô hình và msdb sẽ thực sự được khôi phục từ ổ đĩa ngoài. Ldf / mdf được đặt ở vị trí tách rời / đính kèm. Một số tài khoản cục bộ đã được tham chiếu trong DB. Sau khi chúng được tạo lại trong HĐH, các tham chiếu trong DB được tạo lại (vì SID có thể thay đổi).

Sau đó, đây là các bước làm việc cho chúng tôi:

1) Lưu ý cài đặt cấp độ máy chủ sẽ được khôi phục trong các bước 12 (Vai trò máy chủ) và 18 đến 23.

2) Patch SQL Server 2012 thành SP3 (yêu cầu tính nhất quán nếu chúng tôi muốn khôi phục bất kỳ dbs hệ thống nào).

3) Xác minh phiên bản khớp với từng trường hợp. "Chọn @@ phiên bản"

4) Tạo 6 tập lệnh này bằng cách chạy tập lệnh này. Redgate SQL Multiscript là một trình tiết kiệm thời gian khổng lồ nếu có nhiều trường hợp (Điều chỉnh Công cụ -> Tùy chọn => Độ dài dòng đến tối đa (8192) và sau đó sử dụng Đầu ra văn bản).

  • Sao lưu
  • Khôi phục
  • Tách ra
  • Đính kèm
  • Đăng nhập lại
  • Gửi lại người dùng để đăng nhập

    -- (1) BACKUP / (2) RESTORE
    --    
    --*** SET THESE to external drive location
    --*** and create the Destination Directories
    declare 
        @backupInstanceDir  varchar(300) = 'F:\ExternalDriveBackups\' + replace(@@servername, '\', '_'),
        @dateSuffix         varchar(100) = '2015-12-14'; 
    
    if (object_id('tempdb..DatabaseStatus') is not null)
    drop table #DAtabseSTatus;
    
    select 
        d.name DbName, 
        d.state_desc DbState,
        d.user_access_desc UserMode,
        convert(bit, (d.is_read_only * -1 + 1)) as IsWritable,
        d.is_trustworthy_on as IsTrustWorthy,
        d.is_in_standby IsInStandby,
        d.recovery_model_desc RecoveryModel,
        suser_sname(d.owner_sid) as Owner,
        convert(bit, 
            case when d.database_id <= 4 or d.is_distributor = 1
                then 1
                else 0
            end) as IsSystemDb,
        mf.type_desc as FileType,
        mf.name FileName,
        mf.state FileState,
        mf.state_desc FileStatDesc,
        mf.physical_name PhysicalName,
        mf.type as FileTypeId    
    into #DatabaseStatus
    from
        sys.master_files AS mf
    join sys.databases AS d
    ON  mf.database_id = d.database_id
    where
        1=1
    order by
        d.name,
        mf.physical_name;
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutBU
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutRE
    
    create table #sqlOutBU
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    create table #sqlOutRE
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutBU select char(10) + '-- BACKUP SCRIPT' + char(10);
    insert into #sqlOutRE select char(10) + '-- RESTORE SCRIPT' + char(10);
    
    
    insert into #sqlOutBU select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    insert into #sqlOutRE select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';        
    
    PRINT '--Script for Backing up all DBs in a SQL Server Instance to a specific location' 
    
    SET nocount ON 
    
    insert into #sqlOutBU select char(10) + 
    '--' + char(10) + '-- BACKUP ' + @@servername + '--' + char(10) + 
    'use [Master]; set deadlock_priority high;' + char(10);
    
    insert into #sqlOutRE select '
    -- RESTORE
    --
    -- BE SURE TO BACKUP SYSTEM DBS TO AN ALTERNATE LOCATION JUST BEFORE RESTORING!
    --
    use [Master]; set deadlock_priority high;' + char(10);
    
    DECLARE @dbname nvarchar(128) 
    declare dblist_cursor cursor fast_forward for 
    select [name] from master.sys.databases where [name] != 'tempdb'
    order by iif(database_id <= 4, '0', '1') + [name]
    
    open dblist_cursor 
    fetch next from dblist_cursor into @dbname 
    
    while @@fetch_status = 0 
    begin 
    
        declare @bak nvarchar(300) = @backupInstanceDir + '\' + @dbname + '_' + @dateSuffix + '.bak';
    
        insert into #sqlOutBU select char(10) + 'backup database [' + @dbname + '] to disk = ''' + @bak + ''' WITH COPY_ONLY, NOFORMAT, NOINIT, ' + char(10) + 
            'NAME = N''' + @dbName + '-Full'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 25;';
    
        insert into #sqlOutRE select 'restore database [' + @dbName + '] from disk = ''' + @bak + ''' WITH FILE = 1,' + char(10) +
        (
            select '    move ''' + FileName + ''' to ''' + PhysicalName + '''' From #DatabaseStatus
            where FileType = 'Rows' and DbName = @dbName
        ) + ',' + char(10) +
        (
            select '    move ''' + FileName + ''' to ''' + PhysicalName + '''' From #DatabaseStatus
            where FileType = 'Log' and DbName = @dbName
        ) + ',' + char(10) +
        '    NOUNLOAD, REPLACE, STATS = 25;' + char(10);               
    
        fetch next from dblist_cursor into @dbname 
    end 
    
    close dblist_cursor 
    deallocate dblist_cursor 
    
    insert into #sqlOutBU select char(10) + 'go' + char(10);
    insert into #sqlOutRE select char(10) + 'go' + char(10);
    
    select Command from #sqlOutBU order by Row; -- BACKUP SCRIPT
    select Command from #sqlOutRE order by Row; -- RESTORE SCRIPT
    
    go
    
    
    
    --
    -- (3) DETACH  -  Org Author: Artemakis Artemiou
    --      
    
    if object_id('tempdb..#sqlOutDT') is not null
        drop table #sqlOutDT
    
    create table #sqlOutDT
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutDT select char(10) + '-- DETACH all DBs from a SQL Server Instance' + char(10);      
    
    insert into #sqlOutDT select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    SET nocount ON 
    
    insert into #sqlOutDT select char(10) + '--' + char(10) + '-- DETACH ' + @@servername + char(10) + '--' + char(10) + '
    use MAster; set deadlock_priority high;' + char(10) + char(10);
    
    DECLARE @dbname nvarchar(128) 
    DECLARE dblist_cursor CURSOR fast_forward FOR 
    SELECT [name] 
    FROM   master.sys.databases 
    WHERE  database_id > 4 
    
    OPEN dblist_cursor 
    FETCH next FROM dblist_cursor INTO @dbname 
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        insert into #sqlOutDT select
        'alter database ' + @dbname + ' set single_user with rollback immediate;' + char(10) +
        'EXEC sp_detach_db ''' + @dbname + ''', ''true'';' + char(10);
        FETCH next FROM dblist_cursor INTO @dbname 
    END 
    
    CLOSE dblist_cursor 
    DEALLOCATE dblist_cursor 
    
    insert into #sqlOutDT select char(10) + 'go' + char(10);
    select Command from #sqlOutDT order by Row;
    
    go
    
    
    
    --
    -- (4) ATTACH  -  Org Author: Artemakis Artemiou
    --    
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutAT
    
    create table #sqlOutAT
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutAT select char(10) + '-- ATTACH ALL DBs to a SQL Server Instance' + char(10);
    
    insert into #sqlOutAT select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    SET NOCOUNT ON
    
    insert into #sqlOutAT select char(10) + '--' + char(10) + '-- ATTACH ' + @@servername + char(10) + '--' + char(10) + 
    'use MAster;' + char(10) + char(10);
    
    DECLARE @dbname nvarchar(128);
    
    DECLARE DBList_cursor CURSOR fast_forward FOR 
    select [name] from master.sys.databases where database_id > 4
    order by name;
    
    OPEN DBList_cursor
    
    FETCH NEXT FROM DBList_cursor 
    INTO @dbname
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    declare @attach_TSQL_script varchar(max)
    set @attach_TSQL_script=''
    set @attach_TSQL_script=@attach_TSQL_script+'CREATE DATABASE ' + @dbname +' ON ' 
    
    declare @tsql varchar(max),@filename varchar(max)
    set @tsql='DECLARE DBFiles_cursor CURSOR FOR select [filename] from '+ @dbname + '.sys.sysfiles'
    
    execute (@tsql) 
    
    PRINT '--'+@dbname 
    
    OPEN DBFiles_cursor
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    
    WHILE @@FETCH_STATUS = 0
    BEGIN   
    set @attach_TSQL_script=@attach_TSQL_script+ char(10)+'    (FILENAME = '''+ @filename +'''),' 
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    END
    
    set @attach_TSQL_script=SUBSTRING(@attach_TSQL_script,0,len(@attach_TSQL_script))
    set @attach_TSQL_script=@attach_TSQL_script+ char(10) +'    FOR ATTACH;';
    
    insert into #sqlOutAT select @attach_TSQL_script + char(10);
    
    PRINT @attach_TSQL_script 
    PRINT ''
    
    CLOSE DBFiles_cursor
    DEALLOCATE DBFiles_cursor
    
    FETCH NEXT FROM DBList_cursor 
    INTO @dbname
    
    END 
    
    CLOSE DBList_cursor
    DEALLOCATE DBList_cursor
    
    insert into #sqlOutAT select char(10) + 'go' + char(10);
    select Command from #sqlOutAT order by Row;
    go
    
    
    
    --
    -- (5) GENERATE A 'RE-CREATE LOGINS' SCRIPT
    --
    -- This script was modified from a version that was designed to copy from one server to another:
    --      http://stackoverflow.com/a/5983773/538763
    --
    
    
    USE [master]
    
    if object_id('tempdb..#sqlOut') is not null
    drop table #sqlOut;
    
    create table #sqlOut
    (
    Command nvarchar(max) not null,
    Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOut select char(10) + '-- RECREATE LOGINS' + char(10);
    
    
    insert into #sqlOut select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    insert into #sqlOut select 'use Master;' + char(10);
    go
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    declare @Debug bit = 0;
    declare @PartnerServer varchar(100) = @@SERVICENAME;  -- use current server before it is shutdown (disabled below)
    
    declare
        @MaxID int,
        @CurrID int,
        @SQL nvarchar(max),
        @LoginName sysname,
        @IsDisabled int,
        @Type char(1),
        @SID varbinary(85),
        @SIDString nvarchar(100),
        @PasswordHash varbinary(256),
        @PasswordHashString nvarchar(300),
        @RoleName sysname,
        @Machine sysname,
        @PermState nvarchar(60),
        @PermName sysname,
        @Class tinyint,
        @MajorID int,
        @ErrNumber int,
        @ErrSeverity int,
        @ErrState int,
        @ErrProcedure sysname,
        @ErrLine int,
        @ErrMsg nvarchar(2048);
    
    declare @Logins Table (LoginID int identity(1, 1) not null primary key,
                        [Name] sysname not null,
                        [SID] varbinary(85) not null,
                        IsDisabled int not null,
                        [Type] char(1) not null,
                        PasswordHash varbinary(256) null)
    declare @Roles Table (RoleID int identity(1, 1) not null primary key,
                    RoleName sysname not null,
                    LoginName sysname not null)
    declare @Perms Table (PermID int identity(1, 1) not null primary key,
                    LoginName sysname not null,
                    PermState nvarchar(60) not null,
                    PermName sysname not null,
                    Class tinyint not null,
                    ClassDesc nvarchar(60) not null,
                    MajorID int not null,
                    SubLoginName sysname null,
                    SubEndPointName sysname null)
    
    Set NoCount On;
    
    If CharIndex('\', @PartnerServer) > 0
    Begin
    Set @Machine = LEFT(@PartnerServer, CharIndex('\', @PartnerServer) - 1);
    End
    Else
    Begin
    Set @Machine = @PartnerServer;
    End
    
    -- Get all Windows logins from principal server
    Set @SQL = 'Select P.name, P.sid, P.is_disabled, P.type, L.password_hash' + CHAR(10) +
        'From ' /*+ QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_principals P' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.sql_logins L On L.principal_id = P.principal_id' + CHAR(10) +
        'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And P.name <> ''sa''' + CHAR(10) +
        'And P.name Not Like ''##%''' + CHAR(10) +
        'and P.Name Not like ''NT SERVICE%''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', P.name) = 0;';
    
    Insert Into @Logins (Name, SID, IsDisabled, Type, PasswordHash)
    Exec sp_executesql @SQL;
    
    -- Get all roles from principal server
    Set @SQL = 'Select RoleP.name, LoginP.name' + CHAR(10) +
        'From '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_role_members RM' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + .*/ +'master.sys.server_principals RoleP' +
        CHAR(10) + char(9) + 'On RoleP.principal_id = RM.role_principal_id' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_principals LoginP' +
        CHAR(10) + char(9) + 'On LoginP.principal_id = RM.member_principal_id' + CHAR(10) +
        'Where LoginP.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And LoginP.name <> ''sa''' + CHAR(10) +
        'And LoginP.name Not Like ''##%''' + CHAR(10) +
        'And LoginP.name Not Like ''NT SERVICE%''' + CHAR(10) +
        'And RoleP.type = ''R''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', LoginP.name) = 0;';
    
    Insert Into @Roles (RoleName, LoginName)
    Exec sp_executesql @SQL;
    
    -- Get all explicitly granted permissions
    Set @SQL = 'Select P.name Collate database_default,' + CHAR(10) +
        '   SP.state_desc, SP.permission_name, SP.class, SP.class_desc, SP.major_id,' + CHAR(10) +
        '   SubP.name Collate database_default,' + CHAR(10) +
        '   SubEP.name Collate database_default' + CHAR(10) +
        'From '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_principals P' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_permissions SP' + CHAR(10) +
        CHAR(9) + 'On SP.grantee_principal_id = P.principal_id' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_principals SubP' + CHAR(10) +
        CHAR(9) + 'On SubP.principal_id = SP.major_id And SP.class = 101' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.endpoints SubEP' + CHAR(10) +
        CHAR(9) + 'On SubEP.endpoint_id = SP.major_id And SP.class = 105' + CHAR(10) +
        'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And P.name <> ''sa''' + CHAR(10) +
        'And P.name Not Like ''##%''' + CHAR(10) +
        'And P.name Not Like ''NT SERVICE%''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', P.name) = 0;'
    
    Insert Into @Perms (LoginName, PermState, PermName, Class, ClassDesc, MajorID, SubLoginName, SubEndPointName)
    Exec sp_executesql @SQL;
    
    --select * from @Logins;
    --select * from @Roles;
    --select * from @perms;
    
    
    Select @MaxID = Max(LoginID), @CurrID = 1
    From @Logins;
    
    While @CurrID <= @MaxID
    Begin
    Select @LoginName = Name,
        @IsDisabled = IsDisabled,
        @Type = [Type],
        @SID = [SID],
        @PasswordHash = PasswordHash
    From @Logins
    Where LoginID = @CurrID;
    
    --    If Not Exists (Select 1 From sys.server_principals
    --              Where name = @LoginName)
    Begin
    
        set @sql = char(10);
        set @sql += 'If Not Exists (Select 1 From sys.server_principals Where name = ''' + @LoginName + ''')' + char(10);
        set @sql += 'begin' + char(10) + '    ';
    
        Set @SQL += 'Create Login ' + quotename(@LoginName)
        If @Type In ('U', 'G')
        Begin
            Set @SQL = @SQL + ' From Windows;'
        End
        Else
        Begin
            Set @PasswordHashString = '0x' +
                Cast('' As XML).value('xs:hexBinary(sql:variable("@PasswordHash"))', 'nvarchar(300)');
    
            Set @SQL = @SQL + ' With Password = ' + @PasswordHashString + ' HASHED;  --, ';
    
            Set @SIDString = '0x' +
                Cast('' As XML).value('xs:hexBinary(sql:variable("@SID"))', 'nvarchar(100)');
            Set @SQL = @SQL + 'SID = ' + @SIDString + ';' + char(10);
        End
    
        set @sql += char(10) +
            '    print ''Created Login ' + @loginName  + ''';' + char(10) +
            'end' + char(10) +
            'else' + char(10) +
            convert(nvarchar(max), '    print ''Login ' + @loginName + ' already existed. '';') + char(10);
    
        If @Debug = 0
        insert into #sqlOut select @SQL;                      
        Else
        Print @SQL;
    
        If @IsDisabled = 1
        Begin
            Set @SQL = 'Alter Login ' + quotename(@LoginName) + ' Disable;'
            If @Debug = 0
                insert into #sqlOut select @SQL;                              
            Else              
                Print @SQL;              
        End
        End
    Set @CurrID = @CurrID + 1;
    End
    
    
    insert into #sqlOut select char(10) + 'use Master;' + char(10);
    
    Select @MaxID = Max(RoleID), @CurrID = 1
    From @Roles;
    
    While @CurrID <= @MaxID
    Begin
    Select @LoginName = LoginName,
        @RoleName = RoleName
    From @Roles
    Where RoleID = @CurrID;
    
    /*  If Not Exists (Select 1 From sys.server_role_members RM
                Inner Join sys.server_principals RoleP
                    On RoleP.principal_id = RM.role_principal_id
                Inner Join sys.server_principals LoginP
                    On LoginP.principal_id = RM.member_principal_id
                Where LoginP.type In ('U', 'G', 'S')
                And RoleP.type = 'R'
                And RoleP.name = @RoleName
                And LoginP.name = @LoginName)*/
    Begin
        If @Debug = 0
        Begin          
            insert into #sqlOut select 'Exec sp_addsrvrolemember @rolename = ''' + @RoleName + ''', @loginame = ''' + @LoginName + ''';';
        End
        Else
        Begin
            Print 'Exec sp_addsrvrolemember @rolename = ''' + @RoleName + ''',';
            Print '     @loginame = ''' + @LoginName + ''';';
        End
    End
    
    Set @CurrID = @CurrID + 1;
    End
    
    
    insert into #sqlOut select char(10) + 'use Master;' + char(10);
    
    
    Select @MaxID = Max(PermID), @CurrID = 1
    From @Perms;
    
    While @CurrID <= @MaxID
    Begin
    Select @PermState = PermState,
        @PermName = PermName,
        @Class = Class,
        @LoginName = LoginName,
        @MajorID = MajorID,
        @SQL = PermState + space(1) + PermName + SPACE(1) +
            Case Class When 101 Then 'On Login::' + QUOTENAME(SubLoginName)
                    When 105 Then 'On ' + ClassDesc + '::' + QUOTENAME(SubEndPointName)
                    Else '' End +
            ' To ' + QUOTENAME(LoginName) + ';'
    From @Perms
    Where PermID = @CurrID;
    
    /*If Not Exists (Select 1 From sys.server_principals P
                Inner Join sys.server_permissions SP On SP.grantee_principal_id = P.principal_id
                Where SP.state_desc = @PermState
                And SP.permission_name = @PermName
                And SP.class = @Class
                And P.name = @LoginName
                And SP.major_id = @MajorID)*/
    Begin
        If @Debug = 0
                insert into #sqlOut select @sql;                      
        Else          
            Print @SQL;          
    End
    
    Set @CurrID = @CurrID + 1;
    End
    
    
    select Command from #sqlOut as SqlOut order by Row;
    go
    
    
    --
    -- (6) Generate a script to Re-link all users to logins based on current state (before shutdown)
    --
    
    use Master;
    
    if object_id('tempdb..#sqlOut') is not null
    drop table #sqlOut;
    
    create table #sqlOut
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOut select char(10) + '-- RELINK USERS TO LOGINS' + char(10);
    
    insert into #sqlOut select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    declare @dbCmd varchar(8000) = '
    use ?;
    
    insert into #sqlOut select char(10) + ''use ?;'' + char(10);  
    
    with links as
    (
    select u.name as UserName,
        l.loginname as LoginName
        from sysusers u 
        join master..syslogins l
        on u.sid = l.sid        
    where u.name != ''dbo''
        and u.isSqlUser = 1 or l.isNtName = 1 or l.isNtGroup = 1
    )
    insert into #sqlOut 
    select ''alter user ['' + UserName + ''] with name = ['' + UserName + ''], login = ['' + LoginName + '']''
    from links
    ';    
    
    exec sp_MSforeachdb @dbCmd;
    
    select Command from #sqlOut order by Row;
    
    go

5) Chạy tập lệnh để Sao lưu tất cả các DB bao gồm hệ thống (master, msdb, model) sang ổ đĩa ngoài.

6) Chạy script để tách tất cả các DB

7) C Drive sẽ được định dạng lại. Bảo toàn LDF / MDF nếu chúng KHÔNG có trên C.

8) Windows Server 2012 được cài đặt trên C

9) Di chuyển LDF / MDF cho các tệp hệ thống gốc khỏi đường nếu chúng không có trên Ổ đĩa C.

10) SQL Server 2012 sẽ được cài đặt lại và vá vào SP3 a. Tạo lại tài khoản Người dùng / Nhóm hệ thống

11) DB hệ thống dự phòng đến một vị trí hoặc tên tệp MỚI (cẩn thận để không ghi đè lên bản gốc!).

12) Chạy tái tạo vai trò đoạn trích. Cái gì đó như:

USE [master]
CREATE SERVER ROLE [SomeServerRole]
--ALTER SERVER ROLE [dbcreator] ADD MEMBER [SomeServerRole]
--ALTER SERVER ROLE [bulkadmin] ADD MEMBER [SomeServerRole]
-- ALTER SERVER ROLE [SomeServerRole] ADD MEMBER [SomeMemberOrRole]

13) Chạy tái tạo tập lệnh đăng nhập (không làm gì nếu đăng nhập được khôi phục)

14) Dừng ĐẠI LÝ SQL.

(Có thể khôi phục lại Master ở đây, chúng tôi đã nản chí).

15) Đính kèm mdf / ldf bằng cách sử dụng tập lệnh ở trên. a. Nếu thất bại tự khôi phục từ bak bằng cách sử dụng tập lệnh từ trên.

16) Cố gắng khôi phục mô hình

17) Đảm bảo SQL Agent bị dừng. Khôi phục MSDB (liên kết) a. Nếu thất bại, cần tạo lại công việc + kế hoạch bảo trì + cấu hình thư + toán tử

18) Mở kịch bản người dùng để đăng nhập ...

    a. If there are master users (rare?) then First Re-Create users for master since it was not restored:
        use master;       
        CREATE USER [ABC] FOR LOGIN [machine\ABC]

    b. Run the rest of the script

19) Cho phép nhà môi giới dịch vụ khớp với giá trị ban đầu tên CHỌN, is_broker_enables TỪ sys.database;

    alter database MSDB set single_user with rollback immediate;
    ALTER DATABASE [MSDB] SET ENABLE_BROKER;
    alter database MSDB set multi_user;

20) Bắt đầu tác nhân SQL

21) Đặt ngưỡng song song thành giá trị ban đầu

22) Điều chỉnh bất kỳ cài đặt cơ sở dữ liệu nào về giá trị ban đầu của chúng:

 declare @dbCmd varchar(8000) = '
      use ?;
      if db_name() not in (''master'', ''model'', ''tempdb'', ''msdb'')
      begin
             print ''Adjusting [?]...'';    
            alter database [?] set single_user with rollback immediate;
             aLTER AUTHORIZATION ON DATABASE::[?] to [sa];
            -- alter database [?] set trustworthy on;
            ALTER DATABASE [?] SET AUTO_CLOSE OFF WITH NO_WAIT;     
            alter database [?] set multi_user;
      end     
      else
             print ''Skipping [?]...'';
    ';    

    exec sp_MSforeachdb @dbCmd;

23) Kiểm tra quyền sở hữu công việc:

select s.name as JobName, l.name as login, SUSER_SNAME(s.owner_sid) AS login2
from  msdb..sysjobs s 
left join master.sys.syslogins l on s.owner_sid = l.sid

Nếu Phiên bản SQL Server cũng được nâng cấp, tôi không tin rằng mô hình và cơ sở dữ liệu msdb có thể đã được khôi phục nên các công việc sẽ bị mất do https://support.microsoft.com/en-us/kb/264474

Cái gì còn thiếu:

  • Người dùng gốc trong cơ sở dữ liệu chủ (hiếm?)
  • Vai trò máy chủ
  • ?

0

Không có gì sai với cả hai cách tiếp cận - tôi đã thực hiện cả hai và cả hai kết quả đều tốt.

Nếu có vấn đề với cách tiếp cận di chuyển, thì đó không phải là kỹ thuật: đó là sự lười biếng. Tôi thường thấy rằng lý do một công ty chưa hoàn toàn chuyển sang phiên bản xxxx là vì họ đã chọn di chuyển swing và không bao giờ thực hiện công việc khó khăn để hoàn toàn di chuyển. Bây giờ họ có hai hoặc nhiều bộ máy chủ thay vì một.

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.