Como localizo meu SCN atual?

14

Dada qualquer versão do Oracle:

  • Como localizo meu SCN atual?
  • Qual é o SCN máximo possível?
Nick Chammas
fonte
Esta pergunta foi inspirada neste artigo . Provavelmente, há muitas pessoas da Oracle pesquisando esses números agora. :)
Nick Chammas
Parece que o link do meu comentário anterior agora está quebrado. Eu acredito que a página foi transferida aqui: infoworld.com/article/2618409/...
Nick Chammas

Respostas:

16

SCN atual

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g e superior:

SELECT current_scn
FROM V$DATABASE;

Limites de SCN

O SCN possui um limite rígido imposto por seu formato e um limite flexível imposto artificialmente pela Oracle, conforme descrito aqui . Citei as partes relevantes abaixo (ênfase adicionada).

Hard Limit

Os arquitetos do aplicativo de banco de dados principal da Oracle devem estar cientes de que o SCN precisava ser um número inteiro maciço. É: um número de 48 bits ( 281.474.976.710.656 ). Levaria éons para um banco de dados Oracle eclipsar esse número de transações e causar problemas - ou assim você pode pensar.

Limite suave

O limite flexível deriva de um cálculo muito simples ancorado em um ponto no tempo há 24 anos: Pegue o número de segundos desde 00:00:00 01/01/1988 e multiplique esse número por 16.384. Se o valor atual do SCN estiver abaixo disso, tudo estará bem e o processamento continuará normalmente. Para simplificar, o cálculo supõe que um banco de dados em execução constantemente desde 01/01/1988, processando 16.384 transações por segundo, não possa existir na realidade.

Verificação de limite de SCN

Este script (Oracle 10g e superior) verificará quanto dos limites rígidos e flexíveis você esgotou. Agradecemos a Rob por chamar o limite flexível.

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;
Nick Chammas
fonte
2
Vejo que você tem sua resposta. Você também deve ler o artigo de Riyaj em orainternals.com/2012/01/20/scn-what-why-and-how
Niall Litchfield
Obrigado pela referência! No caso de alguém mais quer ler, o artigo está agora em orainternals.wordpress.com/2012/01/19/scn-what-why-and-how
Magnus reftel
6

Aqui está uma consulta que eu criei para verificar a integridade dos meus bancos de dados em relação ao problema de bug do 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;

A maioria dos meus bancos de dados que usam links de banco de dados está na marca esgotada de 3,5% e pode continuar na taxa atual por mais de 50 anos sem problemas. Isso não significa que estou a salvo de alguém que esteja fazendo cócegas no bug do SCN, mas pelo menos não encontramos um banco de dados que fosse muito mais alto que os outros ou próximo ao limite.

David Mann
fonte
2

281.474.976.710.656 é o limite máximo. Você quer saber qual é o limite flexível, já que esse é o valor em que você acertaria sua cabeça primeiro. O limite flexível é (aproximadamente) calculado pelo número de segundos decorridos desde 1º de janeiro de 1988 x 16384.

Roubar
fonte
Não sei como as respostas antigas perderam o limite flexível (que é mencionado no artigo vinculado por Nick) - portanto, é uma boa ideia adicionar os detalhes ausentes.
Dez