Khôi phục sao lưu cơ sở dữ liệu SQL Server trên phiên bản thấp hơn


185

Làm cách nào để khôi phục tệp sao lưu cơ sở dữ liệu SQL Server phiên bản cao hơn vào SQL Server phiên bản thấp hơn?

Sử dụng SQL Server 2008 R2 (10.50.1600) , tôi đã tạo một tệp sao lưu và bây giờ tôi muốn khôi phục nó trên SQL Server 2008 của máy chủ trực tiếp của tôi (10,00.1600) .

Khi tôi cố gắng khôi phục bản sao lưu vào SQL Server 2008, nó sẽ báo lỗi, Restore Failedvì:

Cơ sở dữ liệu đã được sao lưu trên máy chủ đang chạy phiên bản 10.50.1600. Phiên bản đó không tương thích với máy chủ này, phiên bản đang chạy phiên bản 10:00.1600.

Làm cách nào để khôi phục tệp sao lưu trên máy chủ này?


2
Bạn không thể làm điều này - nó chỉ là không thể. SQL Server không cho phép * hạ cấp "cơ sở dữ liệu từ phiên bản cao hơn xuống phiên bản thấp hơn.
marc_s

18
Microsoft biết mọi thứ về máy chủ SQL (vì họ đã tạo ra nó) và việc di chuyển dữ liệu giữa 2 phiên bản là không thể. Tôi chỉ đơn giản là không hiểu tại sao một số loại chế độ tương thích không có sẵn trong xuất khẩu. Làm thế nào nó có thể khó khăn?
dvdmn

1
@dvdmn khó như bất kỳ tập Top Gear nào mà họ nói rằng - các loại khác nhau, các tuyên bố khác nhau, bố cục khối khác nhau. Di chuyển dữ liệu giữa các cơ sở dữ liệu là rất dễ dàng, bất kể các phiên bản liên quan. Hạ cấp mặc dù là không .
Panagiotis Kanavos

2
@PanagiotisKanavos Tôi không đồng ý, trong mysql bạn có thể xuất db dưới dạng các lệnh sql và bạn có thể khôi phục nó trên bất kỳ phiên bản nào của mysql (xuống hoặc lên). Có, bạn cũng có thể xuất db sql dưới dạng tập lệnh nhưng việc khôi phục nó không dễ dàng nếu bạn có một số chức năng / thủ tục được lưu trữ phụ thuộc lẫn nhau. Nó là cơ bản không hữu ích / giải pháp.
dvdmn

3
@dvdmn xuất các tập lệnh của cơ sở dữ liệu hoàn toàn khác với sao lưu. Tôi nhận thấy một số sản phẩm không cung cấp chức năng sao lưu / khôi phục hoặc tệ hơn, làm rối loạn hai khái niệm. Điều này thường xảy ra do các lý do lịch sử: thiếu sao lưu trong quá khứ, một số sản phẩm được gọi là xuất / tập lệnh theo tên đó. Bây giờ họ đã làm , họ phải tiếp tục giải quyết xung đột thuật ngữ, bằng cách nói về các bản sao lưu vật lý và logic, sau đó bị lẫn lộn khi họ nói về kịch bản
Panagiotis Kanavos

Câu trả lời:


78

Không, không thể hạ cấp cơ sở dữ liệu. 10.50.1600 là phiên bản SQL Server 2008 R2 . Hoàn toàn không có cách nào bạn có thể khôi phục hoặc đính kèm cơ sở dữ liệu này vào phiên bản SQL Server 2008 mà bạn đang cố gắng khôi phục (10,00.1600 là SQL Server 2008). Lựa chọn duy nhất của bạn là:

  • nâng cấp phiên bản này lên SQL Server 2008 R2 hoặc
  • khôi phục bản sao lưu bạn có trên phiên bản SQL Server 2008 R2, xuất tất cả dữ liệu và nhập nó trên cơ sở dữ liệu SQL Server 2008.

Tôi không thể nâng cấp máy khách trực tiếp vì hạn chế cấp phép. và kích thước cơ sở dữ liệu của tôi là hơn 2,5 GB vì vậy tôi không thể tạo tập lệnh dữ liệu do lỗi ngoại lệ bộ nhớ.

