Đưa ra bất kỳ phiên bản nào của Oracle:
- Làm cách nào để tìm SCN hiện tại của tôi?
- SCN tối đa có thể là gì?
Đưa ra bất kỳ phiên bản nào của Oracle:
Câu trả lời:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g trở lên:
SELECT current_scn
FROM V$DATABASE;
SCN có giới hạn cứng được áp đặt bởi định dạng của nó và giới hạn mềm do Oracle áp đặt một cách giả tạo, như được mô tả ở đây . Tôi đã trích dẫn các phần có liên quan dưới đây (nhấn mạnh thêm).
Các kiến trúc sư của ứng dụng cơ sở dữ liệu hàng đầu của Oracle phải nhận thức rõ SCN cần phải là một số nguyên lớn. Đó là: một số 48 bit ( 281,474,976,710,656 ). Sẽ mất rất nhiều thời gian để cơ sở dữ liệu Oracle làm lu mờ số lượng giao dịch và gây ra sự cố - hoặc bạn có thể nghĩ như vậy.
Giới hạn mềm xuất phát từ một phép tính rất đơn giản được neo vào một thời điểm cách đây 24 năm: Lấy số giây kể từ 00:00:00 01/01/1988 và nhân con số đó với 16.384. Nếu giá trị SCN hiện tại dưới mức đó, thì tất cả đều ổn và quá trình xử lý vẫn tiếp tục như bình thường. Nói một cách đơn giản, tính toán giả định rằng một cơ sở dữ liệu chạy liên tục kể từ ngày 01/01/1988, xử lý 16.384 giao dịch mỗi giây, không thể tồn tại trong thực tế.
Kịch bản này (Oracle 10g trở lên) sẽ kiểm tra mức độ giới hạn cứng và mềm mà bạn đã sử dụng. Cảm ơn Rob đã gọi ra giới hạn mềm.
WITH limits AS (
SELECT
current_scn
--, dbms_flashback.get_system_change_number as current_scn -- Oracle 9i
, (SYSDATE - TO_DATE('1988-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) * 24*60*60 * 16384
AS SCN_soft_limit
, 281474976710656 AS SCN_hard_limit
FROM V$DATABASE
)
SELECT
current_scn
, current_scn/scn_soft_limit*100 AS pct_soft_limit_exhausted
, scn_soft_limit
, current_scn/scn_hard_limit*100 AS pct_hard_limit_exhausted
, scn_hard_limit
FROM limits;
Đây là một truy vấn tôi đã đưa ra để kiểm tra cơ sở dữ liệu của mình về sự tỉnh táo liên quan đến vấn đề lỗi SCN:
# Show the amount of SCN keyspace we have used so far on this database
# By default the SCN max on a 10g/11g
# instance is a 48-bit integer (281,474,976,710,656)
SELECT NAME,
(current_scn/281474976710656)*100 as PCT_OF_SCN_KEYSPACE_USED,
ROUND(SYSDATE-CREATED) as DAYS_SINCE_DB_CREATION,
ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)) AS EST_DAYS_BEFORE_SCN_EXHAUSTED,
ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)/365) AS EST_YEARS_BEFORE_SCN_EXHAUSTED
FROM v$database;
Hầu hết các cơ sở dữ liệu của tôi sử dụng các liên kết DB đều ở mức cạn kiệt 3,5% và có thể tiếp tục ở tốc độ hiện tại trong hơn 50 năm mà không gặp vấn đề gì. Điều này không có nghĩa là tôi an toàn trước việc ai đó chọc vào lỗi SCN, nhưng ít nhất chúng tôi đã không tìm thấy một cơ sở dữ liệu cao hơn các cơ sở dữ liệu khác hoặc gần với giới hạn.
281,474,976,710,656 là giới hạn cứng. Bạn sẽ muốn biết giới hạn mềm là gì, vì đó là giá trị bạn chạm vào đầu tiên. Giới hạn mềm là (khoảng) được tính bằng số giây trôi qua kể từ ngày 1 tháng 1 năm 1988 x 16384.