З огляду на будь-яку версію Oracle:
- Як знайти свій поточний SCN?
- Який максимально можливий SCN?
З огляду на будь-яку версію Oracle:
Відповіді:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10 г і вище:
SELECT current_scn
FROM V$DATABASE;
SCN має жорсткий ліміт, накладений своїм форматом, і м'який ліміт, накладений штучно Oracle, як описано тут . Я цитував відповідні частини нижче (акцент додано).
Архітектори флагманського додатку бази даних Oracle, мабуть, добре знали, що SCN повинен бути великим цілим числом. Це: 48-бітове число ( 281,474,976,710,656 ). Минуло б еони, щоб база даних Oracle затьмарила таку кількість транзакцій і спричинила проблеми - інакше ви можете подумати.
Проміжна межа походить від дуже простого розрахунку, прикріпленого до моменту часу 24 роки тому: візьміть кількість секунд з 00:00:00 01.01.1988 і помножте цю цифру на 16 384. Якщо поточне значення SCN нижче цього, то все добре і обробка триває як звичайна. Простіше кажучи, підрахунок передбачає, що база даних, що працює з 01.01.1988, постійно обробляє 16 384 транзакцій, не може існувати в реальності.
Цей сценарій (Oracle 10 г і вище) перевірить, яку частину жорстких і м'яких обмежень ви вичерпали. Завдяки Робу за те, що він запросив м'яку межу.
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;
Ось запит, який я придумав, щоб перевірити мої бази даних щодо надійності щодо проблеми помилки 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;
Більшість моїх баз даних, які використовують посилання на БД, значать 3,5% вичерпаності і можуть продовжуватись за поточною швидкістю 50+ років без проблем. Це не означає, що я захищений від того, щоб хтось тикав помилку SCN, але принаймні ми не знайшли базу даних, яка була набагато вищою за інші або була близькою до межі.
281,474,976,710,656 є жорсткою межею. Ви хочете дізнатись, що таке м'яка межа, оскільки це значення, яке ви вперше б'єте головою. М'який межа (приблизно) обчислюється кількістю пройдених секунд з 1 січня 1988 р. X 16384.