9
@Gaurav Không tập lệnh ra dữ liệu - thay vào đó, tập lệnh ra toàn bộ cơ sở dữ liệu (bảng, procs, trình kích hoạt, ràng buộc, v.v.) không có dữ liệu, tạo cơ sở dữ liệu mới, sau đó nhấp chuột phải vào cơ sở dữ liệu nguồn, đi đến "Công cụ", sau đó "Xuất dữ liệu" để chuyển nội dung của các bảng vào cơ sở dữ liệu của bạn.
Jim McLeod

17
Tôi rất nghi ngờ về một câu trả lời vỗ "không có cách nào khả thi" - điều đó chỉ có nghĩa là bạn chưa tìm được đường. Có thể có nhiều lý do tại sao bạn muốn làm điều này, vì vậy đây không phải là một câu trả lời hữu ích.
Jay Imerman

6
Tôi không đồng ý, @Jay, đôi khi "bạn không thể" là câu trả lời hoàn hảo, mặc dù nó hữu ích hơn khi cung cấp cách giải quyết khi có sẵn.
Russell Fox

1
@Zhang nếu bạn có thắc mắc, hãy hỏi họ dưới dạng câu hỏi, không phải bình luận.
Remus Rusanu

83

Bạn có thể sử dụng chức năng được gọi là Xuất dữ liệu ứng dụng cấp để tạo .bacpactệp bao gồm lược đồ cơ sở dữ liệu và dữ liệu.

Trên máy chủ đích, bạn có thể sử dụng tùy chọn Nhập ứng dụng Cấp dữ liệu để tạo và điền cơ sở dữ liệu mới từ .bacpactệp được tạo trước

Nếu bạn chỉ muốn chuyển lược đồ cơ sở dữ liệu, bạn có thể sử dụng Trích xuất ứng dụng Cấp dữ liệu để tạo tệp và Triển khai Ứng dụng Cấp dữ liệu để triển khai lược đồ cơ sở dữ liệu đã tạo.

Tôi đã thử quy trình này trên các phiên bản khác nhau của SQL Server từ SQL 2014 đến SQL 2012 và từ SQL 2014 đến SQL 2008R2 và hoạt động tốt.


8
Đây là một câu trả lời đáng được chú ý hơn. Nó thực sự chỉ làm việc cho hầu hết các trường hợp. Tuy nhiên, nếu bạn có người dùng SQL ở đó mồ côi, các hoạt động Xuất sẽ thất bại. Bạn luôn có thể xóa / thêm các bit đó theo cách thủ công để vượt qua các phiên bản SQL.
Bác sĩ Blue

3
Tôi vừa thử điều này, để tạo một DB được tạo trên MSSQLEX2014 (V12) trên MSSQLEX2012 (V11) của tôi. Tôi chỉ nhận được một lỗi "Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider không hợp lệ" mà không có cách nào để thay đổi nó.
Craig

5
Nhập từ SQL Server 2014 đến 2012 bằng cách sử dụng .bakpac DOES hoạt động, nhưng nó yêu cầu phiên bản SSMS chính xác. Ví dụ, tôi sử dụng SSMS 2016 CTP3 và nó hoạt động hoàn hảo. Nó không hoạt động đối với tôi khi sử dụng SSMS 2012. Tôi chưa thử nghiệm SSMS 2014.
Greg Gum

1
Bất cứ ai cũng biết nếu một người có thể kịch bản thủ tục này trong T-SQL? CẬP NHẬT (tự trả lời sau một chút googling): bạn có thể tự động hóa điều này thông qua sqlpackage.exedòng lệnh. Google để biết thêm.
Alex

1
Đây là giải pháp duy nhất phù hợp với tôi khi hạ cấp SQL2017 khá lớn / phức tạp thành SQL2016. Hiệu suất cũng rất tốt.
Keith thổi vào

35

Sẽ không nhất thiết phải làm việc

Sẽ làm việc

  • Script hệ - Nhiệm vụ -> Tạo Script . Đảm bảo bạn đặt phiên bản SQL Server mục tiêu mong muốn trên Cài đặt tùy chọn tập lệnh -> Trang nâng cao . Bạn cũng có thể chọn ở đó để sao chép lược đồ, dữ liệu hoặc cả hai. Lưu ý rằng trong tập lệnh được tạo, bạn có thể cần thay đổi thư mục DATA cho các tệp mdf / ldf nếu chuyển từ không thể hiện sang thể hiện hoặc ngược lại.

  • Dịch vụ xuất bản cơ sở dữ liệu Microsoft SQL Server - đi kèm với SQL Server 2005 trở lên, tôi nghĩ vậy. Tải về phiên bản mới nhất từ đây . Điều kiện tiên quyết: sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msi, SQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi(tải về tại đây ).


