Para muchas personas que trabajan con Oracle database, el SCN (Número de cambio de sistema) es un tema que les interesa mucho, pero a pesar de que es un tema fascinante, también es confuso. En este artículo aprenderemos lo esencial de SCN: qué es, dónde se usa y cómo funciona.
Vale la pena mencionar que esto no es ni puede ser una cobertura completa de cada detalle sobre SCN. Dicho esto, empecemos.
- SCN – ¿Por qué lo necesitamos?
- Bloques de construcción para comprender SCN
- Transacción
- Niveles de Aislamiento de transacciones
- SCN, una Introducción
- Formato y estructura SCN
- Tabla SMON_SCN_TIME
- ¿Cómo podemos mapa SCN con marca de tiempo en las versiones anteriores a la 10g?
- SCN Aumenta Usando una Secuencia?
- Conclusión
SCN – ¿Por qué lo necesitamos?
Supongamos que es el final del mes y su día de pago. Usted está en el grupo de Nómina y, con la autoridad apropiada, ha emitido una consulta para extraer el cálculo actual del salario de todos los empleados. Los números fluyen por la pantalla, todo va genial.
Supongamos que, mientras observa la salida, un colega inicia una nueva ejecución de pago y ese trabajo por lotes borra el resumen del cálculo actual. Las cosas ciertamente se volverían confusas si su salida mostrara repentinamente ‘0’ para las nuevas filas que salen.
De hecho, para este escenario, probablemente esperaría que la salida reflejara el ‘estado de la base de datos’, el contenido de cada fila, de la forma en que existía en el momento en que emitió su consulta.
Una de las garantías de la base de datos Oracle es que «no hay lecturas sucias de datos de usuario». Si es necesario, Oracle reconstruirá cada fila al estado estable en el momento en que se emitió la consulta.
Oracle lo hace muy bien y con mucha precisión a través de un «temporizador» propio, conocido como el Número de Cambio de sistema, también conocido como SCN.
Discutiremos estos aspectos del SCN:
- El número en sí
- El generador de números
- Lugares donde se almacena el número
¡Así que comencemos!
Bloques de construcción para comprender SCN
Para investigar SCN, se deben comprender varios términos. Aunque estas definiciones están bien documentadas, vale la pena repetirlas aquí:
Transacción
De la guía de conceptos de Documentación en línea de Oracle:
«Una transacción es una unidad de trabajo lógica y atómica que contiene una o más sentencias SQL. Una transacción grupos de instrucciones SQL para que sean comprometidas, lo que significa que se aplican a la base de datos, o todo se revierte, lo que significa que se deshacen de la base de datos. Oracle Database asigna a cada transacción un identificador único llamado ID de transacción».
Más simplemente: cuando iniciamos una transacción iniciamos un conjunto de cambios. Estos deben completarse en su totalidad o no deben completarse en absoluto. A medida que las transacciones se producen en la base de datos, los usuarios que leen cualquier área que haya cambiado no deben verse afectados por ningún efecto secundario que pueda alterar sus resultados.
Para que las transacciones funcionen correctamente en cualquier base de datos, la base de datos debe seguir cuatro reglas ACID. Estos son:
- la Atomicidad;
- Consistencia;
- Aislamiento;
- Durabilidad.
Entonces, ¿dónde encaja el SCN en todo esto? Y la respuesta a esa pregunta es que el uso exclusivo de SCN Oracle mantiene la coherencia de los datos. Esto se hace para garantizar que en cualquier momento, no haya discrepancias en los resultados que se muestran a los demás cuando un usuario está cambiando algo, y viceversa.
Para resumir, en Oracle, el principio de «Los lectores no esperan a los escritores y los escritores no necesitan lectores» se sigue completa y verdaderamente. Para ello, es de suma importancia que los datos, que actualmente están experimentando cualquier tipo de cambio, no estén disponibles para nadie, excepto para la persona que está realizando esos cambios. Para las transacciones, esto es necesario para mantener la integridad de los datos. Pueden ocurrir tres cosas que pueden alterar esta integridad: Lectura Sucia, Lectura Borrosa y Lectura Fantasma. Para garantizar que no haya ningún tipo de problema de integridad en estas transacciones, hay diferentes niveles de aislamiento disponibles. Estos son:
- Lectura no comprometida
- Lectura confirmada
- Lectura repetible
- Serializable
Niveles de Aislamiento de transacciones
De estos, Oracle ofrece Lectura confirmada como el nivel de aislamiento predeterminado, asegurándose de que no haya posibilidad de que un usuario vea los cambios realizados por otro usuario que aún no se hayan confirmado. No debe haber ninguna lectura de esos datos que esté marcada como» sucia » y debe haber un mecanismo lo suficientemente robusto como para hacer todo esto posible.
Para hacer esto posible, SCN juega un papel vital.
SCN, una Introducción
El número de confirmación del sistema puede entenderse como la representación del tiempo de Oracle. Oracle utiliza SCN para controlar la consistencia, realizar la recuperación y ordenar los vectores de cambio en el rehacer.
El SCN se encuentra en muchas ubicaciones, tanto en la memoria como en el disco. Se utilizan diferentes ubicaciones para ayudar al sistema de base de datos a identificar varios estados de la base de datos. Por ejemplo, en algunas ubicaciones se usa para indicar el estado de finalización de la transacción y si está activa o confirmada.
Contrariamente a la creencia popular, no se genera solo en el momento de la confirmación, aunque eso es lo que sugiere el propio nombre. SCN está allí todo el tiempo en la base de datos, representando una porción de tiempo para la operación que está sucediendo en ese instante de tiempo. No es completamente inexacto decir que SCN no se genera con un commit, lo hace, pero esa no es la única forma en que se genera SCN.
El SCN es un número de dos partes que se genera a petición, en respuesta a un evento. Es algo así como la fecha y la hora derivada de una combinación de calendario y reloj; el reloj cambia rápidamente y solo cuando ha pasado por el ciclo completo de 24 horas, el desbordamiento, el calendario, cambia. Sin embargo, el evento que cambia el reloj es el ‘péndulo’ y es regular, mientras que el evento que cambia el SCN es una llamada a una función interna específica.
Similar a una marca de tiempo de calendario/reloj, el valor se puede registrar en una variedad de lugares diferentes, cada uno para un uso diferente.
Un ejemplo del mundo real similar a un SCN es un reloj de aeropuerto. Dos personas entran a un aeropuerto al mismo tiempo y pueden anotar la hora del reloj. Ese momento nos da ‘un SCN de entrada’ que resulta ser el mismo para ambas personas. Una persona recibe un carrito para el equipaje antes de facturar, mientras que la otra se dirige directamente al mostrador de facturación. Cuando se asignan los asientos, cada persona puede obtener un «registro de entrada» diferente, ya que los horarios son ligeramente diferentes. Podrá asignarse un «SCN de embarque» para indicar cuándo ha embarcado cada uno, pero ambos reciben el mismo «SCN de despegue».
Al igual que la combinación de calendario y reloj, el SCN está garantizado para aumentar en funcionamiento normal. No hay garantía de que el número sea secuencial (faltan números).
Entonces, ¿dónde se usa esta información sobre SCN en la base de datos de Oracle? Bueno, casi en todas partes. Al igual que asociamos el tiempo con cada actividad nuestra, SCN también está asociado con cada parte de la funcionalidad de la base de datos. Por ejemplo, cuando intenta seleccionar datos de una tabla, se usa SCN para confirmar si esos datos son coherentes o no. SCN también se encuentra en los encabezados de transacción del bloque de datos. Este SCN representaría el momento en que se inició la transacción y cuando se cometió. De manera similar, para cada cambio realizado, se mantiene una entrada en el registro de rehacer y para cada una de estas entradas, se usa SCN para representar el momento de la ocurrencia de la transacción.
Consistencia de lectura utiliza SCN para decidir cuánto tiempo tiene que aplicar Deshacer sobre el búfer sucio para que se pueda completar la solicitud de datos consistentes de lectura para una sesión. Y como es bien sabido, SCN se incrementa con cada operación de confirmación.
Formato y estructura SCN
SCN es un número enorme con dos componentes: SCN Base & Envoltura SCB.
SCN es un número de 6 bytes (48 bits). De estos 48 bits, SCN_WRAP es un número de 16 bits (2 Bytes) y SCN_BASE es un número de 32 bits (4 Bytes). Ambos WRAP de BASE & se utilizan para controlar el incremento del SCN y para garantizar que la base de datos no se quede sin ella. SCN_WRAP se incrementa en 1 cuando SCN_BASE alcanza el valor de 4 mil millones y SCN_BASE se convierte en 0.
A partir de la versión 12c de Oracle, el número SCN es un número de 8 bytes.
Entonces, ¿cómo vemos el valor actual de SCN? La forma más sencilla es consultar la BASE de DATOS view V$. Echa un vistazo:
1
2
3
4
5
|
SQL> seleccione current_scn de V$database;
CURRENT_SCN
———–
1123790
|
Como podemos ver, que el SCN se muestra como un número. Esto es bueno porque hace que el uso de SCN sea fácil para nosotros en nuestras declaraciones de recuperación, flashback, etc. Si queremos, también podemos convertir SCN a un valor hexadecimal:
1
2
3
4
5
|
SQL> select to_char(‘1123790′,’xxxxxxxx’) scn_hex from dual;
SCN_HEX
———
1125ce
|
Aquí es un ejemplo de la salida desde el mismo punto de vista de acceso par de veces:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> seleccione current_scn de V$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886
|
Curiosamente, este aumento en el SCN valor muestra un aspecto importante de la SCN. Podemos ver que con cada ejecución, hay un aumento en el conteo del SCN. Al consultar la BASE DE DATOS view V actually, en realidad estamos causando el salto en el número SCN.
Tabla SMON_SCN_TIME
La forma más fácil de ver ambos valores es desde una tabla interna propiedad del usuario de SYS – SMON_SCN_TIME. La siguiente es una salida del mismo (11204).
1
2
3
4
5
6
|
SQL> seleccione SCN_wrp, SCN_bas, el SCN de smon_SCN_time donde rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
Esta tabla contiene las entradas de la Scn generado. Almacena los datos en incrementos de aproximadamente 5 minutos y contiene datos de 5 días. Esto significa que la tabla contiene aproximadamente 1440 registros. El número exacto de registros variará ligeramente, ya que el incremento de almacenamiento no es exactamente de 5 minutos.
1
2
3
4
5
|
SQL> seleccione count(*) de SMON_SCN_TIME;
COUNT(*)
———-
1494
|
En versiones de Oracle anteriores a 10g, el mapeo de tiempo de SCN con el tiempo era de +/- 5 minutos, pero a partir de 10g, esto se cambia a +/- 3 segundos. Como se almacena en una tabla interna, Oracle no permite el acceso a la información de esta tabla directamente. Para acceder a ella, se proporcionan API. Una de estas API es del paquete DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, que se puede usar para acceder al número de secuencia desde esta tabla. Un ejemplo de esto se da a continuación (gracias a Tom Kyte por la 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
seleccione SCN_to_timestamp (SCN) ts, min(SCN), max (SCN)
de (
seleccione dbms_flashback.get_system_change_number()-nivel SCN
de doble
conectar por nivel <= 100
)
grupo por SCN_to_timestamp(SCN)
* orden por SCN_to_timestamp(SCN)
SQL> /
TS MIN(SCN) MAX(SCN)
————————————————————————— ———- ———-
06-MAYO-16 05.22.04.000000000 PM 1245323 1245323
06-MAYO-16 05.22.07.000000000 PM 1245324 1245324
06-MAYO-16 05.22.10.000000000 PM 1245325 1245325
06-MAYO-16 05.22.13.000000000 PM 1245326 1245326
06-MAYO-16 05.22.16.000000000 PM 1245327 1245327
06-MAYO-16 05.22.19.000000000 PM 1245328 1245328
06-MAYO-16 05.22.22.000000000 PM 1245329 1245329
06-MAYO-16 05.22.25.000000000 PM 1245330 1245330
06-MAYO-16 05.22.28.000000000 PM 1245331 1245331
06-MAYO-16 05.22.31.000000000 PM 1245332 1245332
06-MAYO-16 05.22.34.000000000 PM 1245333 1245333
06-MAYO-16 05.22.37.000000000 PM 1245334 1245334
06-MAYO-16 05.22.40.000000000 PM 1245335 1245335
06-MAYO-16 05.22.43.000000000 PM 1245336 1245336
06-MAYO-16 05.22.46.000000000 PM 1245337 1245337
06-MAYO-16 05.22.49.000000000 PM 1245338 1245338
06-MAYO-16 05.22.52.000000000 PM 1245339 1245339
|
¿Cómo podemos mapa SCN con marca de tiempo en las versiones anteriores a la 10g?
Es importante recordar que esta tabla no muestra por qué habría un aumento en la tasa de aumento en los números de SCN. Con un poco de formato, es posible tener una idea de los números de SCN generados, pero la fuente de su crecimiento no será evidente en esta tabla.
Otra forma de comprobar esto es desde la vista V LOG LOG_HISTORY. La vista contiene el SCN en forma de las columnas FIRST_CHANGE# y NEXT_CHANGE# y podemos ver a través de estas dos columnas la cantidad de SCN generados en la base de datos durante un período de tiempo. El » first_change# es el SCN más bajo que aparece en el archivo de registro archivado en un número de secuencia dado de este hilo. El «next_change#» es el SCN más bajo que aparece en el siguiente archivo de registro archivado.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL> seleccione el subproceso#, first_change#,next_change# de V$log_history;
HILO# 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 con SMON_SCN_TABLE no es posible encontrar el origen del incremento en la generación de la SCN números de esta tabla de la vista. Aún así, puede usar esta vista en una sola instancia, así como en un entorno RAC.
SCN Aumenta Usando una Secuencia?
Por ahora debería ser bastante evidente que SCN parece ser un número que está en constante aumento. Curiosamente, a pesar de que es un número, Oracle no usa ninguna secuencia para aumentarlo, sino que usa funciones internas en su lugar. Por ejemplo, para aumentar la SCN_BASE, la función utilizada internamente es KCMGAS (Get and Advance SCN). Esta función se llama cada vez que se solicita un nuevo SCN y se aumenta la llamada para esta función. De manera similar a esta función, KCMGCS (Get Current SCN) se usa para obtener el SCN actual y la llamada utilizada para él. Estas llamadas a funciones se pueden ver desde la vista V sy sysstat. Se puede encontrar una descripción de estas estadísticas en la Guía de referencia 12.1.
Veamos cómo se vinculan estas llamadas con la generación SCN. Estamos usando dos sesiones aquí, una para ver las llamadas en la vista view V SY SYSSTAT, y la otra sesión para extraer el SCN.
1
2
3
4
5
6
7
8
9
10
|
Sesión -1
SQL> l
1* seleccione current_SCN de V$database
SQL> /
CURRENT_SCN
———–
698815
SQL>
|
Para este SCN, estos fueron los valores de V$sysstat:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> l
1 seleccione nombre,el valor de V$sysstat
2* where name like ‘%llamadas a%’
SQL> /
NOMBRE de VALOR
—————————————————————- ———-
las llamadas a kcmgcs 427
llamadas a kcmgrs 0
llamadas a kcmgas 7272
llamadas para obtener instantáneas SCN: kcmgss 159790
SQL>
|
Vamos a emitir una consulta para ver el SCN actual en la sesión 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 aquí está el resultado de la segunda sesión 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> /
NOMBRE DE VALOR
—————————————————————- ———-
las llamadas a kcmgcs 427
llamadas a kcmgrs 0
llamadas a kcmgas 7272
llamadas para obtener instantáneas SCN: kcmgss 159790
SQL> /
NOMBRE de VALOR
—————————————————————- ———-
las llamadas a kcmgcs 427
llamadas a kcmgrs 0
llamadas a kcmgas 7278
llamadas para obtener instantáneas SCN: kcmgss 159905
SQL>
|
podemos ver que las llamadas a la KCMGAS ha aumentado a 7278 desde el último valor, 7272. Como Oracle no usa una secuencia para aumentar el número, no hay garantía de que el número SCN siempre se incremente en el mismo orden.
Conclusión
En este artículo, hemos echado un vistazo a lo que es el SCN, cómo verlo y cuáles son los requisitos para ello. En el siguiente artículo, veremos qué tipos diferentes de SCN están disponibles y cómo se utilizan en la base de datos. ¡Estén atentos!