2014-04-10 18 views
9

Chúng tôi có một thực hiện điều hành một cơ sở dữ liệu Firebird nơi mà chúng tôi nhận được lỗi này: "Hạn chế thực hiện vượt quá - Giao dịch đếm vượt Thực hiện một sao lưu và khôi phục để làm cơ sở dữ liệu có thể hoạt động một lần nữa."giao dịch Firebird Bá tước Vượt

Chúng tôi biết cách khắc phục điều này bằng cách chỉ đọc cơ sở dữ liệu, thực hiện sao lưu & khôi phục và đọc lại ghi, tuy nhiên chúng tôi không quá chắc chắn điều gì đang gây ra điều này. Tôi có cảm giác rằng các giao dịch được giới hạn đến một tỷ (?).

Có ai xác nhận điều đó không? Và cách chính xác để ngăn chặn điều này là gì?

Trả lời

13

Firebird có bộ đếm giao dịch tăng đơn điệu dưới dạng số nguyên 32 bit có dấu (cho 2,5 và trước đó). Vì vậy, số lượng giao dịch được giới hạn ở +/- 2 -1. Trong Firebird 3, id giao dịch đã được thay đổi thành số nguyên 48 bit không dấu (vì vậy giới hạn có 2), có chỗ để mở rộng đến số nguyên 64 bit trong tương lai AFAIK.

Bộ đếm giao dịch được đặt lại khi thực hiện sao lưu và khôi phục sử dụng gbak. Điều này có thể được thực hiện bất cứ lúc nào, nhưng khi giới hạn thực sự đạt tới nó yêu cầu đánh dấu cơ sở dữ liệu chỉ đọc, bởi vì trong cơ sở dữ liệu chỉ đọc, id giao dịch 'cuối cùng' của cơ sở dữ liệu được sử dụng cho các giao dịch mới thay vì phân bổ một ID giao dịch.

Firebird là cơ sở dữ liệu Kiểm soát đồng thời nhiều phiên bản MVCC, có nghĩa là nó duy trì nhiều phiên bản của một bản ghi. Các phiên bản ghi này được đánh dấu bằng id của giao dịch đã tạo phiên bản đó. Với bản sao lưu và khôi phục chỉ các phiên bản mới nhất được sao lưu và khôi phục các phiên bản ghi được viết bằng id giao dịch thấp (có thể là 1).

Không thể đặt lại bộ đếm giao dịch (hoặc ít nhất: có nhiều biến chứng) do khả năng hiển thị các phiên bản ghi cho các giao dịch khác dựa trên mức cách ly, thời gian giao dịch bắt đầu, v.v. đọc chỉ có thể xem các phiên bản ghi được tạo bởi các giao dịch đã được cam kết tại thời điểm giao dịch bắt đầu. Ghi lại các phiên bản được tạo bởi các giao dịch đang hoạt động hoặc bởi các giao dịch được thực hiện sau khi giao dịch bắt đầu là vô hình.

Không có cách nào để ngăn chặn điều này, ngoại trừ việc sao lưu thường xuyên và khôi phục thực tế trước khi đạt đến giới hạn giao dịch (vì điều đó cũng sẽ đặt lại id giao dịch).

+0

Cảm ơn bạn đã trả lời chi tiết! Điều này thật đúng với gì mà tôi đã tìm kiếm. – ceebreenk