Redgate Hub

para muitas pessoas que trabalham com o Oracle database, o SCN (System Change Number) é um tópico que os interessa muito – mas, apesar de ser um tópico fascinante, também é confuso. Neste artigo, aprenderemos o âmago da questão do SCN: o que é, onde é usado e como funciona.

vale ressaltar que isso não é e não pode ser uma cobertura completa de todos os detalhes sobre SCN. Com isso dito, vamos começar.

SCN – por que precisamos disso?

suponha que seja o fim do mês e seu dia de pagamento. Você está no grupo de folha de pagamento e, com autoridade apropriada, emitiu uma consulta para puxar o cálculo do salário atual de todos os funcionários. Os números estão fluindo pela tela, tudo está indo muito bem.

suponha que, enquanto você está olhando para a saída, um colega inicia uma nova execução de pagamento e esse trabalho em lote limpa o resumo do cálculo atual. As coisas certamente se tornariam confusas se sua saída de repente mostrasse ‘0’ para as novas linhas saindo.

de fato, para esse cenário, você provavelmente esperaria que a saída refletisse o ‘estado do banco de dados’ – o conteúdo de cada linha – da maneira que existia no momento em que você emitiu sua consulta.

uma das garantias do banco de Dados Oracle é que”não há leituras sujas de dados do Usuário”. Se necessário, o Oracle reconstruirá cada linha para o estado estável no momento em que a consulta foi emitida.

Oracle faz isso bem e com muita precisão através de um” temporizador ” próprio, conhecido como o número de mudança do sistema, também conhecido como SCN.

discutiremos esses aspectos do SCN:

  • O número em si
  • O gerador de números
  • Locais em que o número é armazenado

Então, vamos começar!

Blocos de construção para entender SCN

para investigar SCN, vários termos devem ser entendidos. Embora essas definições estejam bem documentadas, vale a pena repeti-las aqui:

transação

do Guia de conceitos da documentação online da Oracle:

“uma transação é uma unidade atômica lógica de trabalho que contém uma ou mais instruções SQL. Uma transação agrupa instruções SQL para que sejam todas confirmadas, o que significa que são aplicadas ao banco de dados ou todas revertidas, o que significa que são desfeitas do banco de dados. O Oracle Database atribui a cada transação um identificador exclusivo chamado ID de transação”.

mais simplesmente: quando iniciamos uma transação, iniciamos um conjunto de alterações. Estes devem ser concluídos na totalidade ou não devem ser concluídos. À medida que as transações ocorrem no banco de dados, os usuários que lêem qualquer área alterada não devem ser afetados por quaisquer efeitos colaterais que possam alterar seus resultados.

para que as transações estejam funcionando corretamente em qualquer banco de dados, quatro regras ACID devem ser seguidas pelo banco de dados. Estes são:

  • Atomicidade;
  • Consistência;
  • Isolamento;
  • Durabilidade.

então, onde o SCN se encaixa em tudo isso? E a resposta dessa pergunta é que usar SCN apenas Oracle mantém a consistência dos dados. Isso é feito para garantir que, em qualquer ponto do tempo, não haja discrepância nos resultados que são mostrados aos outros quando um usuário está mudando algo e vice-versa.

para resumir, no Oracle, o princípio de “os leitores não esperam que escritores e escritores não precisem de leitores” é completamente e verdadeiramente seguido. Para isso, é de extrema importância que os dados, que atualmente estão passando por qualquer tipo de alteração, não estejam disponíveis para ninguém, exceto a pessoa que está fazendo essas alterações. Para transações, isso é necessário para manter a integridade dos dados. Três coisas podem ocorrer que podem atrapalhar essa integridade-leitura suja, leitura difusa e leitura fantasma. Para garantir que não haja nenhum tipo de problema de integridade nessas transações, diferentes níveis de isolamentos estão disponíveis. Estes são:

  • Read Uncommitted
  • Read Committed
  • Repeatable Read
  • Serializable

níveis de Isolamento de Transação

a Partir destes, a Oracle oferece o Read Committed como o nível de isolamento padrão, certificando-se de que não há nenhuma possibilidade de um usuário ver as alterações feitas por outro usuário que ainda não estão comprometidos. Não deve haver qualquer leitura sobre os dados que está marcado como “sujo” e deve haver um mecanismo robusto o suficiente para tornar tudo isso possível.

