Dada qualquer versão do Oracle:
- Como localizo meu SCN atual?
- Qual é o SCN máximo possível?
Dada qualquer versão do Oracle:
Respostas:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g e superior:
SELECT current_scn
FROM V$DATABASE;
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).
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.
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.
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;
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.
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.