Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Thư viện IBSurgeon

Tất cả các phiên bản Firebird và InterBase On-Disk-Structure (ODS)

Bởi Dmitry Kuzmenko, 24-Tháng 5-2016

Số ODS (On-Disk Structure) là gì

Nói một cách đơn giản, ODS (On-Disk Structure) là số định dạng tệp cơ sở dữ liệu cho phiên bản Firebird hoặc InterBase RDBMS cụ thể.

Hầu hết các phiên bản đều sử dụng cái gọi là “Y-valve” để hỗ trợ ODS hiện tại và một số ODS cũ. Điều này cho phép máy chủ làm việc với các tệp cơ sở dữ liệu từ các phiên bản trước và đơn giản hóa quá trình chuyển đổi từ máy chủ cũ sang máy chủ mới. Nhưng có một số hạn chế, sẽ được mô tả thêm bên dưới.

Bạn có thể tìm ra ODS của cơ sở dữ liệu của mình bằng cách chạy lệnh sau

Code
gstat -h database_file_name

Tên người dùng và mật khẩu ở đây là không cần thiết, vì gstat với tùy chọn -h chỉ đọc phần vật lý của cơ sở dữ liệu (trang tiêu đề, số 0).

Nếu gstat không hiểu thông tin đã đọc, nó sẽ hiển thị thông báo tương ứng - những gì nó mong đợi và những gì nó tìm thấy.

Ví dụ: nếu chúng ta chạy gstat từ InterBase 4 trên cơ sở dữ liệu từ Firebird 2, nó sẽ hiển thị

Code
Wrong ODS version, expected 8, encountered 32779?

Ở đây, bạn thấy số ODS 32779 - đây là mã hóa của 11, với bit cao được thêm vào từ Firebird 2.0 (ở dạng hex sẽ là 800B, trong đó B = 11), để tránh nhầm lẫn giữa cơ sở dữ liệu InterBase và Firebird, vì từ một thời điểm nào đó chúng có số ODS bằng nhau, nhưng định dạng cơ sở dữ liệu rất khác nhau. Ngoại lệ khi không nhận được thông báo dễ hiểu là khi gstat không thể tìm thấy firebird.msg hoặc interbase.msg. Nó sẽ hiển thị một cái gì đó như

Code
can't format message 21:3 -- message file ...msg not found

Vì vậy, điều này có nghĩa là bạn đã cài đặt Firebird hoặc InterBase không đúng và cần phải sửa lỗi đó.

Một số ví dụ:

Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x cố mở cơ sở dữ liệu Firebird 2.x

Wrong ODS version, expected 8, encountered 13? - InterBase 4.x cố mở cơ sở dữ liệu IntrBase 2009

Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 cố mở cơ sở dữ liệu Firebird 2.x

Wrong ODS version, expected 11, encountered 11 - Firebird 2.x cố mở cơ sở dữ liệu InterBase 7.x

Wrong ODS version, expected 11, encountered 15- Firebird 2.x cố mở cơ sở dữ liệu InterBase XE/XE3

Đôi khi bạn có thể nhận được một loại thông báo khác, từ máy chủ (không phải từ gstat) nhưng có cùng ý nghĩa.

Ví dụ: khi máy chủ Firebird 1.5 cố mở cơ sở dữ liệu Firebird 2.x:

Code
unsupported on-disk structure for file ...; found 32779, support 10

Ở đây bạn có thể xem bảng phiên bản ODS, kể từ InterBase 4.0 (1994).

Phiên bản máy chủ Số ODS chính Có thể làm việc với ODS Ghi chú
InterBase 4.0/4.1 8.0
InterBase 4.2 8.2 8.2 InterBase 4.2 buộc nâng cấp ODS 8.0 lên 8.2
InterBase 5.0/5.1 9.0 8.2 InterBase 5.x buộc nâng cấp ODS 8.0 lên 8.2
InterBase 5.5/5.6 9.1 8.2
InterBase 6.0
Firebird 1.0
Yaffil 1.0
10.0 9.0/9.1 Làm việc với ODS 9.x là nguy hiểm, vì InterBase và Firebird mới sử dụng định dạng siêu dữ liệu mới, không được InterBase 5.x nhận diện
Firebird 1.5 10.1 9.0/9.1/10.0 ODS 10.1 của Firebird 1.5 64bit không tương thích với ODS 10.1 32bit. Đây là sự không tương thích duy nhất được biết đến của định dạng cơ sở dữ liệu giữa các phiên bản 32/64bit.
InterBase 7.0 11.0 10.0 Không tương thích với ODS 11 của Firebird 2.x
InterBase 7.1 11.1 10.0 InterBase 7.5 sẽ nâng cấp InterBase ODS 11.0/11.1 lên 11.2, không tương thích với các phiên bản trước (7.0/7.1)
InterBase 7.5 11.2 10.0
Firebird 2.0 11.0 10.x ODS 11 của Firebird 2.0 không tương thích với InterBase 7.x
Firebird 2.1 11.1 10.x/11.0 ODS 11 của Firebird 2.0 không tương thích với InterBase 7.x
Firebird 2.5 11.2 10.x/11.x ODS 11.2 không tương thích với Firebird 2.0/2.1.
Firebird 3.0 12.0 Không hỗ trợ ODS trước đó, chỉ 12.0
Firebird 4.0 13.0 13.0
Firebird 5.0 13.1 13.0, 13.1 Cơ sở dữ liệu có thể được nâng cấp từ 13.0 lên 13.1 bằng gfix -upgrade từ 13.0, hoặc bằng sao lưu/phục hồi
InterBase 2007 12.0 11.x
InterBase 2009 13.1 12.0
InterBase XE, XE3 15.0 13.1 ODS 14 ở đâu?
InterBase XE7 16.0 15, 13 ODS “hiện tại” có thể được thiết lập trong IBCONFIG. Bằng cách này XE7 sẽ tạo cơ sở dữ liệu (bao gồm cả phục hồi) với ODS được chỉ định (13, 15, 16) làm mặc định.