para tornar isso possível, o SCN desempenha um papel vital.

SCN, uma introdução

o número de confirmação do sistema pode ser entendido como a representação do Tempo da Oracle. A Oracle usa SCN para controlar a consistência, para executar a recuperação e para ordenar os vetores de mudança no refazer.

o SCN é encontrado em muitos locais – tanto na memória quanto no disco. Diferentes locais são usados para ajudar o sistema de banco de dados a identificar vários estados do banco de dados. Por exemplo, em alguns locais, ele é usado para denotar o status de conclusão da transação e se está ativo ou comprometido.

ao contrário da crença popular, ela não é gerada apenas no momento do commit, embora seja isso que o próprio nome sugere. SCN está lá o tempo todo no banco de dados, representando uma parte do tempo para a operação que está acontecendo naquele instante de tempo. Não é completamente impreciso dizer que o SCN não é gerado com um commit, mas essa não é a única maneira de o SCN ser gerado.

o SCN é um número de duas partes que é gerado a pedido, em resposta a um evento. É um pouco como a data e a hora derivadas de uma combinação de calendário e relógio; O relógio muda rapidamente e somente quando passou pelo ciclo completo de 24 horas é o estouro – o calendário – alterado. No entanto, o evento que muda o relógio é o ‘pêndulo’ e é regular, enquanto o evento que muda o SCN é uma chamada para uma função interna específica.

semelhante a um calendário/relógio timestamp, o valor pode ser gravado em uma variedade de lugares diferentes, cada um para um uso diferente.

um exemplo do mundo real semelhante a um SCN é um relógio de aeroporto. Duas pessoas entram em um aeroporto ao mesmo tempo e podem observar a hora do relógio. Esse momento nos dá “um SCN de entrada” que é o mesmo para ambas as pessoas. Uma pessoa recebe um carrinho para bagagem antes do check-in, enquanto a outra prossegue diretamente para o balcão de check-in. Quando os assentos são atribuídos, cada pessoa pode obter um ‘check-in SCN’ diferente, uma vez que os tempos são ligeiramente diferentes. Um’ SCN de embarque ‘ pode ser atribuído para indicar quando cada um embarcou, mas ambos recebem o mesmo ‘SCN de decolagem’.

como a combinação de calendário e relógio, o SCN está garantido para estar aumentando sob operação normal. Não há garantia de que o número será sequencial (números ausentes).

então, onde estão essas informações sobre SCN usadas no banco de Dados Oracle? Bem, quase em todos os lugares. Assim como associamos o tempo a todas as nossas atividades, O SCN também está associado a todas as partes da funcionalidade do banco de dados. Por exemplo, quando você tenta selecionar dados de uma tabela, o SCN é usado para confirmar se esses dados são consistentes ou não. SCN também é encontrado nos cabeçalhos de transação do bloco de dados. Este SCN representaria o momento em que a transação foi iniciada e quando foi confirmada. Da mesma forma, para cada alteração realizada, uma entrada no log de refazer é mantida e, para cada uma dessas entradas, o SCN é usado para representar o tempo de ocorrência da transação.

a consistência de leitura usa SCN para decidir quanto tempo ele deve aplicar desfazer sobre o buffer sujo para que a solicitação de dados consistentes de leitura para uma sessão possa ser concluída. E como é sabido, SCN é incrementado com cada operação de commit.

SCN formato e estrutura

SCN é um grande número com dois componentes para ele: SCN base & SCB Wrap.

SCN é um número de 6 bytes (48 bits). Desses 48 bits, SCN_WRAP é um número de 16 bits (2 Bytes) e SCN_BASE é um número de 32 bits (4 Bytes). Ambos os WRAP de base & são usados para controlar o incremento do SCN e para garantir que o banco de dados não fique sem ele. SCN_WRAP é incrementado por 1 quando SCN_BASE atinge o valor de 4 bilhões e SCN_BASE se torna 0.

da Oracle versão 12c, o número SCN é um número de 8 bytes.