7
Tạo tập lệnh là không đáng tin cậy cho cơ sở dữ liệu đáng kể, tránh nếu có thể.
Chris

Cả hai liên kết ở phía dưới là 404.
Sнаđошƒаӽ

29

Dưới đây là 2 xu của tôi về các tùy chọn khác nhau để hoàn thành việc này:

Công cụ của bên thứ ba : Có lẽ cách dễ nhất để hoàn thành công việc là tạo cơ sở dữ liệu trống ở phiên bản thấp hơn và sau đó sử dụng các công cụ của bên thứ ba để đọc bản sao lưu và đồng bộ hóa cơ sở dữ liệu mới được tạo với bản sao lưu.

Red gate là một trong những phổ biến nhất nhưng có nhiều cái khác như ApexSQL Diff , ApexSQL Data Diff , Adept SQL , Ideralahoma . Tất cả đều là những công cụ cao cấp nhưng bạn có thể hoàn thành công việc trong chế độ dùng thử;)

Tạo tập lệnh : như những người khác đã đề cập, bạn luôn có thể cấu trúc tập lệnh và dữ liệu bằng SSMS nhưng bạn cần xem xét thứ tự thực hiện. Theo mặc định, các kịch bản đối tượng không được sắp xếp chính xác và bạn sẽ phải quan tâm đến các phụ thuộc. Đây có thể là một vấn đề nếu cơ sở dữ liệu lớn và có nhiều đối tượng.

Trình hướng dẫn nhập và xuất : Đây không phải là một giải pháp lý tưởng vì nó sẽ không khôi phục tất cả các đối tượng mà chỉ có các bảng dữ liệu nhưng bạn có thể xem xét nó để sửa lỗi nhanh và bẩn khi cần.


1
Red Gate Sql Clone không hỗ trợ nhân bản giữa các phiên bản khác nhau của máy chủ SQL, báo cáo chính xác cùng một lỗi mà tôi gặp phải khi cố gắng thực hiện thủ công.
DarkDeny

29

Bạn không thể khôi phục cơ sở dữ liệu (hoặc đính kèm) được tạo ở phiên bản trên thành phiên bản thấp hơn. Cách duy nhất là tạo một tập lệnh cho tất cả các đối tượng và sử dụng tập lệnh để tạo cơ sở dữ liệu.

nhập mô tả hình ảnh ở đây

chọn "Lược đồ và dữ liệu" - nếu bạn muốn lấy cả hai thứ vào tệp tập lệnh sao lưu,
hãy chọn Chỉ lược đồ - nếu chỉ cần lược đồ.

nhập mô tả hình ảnh ở đây

Vâng, bây giờ bạn đã thực hiện với Tạo tập lệnh với Lược đồ và Dữ liệu của Cơ sở dữ liệu.


16

Một cách khác để làm điều này là sử dụng tính năng "Sao chép cơ sở dữ liệu":

Tìm bằng cách nhấp chuột phải vào cơ sở dữ liệu nguồn> "Nhiệm vụ"> "Sao chép cơ sở dữ liệu".

Bạn có thể sao chép cơ sở dữ liệu sang phiên bản thấp hơn của SQL Server Instance. Điều này hoạt động với tôi từ SQL Server 2008 R2 (SP1) - 10.50.2789.0 đến Microsoft SQL Server 2008 (SP2) - 10.0.3798.0


3
Lưu ý rằng điều này sẽ không hoạt động nếu mục tiêu là máy chủ SQL thể hiện "Máy chủ đích không thể là phiên bản SQL Server 2005 trở lên." social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/...
Ohad Schneider

2
Không thể sao chép cơ sở dữ liệu từ SQL Server 2012 sang SQL Server 2008 theo cách này.
Twinkles

1
Sao chép cơ sở dữ liệu thao tác Detach / Đính kèm
Panagiotis Kanavos

1
Cảm ơn gợi ý này! Điều đó đã giúp tôi rất nhiều. Tôi đã sao chép dữ liệu từ SQL 2008 R2 sang SQL 2008
dns_nx

8

Bạn có thể thử điều này.

  1. Tạo cơ sở dữ liệu trên SQL Server 2008.
  2. Sử dụng tính năng Nhập dữ liệu nhập dữ liệu từ SQL Server R2 (hoặc bất kỳ phiên bản cao hơn nào).
  3. sử dụng "RedGate SQLCompare" để đồng bộ hóa tập lệnh.

