Учитывая любую версию Oracle:
- Как мне найти мой текущий SCN?
- Каков максимально возможный SCN?
Учитывая любую версию Oracle:
Ответы:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g и выше:
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 10g и выше) проверит, сколько жестких и мягких ограничений вы исчерпали. Спасибо Робу за то, что он объявил мягкий предел.
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.