então, como vemos o valor SCN atual? A maneira mais fácil é consultar o banco de dados view V$. Ver:

1
2
3
4
5

SQL> selecione current_scn V$database;
CURRENT_SCN
———–
1123790

Como podemos ver, que SCN é exibido como um número. Isso é bom porque torna o uso do SCN fácil para nós em nossas declarações realizando recuperação, flashback, etc. Se quisermos, podemos converter SCN em um valor Hexadecimal também:

1
2
3
4
5

SQL> select to_char(‘1123790′,’xxxxxxxx’) scn_hex da dupla;
SCN_HEX
———
1125ce

Aqui está um exemplo da saída do mesmo modo de exibição acessado par de vezes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

SQL> selecione current_scn V$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886

Curiosamente, este aumento no SCN valor mostra um aspecto importante do SCN. Podemos ver que a cada execução, há um aumento na contagem do SCN. Ao consultar o banco de dados view V$, estamos realmente causando o salto no número SCN.

SMON_SCN_TIME Table

a maneira mais fácil de ver esses dois valores é de uma tabela interna de propriedade do Usuário SYS – SMON_SCN_TIME. O seguinte é uma saída do mesmo (11204).

1
2
3
4
5
6

SQL> selecione SCN_wrp, SCN_bas, SCN de smon_SCN_time where rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406

Esta tabela contém as entradas do SCNs gerado. Ele armazena os dados em incrementos de aproximadamente 5 minutos e contém 5 dias de dados. Isso significa que a tabela contém aproximadamente 1440 registros. O número exato de registros varia ligeiramente, pois o incremento de armazenamento não é exatamente 5 minutos.

1
2
3
4
5

SQL> select count(*) from SMON_SCN_TIME;
CONTAGEM(*)
———-
1494

Em versões do Oracle antes de 10g, o tempo de mapeamento de SCN, com o tempo, foi +/- 5 minutos, mas a partir de 10g em diante, este é alterado para +/- 3 segundos. Como isso é armazenado em uma tabela interna, o Oracle não permite o acesso diretamente às informações dessa tabela. Para acessá-lo, APIs são fornecidas. Uma dessas APIs é do pacote DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, que pode ser usado para acessar o número de sequência desta tabela. Um exemplo disso é dado abaixo (graças a Tom Kyte para a consulta):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

SQL> l
selecione SCN_to_timestamp (SCN) ts, min(SCN), max (SCN)
a partir de (
selecione dbms_flashback.get_system_change_number()-nível SCN
dupla
conectar-se ao nível de <= 100
)
grupo SCN_to_timestamp(SCN)
* por ordem SCN_to_timestamp(SCN)
SQL> /
TS MIN(SCN) MAX(SCN)
————————————————————————— ———- ———-
06-PODE-16 05.22.04.000000000 PM 1245323 1245323
06-PODE-16 05.22.07.000000000 PM 1245324 1245324
06-PODE-16 05.22.10.000000000 PM 1245325 1245325
06-PODE-16 05.22.13.000000000 PM 1245326 1245326
06-PODE-16 05.22.16.000000000 PM 1245327 1245327
06-PODE-16 05.22.19.000000000 PM 1245328 1245328
06-PODE-16 05.22.22.000000000 PM 1245329 1245329
06-PODE-16 05.22.25.000000000 PM 1245330 1245330
06-PODE-16 05.22.28.000000000 PM 1245331 1245331
06-PODE-16 05.22.31.000000000 PM 1245332 1245332
06-PODE-16 05.22.34.000000000 PM 1245333 1245333
06-PODE-16 05.22.37.000000000 PM 1245334 1245334
06-PODE-16 05.22.40.000000000 PM 1245335 1245335
06-PODE-16 05.22.43.000000000 PM 1245336 1245336
06-PODE-16 05.22.46.000000000 PM 1245337 1245337
06-PODE-16 05.22.49.000000000 PM 1245338 1245338
06-PODE-16 05.22.52.000000000 PM 1245339 1245339

Como podemos mapa SCN com Carimbo de data / hora em versões anteriores ao 10g?

