Как мне найти мой текущий SCN?

14

Учитывая любую версию Oracle:

  • Как мне найти мой текущий SCN?
  • Каков максимально возможный SCN?
Ник Чаммас
источник
Этот вопрос был вдохновлен этой статьей . Вероятно, сейчас много людей из Oracle ищут эти цифры. :)
Ник Чаммас
Похоже, ссылка из моего предыдущего комментария теперь не работает. Я считаю, что эта страница была перенесена сюда: infoworld.com/article/2618409/…
Ник Чаммас

Ответы:

16

Текущий СКС

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g и выше:

SELECT current_scn
FROM V$DATABASE;

Пределы SCN

SCN имеет жесткое ограничение, налагаемое его форматом, и мягкое ограничение, налагаемое Oracle, как описано здесь . Я процитировал соответствующие части ниже (выделение добавлено).

Жесткий предел

Архитекторы флагманского приложения базы данных Oracle должны были хорошо понимать, что SCN должен быть целым числом. Это: 48-разрядное число ( 281 474 976 710 656 ). Для базы данных Oracle потребуются эоны, чтобы затмить такое количество транзакций и вызвать проблемы - или вы можете подумать.

Soft Limit

Мягкий предел вытекает из очень простого вычисления, привязанного к моменту времени 24 года назад: возьмите количество секунд с 00:00:00 01.01.1988 и умножьте эту цифру на 16 384. Если текущее значение SCN ниже этого, тогда все в порядке, и обработка продолжается как обычно. Проще говоря, расчет предполагает, что база данных, постоянно работающая с 01.01.1988, обрабатывающая 16 384 транзакций в секунду, в действительности не может существовать.

Проверка предела SCN

Этот скрипт (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;
Ник Чаммас
источник
2
Я вижу, у тебя есть ответ. Вы также должны прочитать статью Рияджа
Найл Литчфилд
Спасибо за ссылку! В случае, если кто-то еще захочет это прочитать, статья теперь на orainternals.wordpress.com/2012/01/19/scn-what-why-and-how
Magnus Reftel
6

Вот запрос, который я пришел, чтобы проверить мои базы данных на предмет исправности в отношении ошибки 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, но, по крайней мере, мы не нашли базу данных, которая была бы намного выше других или близка к пределу.

Дэвид Манн
источник
2

281 474 976 710 656 - это жесткий предел. Вы захотите узнать, что такое мягкий предел, так как это значение, которое вы в первую очередь ударили по голове. Мягкий предел (приблизительно) рассчитывается по количеству секунд, прошедших с 1 января 1988 года x 16384.

обкрадывать
источник
Я не знаю, как старые ответы не соответствовали мягкому пределу (который упоминается в статье, связанной Ником) - так что это хорошая идея для добавления недостающих деталей.
Дезсо