Nâng cấp ODS

Mỗi phiên bản máy chủ luôn sử dụng (ngoại trừ InterBase XE7) số ODS chính của nó cho cơ sở dữ liệu được tạo hoặc phục hồi. Nếu ODS của cơ sở dữ liệu nhỏ hơn ODS chính của máy chủ, máy chủ có thể làm việc với cơ sở dữ liệu đó nếu nó hỗ trợ ODS của cơ sở dữ liệu.

Đôi khi máy chủ có thể nâng cấp ODS cũ lên phiên bản mới hơn mà không thông báo. Điều này có thể dẫn đến việc không thể quay lại phiên bản trước. Ví dụ: nếu bạn mở cơ sở dữ liệu có ODS 8.0 bằng InterBase 4.2, nó sẽ nâng cấp ODS lên 8.2, mà InterBase 4.0/4.1 không hiểu được. Vì vậy, việc nâng cấp nhỏ ODS làm cho cơ sở dữ liệu không tương thích trong cùng phiên bản máy chủ chính. Điều này cũng đúng với Firebird 2.5 và InterBase 7.5.

Để tránh các vấn đề khi quay lại phiên bản trước, chúng tôi khuyên bạn nên sao lưu trên phiên bản máy chủ hiện tại ngay cả trước khi nâng cấp nhỏ phiên bản máy chủ của bạn.

Sự khác biệt giữa ODS (chính hoặc phụ) có thể lớn hoặc nhỏ. Nếu bạn đủ tò mò, bạn có thể mở jrd\ods.h (Firebird mã nguồn mở) và tìm sự khác biệt giữa các ODS. Ví dụ: ODS 9.0 so với 8.x có tính toàn vẹn tham chiếu khai báo, vai trò SQL, thu gom rác trong chỉ mục. Nhưng ODS 9.1 chỉ khác 9.0 ở một chỉ mục, được thêm vào một số bảng hệ thống.

Lưu ý rằng phiên bản ODS chính không thể được nâng cấp trực tiếp. Bạn chỉ có thể nâng cấp nó bằng cách sao lưu/phục hồi.

Di chuyển giữa InterBase và Firebird

Các phiên bản cuối của Firebird (3.0) và InterBase (XE7) rất khác nhau, về tính năng và ODS. Như đã nói trước đó, ODS chung cuối cùng là ODS 10, và kể từ đó (Firebird 2.0 và InterBase 7.0) các cơ sở dữ liệu không tương thích với định dạng của nhau.

Vì vậy, việc di chuyển sẽ dễ dàng hơn nếu bạn chưa sử dụng các tính năng kể từ InterBase 7.x hoặc Firebird 1.5. Nếu có - độ phức tạp của việc di chuyển sẽ phụ thuộc vào số lượng tính năng bạn đã sử dụng trong cơ sở dữ liệu hoặc quy trình quản trị.

Hiện tại, sau nhiều năm phát triển Firebird và InterBase, việc di chuyển giữa các phiên bản mới nhất của các máy chủ này là khó khăn.

Dù sao đi nữa, nếu bạn cố gắng làm điều này, bạn cần trích xuất tập lệnh siêu dữ liệu từ cơ sở dữ liệu, sau đó thử tạo cơ sở dữ liệu mới từ tập lệnh đó, sử dụng cùng một máy chủ.

Code
isql -x db.gdb …
isql -i script.ddl …

Điều này cần được thực hiện để kiểm tra xem có bất kỳ siêu dữ liệu cũ xấu nào trong cơ sở dữ liệu của bạn hoặc lỗi trích xuất tập lệnh trong máy chủ bạn đang sử dụng hay không. InterBase và Firebird lưu trữ các thủ tục, trình kích hoạt và khung nhìn (và một số đối tượng khác) ở dạng biên dịch (BLR - Binary Language Representation), và trong quá trình sao lưu/phục hồi, siêu dữ liệu không được biên dịch lại (từ SQL sang BLR).