é importante lembrar que esta tabela não mostra por que haveria qualquer aumento na taxa de aumento nos números SCN. Com um pouco de formatação, é possível ter uma ideia dos números SCN gerados, mas a fonte de seu crescimento não será evidente nesta tabela.

outra maneira de verificar isso é da visualização V$LOG_HISTORY. A exibição contém o SCN na forma das colunas FIRST_CHANGE # e NEXT_CHANGE# e podemos ver através dessas duas colunas a quantidade de SCNs gerados no banco de dados durante um período de tempo. O ” first_change# é o SCN mais baixo que aparece no arquivo de log arquivado em um determinado número de sequência deste thread. O “next_change#” é o SCN mais baixo que aparece no próximo arquivo de log arquivado.

1
2
3
4
5
6
7
8
9
10
11
12

SQL> selecione o thread#, first_change#,next_change# V$log_history;
THREAD# FIRST_CHANGE# NEXT_CHANGE#
———- ————- ————
1 925702 958823
1 958823 959634
1 959634 972579
1 972579 993714
1 993714 1020785
1 1020785 1023738
1 1023738 1023873
1 1023873 1023995

Como com SMON_SCN_TABLE não é possível localizar a origem do aumento na geração de SCN números a partir deste modo de exibição de tabela. Ainda assim, você pode usar essa visualização na instância única, bem como em um ambiente RAC.

SCN aumenta usando uma sequência?

até agora, deve ser bastante evidente que o SCN parece ser um número que está aumentando constantemente. Curiosamente, embora seja um número, o Oracle não usa nenhuma sequência para aumentá-lo, mas usa funções internas. Por exemplo, para aumentar o SCN_BASE, a função usada internamente é KCMGAS(Get E Advance SCN). Esta função é chamada cada vez que um novo SCN é solicitado e a chamada para esta função é aumentada. Da mesma forma que esta função, KCMGCS (Get SCN atual) é usado para obter o SCN atual e a chamada usada para ele. Essas chamadas de função podem ser vistas na visualização V $ sysstat. Uma descrição dessas estatísticas pode ser encontrada no Guia de referência 12.1.

vamos ver como essas chamadas se ligam à geração SCN. Estamos usando duas sessões aqui-uma para ver as chamadas na visualização V $ SYSSTAT e a outra sessão para puxar o SCN.

1
2
3
4
5
6
7
8
9
10

Sessão -1
SQL> l
1* selecione current_SCN V$database
SQL> /
CURRENT_SCN
———–
698815
SQL>

Para este SCN, estes foram os valores de V$sysstat:

1
2
3
4
5
6
7
8
9
10
11
12
13

SQL> l
1 seleccione o nome,o valor de V$sysstat
2* where nome like ‘%chama a%’
SQL> /
NOME do VALOR
—————————————————————- ———-
chamadas para kcmgcs 427
chamadas para kcmgrs 0
chamadas para kcmgas 7272
chamadas para obter instantâneo SCN: kcmgss 159790
SQL>

Vamos emitir uma consulta para ver o atual SCN em sessão 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

SQL> l
1* select current_SCN from V$database
SQL> /
CURRENT_SCN
———–
698815
SQL> /
CURRENT_SCN
———–
698889
SQL>

And aqui está o resultado da segunda sessão 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SQL> /
NOME DO VALOR
—————————————————————- ———-
chamadas para kcmgcs 427
chamadas para kcmgrs 0
chamadas para kcmgas 7272
chamadas para obter instantâneo SCN: kcmgss 159790
SQL> /
NOME do VALOR
—————————————————————- ———-
chamadas para kcmgcs 427
chamadas para kcmgrs 0
chamadas para kcmgas 7278
chamadas para obter instantâneo SCN: kcmgss 159905
SQL>

podemos ver que as chamadas para o KCMGAS aumentou para 7278 a partir do último valor, 7272. Como o Oracle não usa uma sequência para aumentar o número, não há garantia de que o número SCN sempre será aumentado na mesma ordem.

conclusão

neste artigo, analisamos o que é o SCN, como visualizá-lo e quais são os requisitos para ele. No próximo artigo, veremos quais tipos diferentes de SCNs estão disponíveis e como eles são usados no banco de dados. Fique atento!

Write a Comment

O seu endereço de email não será publicado.