Có cách nào để xác định phiên bản SQL Server đã được sử dụng để tạo tệp MDF hoặc BAK không?


19

Tôi có một bản sao cục bộ của SQL Server DB được lưu dưới dạng tệp MDF. Có cách nào để biết phiên bản SQL Server nào đã được sử dụng để tạo tệp đó không?

Câu trả lời:


8

Bạn có thể xác định phiên bản của tệp MDF chính của cơ sở dữ liệu bằng cách xem hai byte ở offset 0x12064. Xem Cách xác định phiên bản cơ sở dữ liệu của tệp MDF .

Trong .bakcác tệp byte thấp hơn là 0xEAC và cao hơn là 0xEAD.

Bạn có thể tìm thấy hầu hết các số phiên bản cơ sở dữ liệu nội bộ cho MS SQL tại đây .


1
Chú thích! Điều này dường như khác nhau trên các phiên bản x64 của MS SQL. Trong tất cả các trường hợp có 4 khối - SFMB, SSET, VOLB, MSCI. Phiên bản nằm trong khối MSCI. Vấn đề là kích thước khối không phải là hằng số. May mắn thay, dường như kích thước khối có thể được chia cho 512 (0x200). Vì vậy, chỉ cần tìm kiếm mỗi 512 byte và tìm kiếm "MSCI". Sau đó nhảy 172 byte (0xAC) cho byte thấp hơn và byte tiếp theo cho byte cao hơn.
Nux

22

Sử dụng RESTORE CHÍNH HÃNG, vd

RESTORE HEADERONLY FROM DISK = 'D:\whatever.bak'

Bạn sẽ nhận được rất nhiều cột, nhưng những cột quan tâm là SoftwareVersionMajor, SoftwareVersionMinor và SoftwareVersionBuild, sẽ cung cấp cho bạn số phiên bản của SQL Server. Trên hệ thống của chúng tôi, ví dụ, đây là 10, 0 và 4000, nghĩa là 10.0.4000 (2008 SP2).

Không chắc chắn điều gì xảy ra nếu bạn cố gắng thực hiện việc này với bản sao lưu quá cũ để được khôi phục trên phiên bản mà máy chủ đang chạy, tuy nhiên - bạn có thể gặp lỗi và không có thông tin (mặc dù bản thân nó ít nhất sẽ cung cấp một số manh mối về phiên bản đó là từ).


1
Tôi sẽ thử cái này, nhưng tôi không có bất kỳ thiết bị sao lưu nào được thiết lập :-(. Tuy nhiên, cảm ơn vì lời đề nghị!
Ben McCormack

1
Lưu ý rằng bạn sẽ không nhận được kết quả có thể sử dụng được từ truy vấn này khi kiểm tra ví dụ: sao lưu SQL 2012 trên SQL 2008
Nux

6

Đối với các tệp MDF hãy thử lệnh này:

dbcc checkprimaryfile ('c:\MyApp\AppData\foo.mdf', 2)

Nó sẽ ra 3 thuộc tính với các giá trị: Database name, Database versionCollation.

Cú pháp theo sau (lệnh không có giấy tờ, do đó có thêm thông tin ở đây ):

KIỂM TRA DBCC ({'Tên tệp'} [, opt = {0 | 1 | 2 | 3}])

Tên tệp không là gì ngoài đường dẫn thực tế của tệp .mdf tệp dữ liệu chính của cơ sở dữ liệu SQL Server.

Opt = 0 - Xác minh xem tệp có phải là tệp Dữ liệu chính của Cơ sở dữ liệu SQL Server (.mdf) không.

Opt = 1 - Trả về Tên cơ sở dữ liệu, Kích thước, Kích thước tối đa, Tăng trưởng, Trạng thái và Đường dẫn của tất cả các tệp được liên kết với cơ sở dữ liệu.

Opt = 2 - Trả về tên cơ sở dữ liệu, phiên bản và thông tin đối chiếu.

Opt = 3 - Trả về Tên, Trạng thái và Đường dẫn của tất cả các tệp được liên kết với cơ sở dữ liệu.


1
bạn có thể muốn thêm một lời giải thích cho câu trả lời của mình để nó có ý nghĩa hơn.
Drew Khoury

0

Câu hỏi hay! Tôi không tin như vậy, ngoài quy trình thử và sai - nói - cố gắng khôi phục tệp sao lưu SQL Server 2008 R2 vào SQL Server 2005. Rõ ràng, điều đó sẽ không hoạt động. Tôi không thể nhớ liệu sử dụng Management Studio - và nhấp vào nút nội dung để khôi phục - sẽ cho bạn thấy bất cứ điều gì thú vị.

Tôi chưa thử chúng, nhưng có thể một công cụ của bên thứ ba như Khôi phục ảo của Red Gate sẽ cho bạn biết - nó cho phép bạn xem cơ sở dữ liệu "bên trong" tệp sao lưu. http://www.red-gate.com/products/dba/sql-virtual-restore/



0

Cách tốt nhất tôi từng thấy để làm điều này được lượm lặt từ bài đăng này trên các diễn đàn MSDN của SQL Server.

Về cơ bản nó liên quan đến việc vào tệp và kiểm tra trang khởi động của tệp mdf.

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.