Trong trường hợp này, nếu cơ sở dữ liệu được tạo từ lâu và liên tục được sửa đổi, có thể có BLR không chính xác (cũ) cho một số đối tượng. Các đối tượng này vẫn có thể hoạt động, nhưng cố gắng tạo lại chúng (ALTER) có thể gây ra lỗi cú pháp (hoặc lỗi khác).

Sau đó, bạn có thể thử tạo cơ sở dữ liệu từ tập lệnh đã sửa trên máy chủ mới. Sau khi bạn sửa tất cả các không tương thích trong tập lệnh này, bạn có thể bơm dữ liệu từ cơ sở dữ liệu cũ sang cơ sở dữ liệu mới.

Ngay cả khi bạn đã thử sao lưu trên máy chủ cũ và phục hồi trên máy chủ mới, và nó hoạt động - đừng bao giờ tin tưởng điều này. Nếu cơ sở dữ liệu của bạn chứa nhiều đối tượng, bạn không thể kiểm tra tất cả chúng cùng một lúc trên máy chủ mới, vì vậy, lỗi sẽ xuất hiện sau đó một thời gian.

Cách quay lại phiên bản trước của Firebird hoặc InterBase

Đôi khi, bạn có thể cần thực hiện hạ cấp và quay lại từ máy chủ mới. Lý do có thể khác nhau - lỗi đột ngột trong máy chủ, vấn đề hiệu suất, v.v.

Nếu bạn đã sao lưu trước khi nâng cấp máy chủ, sẽ không có vấn đề gì để quay lại. Nhưng nếu không, bạn sẽ phải đối mặt với vấn đề quay lại từ ODS mới sang ODS cũ.

Để làm điều đó, bạn sẽ cần 2 máy tính với máy chủ mới và máy chủ cũ. Nếu bạn chưa sử dụng bất kỳ tính năng mới nào của máy chủ X (phiên bản InterBase hoặc Firebird), bạn có thể quay lại X-1 theo các bước sau:

  1. Lấy tiện ích gbak từ máy chủ X-1 và tạo bản sao lưu bằng nó trên máy chủ X
  2. Chuyển bản sao lưu đến máy chủ X-1 và phục hồi nó

Nếu có một số vấn đề ở bước 1, bạn có thể thử

  1. Tạo bản sao lưu trên máy chủ X, sử dụng gbak của nó
  2. Sao chép tiện ích gbak từ X sang X-1
  3. Phục hồi bản sao lưu trên X-1 bằng gbak từ X

Lưu ý rằng giao thức cục bộ giữa máy chủ X và X-1 có thể không tương thích, vì vậy, tốt hơn nên chỉ định tên máy chủ:

Code
gbak -b localhost:c:\dir\data.gdb

Kết quả sẽ chỉ thành công với điều kiện là bạn chưa thay đổi bất kỳ đối tượng cơ sở dữ liệu nào trên máy chủ X kể từ khi bạn nâng cấp từ X-1.

Dưới đây là các ví dụ:

  • Từ 5.x xuống 4.2 - không được sử dụng vai trò và tính toàn vẹn tham chiếu khai báo mới
  • Từ 6.x xuống 5.x - không có thay đổi siêu dữ liệu, vì 6.x sử dụng định dạng BLR mới
  • Từ InterBase 7.x sang Firebird - không có cột boolean và tên đối tượng dài hơn 31 ký tự.
  • Từ Firebird 1.5 sang InterBase - không có cột BIGINT và các phần mở rộng SQL mới trong trình kích hoạt và thủ tục
  • Từ Firebird 2.0 xuống Firebird 1.5 - không có chức năng mới nào của Firebird 2.0.
  • Và cứ thế

Nếu vẫn còn lỗi không thể sửa, cách duy nhất là tạo cơ sở dữ liệu trên máy chủ X-1 từ tập lệnh SQL và bơm dữ liệu.

Dịch vụ di chuyển Firebird

Thường thì việc di chuyển là một nhiệm vụ phức tạp, đặc biệt đối với các cơ sở dữ liệu Firebird kế thừa, đã bị các nhà phát triển ban đầu bỏ rơi. Công ty chúng tôi cung cấp dịch vụ di chuyển toàn diện cho các cơ sở dữ liệu Firebird phức tạp. Phí thông thường là 2900 USD.

Ví dụ: chúng tôi đã di chuyển một cơ sở dữ liệu có tập lệnh SQL dài 55 Megabyte, với hơn 5000 thủ tục lưu trữ, 1000 bảng và vài nghìn truy vấn SQL đặc biệt, trong vòng chưa đầy 3 tháng.

Nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi [email protected]