6

Đi tới Nhiệm vụ-> Tạo tập lệnh ...

Trong phần Nâng cao trong "Các loại dữ liệu cho tập lệnh", chọn "Schema and data"và thử chạy tập lệnh này trong phiên bản thấp hơn của bạn.


5
Đây là giải pháp rất tốt nhưng hoạt động rất kém với cơ sở dữ liệu lớn hơn.
veljasije

5

Nó không đẹp, nhưng đây là cách tôi đã cho phép bạn cài đặt tùy chọn này trên bản cài đặt SQL 2008 R2 của bạn ..

1) Nhấp chuột phải vào cơ sở dữ liệu trong SQL Server 2008 R2 "Nhiệm vụ" .. "Tạo tập lệnh" trong trình hướng dẫn, chọn toàn bộ cơ sở dữ liệu và các đối tượng trong bước đầu tiên. Ở bước "Đặt tùy chọn tập lệnh", bạn sẽ thấy nút "Nâng cao", chọn tùy chọn này và đảm bảo bạn chọn "Tập lệnh cho phiên bản máy chủ" = SQL Server 2008 "không phải phiên bản R2. Đây là bước quan trọng, vì" nhập dữ liệu " tự nó không mang theo tất cả các khóa chính, constriants và bất kỳ đối tượng nào khác như các thủ tục được lưu trữ. "

2) Chạy tập lệnh SQL được tạo trên phiên bản cài đặt hoặc cơ sở dữ liệu mới SQL Express hoặc SQL Server 2008 bằng cách sử dụng cửa sổ truy vấn hoặc mở tập lệnh .sql đã lưu và thực thi và bạn sẽ thấy cơ sở dữ liệu mới.

3) Bây giờ, nhấp chuột phải vào cơ sở dữ liệu mới và chọn "Nhiệm vụ" .. "Nhập dữ liệu .." chọn nguồn làm cơ sở dữ liệu R2 và đích là cơ sở dữ liệu mới. "Sao chép dữ liệu từ một hoặc nhiều bảng hoặc dạng xem", chọn hộp kiểm trên cùng để chọn tất cả các bảng và sau đó là bước tiếp theo, chạy gói và bạn sẽ có mọi thứ trên phiên bản cũ hơn. Điều này cũng sẽ hoạt động để quay lại phiên bản 2005. Mong rằng nó giúp ai đó thoát.


xin chào @m photoeek, tôi có cùng một vấn đề, nhưng tôi có R2 trên máy chủ sản xuất và 2008 trên máy cục bộ, trong trường hợp này tôi không thể sử dụng dữ liệu nhập và xuất. giải pháp lý tưởng cho việc này là gì?
Abbas

2

bạn có thể sử dụng BCP vào và ra cho các bảng nhỏ.

Lệnh BCP OUT: -

BCP "SELECT *  FROM [Dinesh].[dbo].[Invoices]" QUERYOUT C:\av\Invoices1.txt -S MC0XENTC -T -c -r c:\error.csv

Lệnh BCP IN: - Tạo cấu trúc bảng cho Invoicescopy1.

BCP [Dinesh].[dbo].[Invoicescopy1] IN C:\av\Invoices.txt -S MC0XENTC -T -c

0

Tôi đánh giá cao đây là một bài viết cũ, nhưng mọi người có thể biết rằng Trình hướng dẫn di chuyển Azure (có sẵn trên Codeplex - không thể liên kết đến vì Codeplex hiện tại sẽ dễ dàng thực hiện điều này).


Công cụ đó đã được thay thế bằng Trợ lý di chuyển dữ liệu SQL Server. Xem: stackoverflow.com/questions/46517060/ Lời
ahwm

0

Bạn sẽ phải sử dụng trình hướng dẫn Nhập / Xuất trong SSMS để di chuyển mọi thứ

Không thể "hạ cấp" bằng cách sử dụng sao lưu / khôi phục hoặc tách / đính kèm. Do đó, những gì bạn phải làm là:

  1. Sao lưu cơ sở dữ liệu từ máy chủ chạy phiên bản SSMS / SQL mới.
  2. Nhập dữ liệu từ tệp .bak đã tạo, bằng cách mở rộng menu "Nhiệm vụ" (sau khi nhấp chuột phải vào cơ sở dữ liệu đích) và chọn tùy chọn "Nhập dữ liệu".

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.