ver una transaction transacciones tablas registro read log leer datos como auditoría archivo actividades sql database logging transactions voltdb

sql - una - registro de transacciones oracle



¿Por qué las bases de datos SQL usan un registro de escritura anticipada sobre un registro de comando? (5)

Leí sobre el registro de comando de Voltdb. El registro de comando registra las invocaciones de transacción en lugar de cada cambio de fila como en un registro de escritura anticipada. Al registrar solo la invocación, los registros de comando se mantienen al mínimo, lo que limita el impacto que la E / S del disco tendrá en el rendimiento.

¿Alguien puede explicar la teoría de la base de datos detrás de por qué Voltdb usa un registro de comando y por qué las bases de datos SQL estándar como Postgres, MySQL, SQLServer, Oracle usan un registro de escritura anticipada?


Con WAL, los lectores leen de páginas de registros no eliminados. No se realiza ninguna modificación en el DB principal. Con el registro de comandos, no tiene la capacidad de leer desde el registro de comandos.

El registro de comandos es, por lo tanto, muy diferente. VoltDB utiliza el registro de comandos para crear puntos de recuperación y garantizar la durabilidad, seguro, pero está escribiendo en la tienda principal de db (RAM) en tiempo real, con todos los problemas de bloqueo de asistentes, etc.


Creo que es mejor reformular:

¿Por qué el nuevo VoltDB distribuido usa un registro de comando sobre el registro de escritura anticipada?

Hagamos un experimento e imaginemos que va a escribir su propia implementación de almacenamiento / base de datos. Sin dudas, estás lo suficientemente avanzado como para abstraer un sistema de archivos y usar el almacenamiento de bloques junto con algunas optimizaciones adicionales.

Algunos términos básicos:

  • Estado: información almacenada en un punto de tiempo determinado
  • Comando: directiva al almacenamiento para cambiar su estado

Por lo tanto, su base de datos puede ser similar a la siguiente:

El siguiente paso es ejecutar algún comando:

Tenga en cuenta varios aspectos importantes:

  1. Un comando puede afectar a muchas entidades almacenadas, por lo que muchos bloques se ensuciarán
  2. El siguiente estado es una función del estado actual y el comando

Se pueden omitir algunos estados intermedios, porque es suficiente tener una cadena de comandos en su lugar.

Finalmente, debe garantizar la integridad de los datos.

  • Write-Ahead Logging : el concepto central es que los cambios de estado deben registrarse antes de cualquier actualización importante para el almacenamiento permanente. Siguiendo nuestra idea, podemos registrar cambios incrementales para cada bloque.
  • Registro de comandos : el concepto central es registrar solo el comando , que se usa para generar el estado.

Hay ventajas y desventajas para ambos enfoques. El registro de escritura anticipada contiene todos los datos modificados, el registro de comandos requerirá un procesamiento adicional, pero rápido y ligero.

VoltDB: Registro de comandos y recuperación

La clave para el registro de comandos es que registra las invocaciones, no las consecuencias, de las transacciones. Al registrar solo la invocación, los registros de comando se mantienen al mínimo, lo que limita el impacto que la E / S del disco tendrá en el rendimiento.

Notas adicionales

SQLite: registro de escritura anticipada

El diario de reversión tradicional funciona al escribir una copia del contenido original de la base de datos sin modificar en un archivo de diario de reversión independiente y luego escribir los cambios directamente en el archivo de la base de datos.

Se produce un COMPROMISO cuando se agrega un registro especial que indica una confirmación al WAL. Por lo tanto, un COMMIT puede ocurrir sin escribir en la base de datos original, lo que permite a los lectores continuar operando desde la base de datos original sin modificar, mientras que los cambios se están comprometiendo simultáneamente en el WAL.

PostgreSQL: registro de escritura anticipada (WAL)

El uso de WAL da como resultado un número significativamente menor de grabaciones en el disco, ya que solo el archivo de registro debe enjuagarse en el disco para garantizar que se compromete una transacción, en lugar de que cada archivo de datos modificado por la transacción.

El archivo de registro se escribe secuencialmente, por lo que el costo de sincronizar el registro es mucho menor que el costo de vaciar las páginas de datos. Esto es especialmente cierto para los servidores que manejan muchas transacciones pequeñas que tocan diferentes partes del almacén de datos. Además, cuando el servidor está procesando muchas pequeñas transacciones concurrentes, una fsync del archivo de registro puede ser suficiente para comprometer muchas transacciones.

Conclusión

Registro de comandos:

  1. es más rápido
  2. tiene una huella más baja
  3. tiene un procedimiento de "Reproducción" más pesado
  4. requiere una captura frecuente

Write Ahead Logging es una técnica para proporcionar atomicidad. Un mejor rendimiento del registro de comandos también debería mejorar el procesamiento de las transacciones. Bases de datos en 1 pie

Confirmación

Blog de VoltDB: introducción al registro de comandos de VoltDB

Una ventaja del registro de comandos sobre el registro de estilo ARIES es que una transacción puede registrarse antes de que comience la ejecución en lugar de ejecutar la transacción y esperar a que los datos de registro se descarguen en el disco. Otra ventaja es que el rendimiento de E / S necesario para un registro de comando está limitado por la red utilizada para transmitir comandos y, en el caso de Gig-E, este rendimiento puede ser satisfecho por discos básicos baratos.

Es importante recordar que VoltDB se distribuye por su naturaleza. Por lo tanto, las transacciones son un poco difíciles de manejar y el impacto en el rendimiento es notable.

VoltDB Blog: la nueva función de registro de comandos de VoltDB

El registro de comando en VoltDB consiste en invocaciones de procedimientos almacenados y sus parámetros. Se crea un registro en cada nodo y cada registro se replica porque todo el trabajo se replica en varios nodos. Esto da como resultado un registro de comando replicado que se puede deducir en el tiempo de reproducción. Debido a que las transacciones de VoltDB están fuertemente ordenadas, el registro de comandos también contiene información de pedido. Por lo tanto, la reproducción puede ocurrir en el orden exacto en que se ejecutaron las transacciones originales, con el aislamiento total de transacciones que ofrece VoltDB. Como las invocaciones en sí son a menudo más pequeñas que los datos modificados, y pueden registrarse antes de que se comprometan, este enfoque tiene un efecto muy modesto en el rendimiento. Esto significa que los usuarios de VoltDB pueden alcanzar el mismo tipo de números de rendimiento estratosférico, con garantías adicionales de durabilidad.


De la descripción de Postgres ''escriba con anticipación http://www.postgresql.org/docs/9.1/static/wal-intro.html y el registro de comando de VoltDB (al que hizo referencia), no puedo ver mucha diferencia en absoluto. Parece ser el concepto idéntico con un nombre diferente.

Ambos sincronizan solo el archivo de registro con el disco pero no los datos para que los datos puedan recuperarse al reproducir el archivo de registro.

La Sección 10.4 de VoltDB explica que su versión de comunidad no tiene un registro de comandos para que no pase la prueba de ACID. Incluso en la edición empresarial, no veo los detalles de su aislamiento de transacción (por ejemplo, http://www.postgresql.org/docs/9.1/static/transaction-iso.html ) necesarios para hacerme sentir cómodo de que VoltDB es tan serio como Postges.


Es solo una cuestión de granularidad. Registran operaciones en el nivel de procedimientos almacenados, la mayoría de los registros RDBMS a nivel de declaraciones individuales (y ''más bajo''). También su propaganda con respecto a las ventajas es un poco de una pista falsa:

Una ventaja del registro de comandos sobre el registro de estilo ARIES es que una transacción puede registrarse antes de que comience la ejecución en lugar de ejecutar la transacción y esperar a que los datos de registro se descarguen en el disco.

Deben esperar a que el comando también se registre, es solo un registro mucho más pequeño.

Si no me equivoco, la unidad de transacción de VoltDB es un proceso almacenado. Los RDBMS tradicionales generalmente necesitan soportar transacciones ad-hoc que contengan cualquier cantidad de declaraciones, por lo que el registro a nivel de procedimiento está fuera de cuestión. Además, los procedimientos almacenados a menudo no son realmente deterministas en los RDBMS tradicionales (es decir, los parámetros dados + log + data siempre producen el mismo resultado), que deberían ser para que esto funcione.

Sin embargo, las mejoras de rendimiento serían sustanciales para este modelo de RDBMS restringido.


La forma en que lo leo es la siguiente: (Mi propia opinión)

El Registro de comandos como se describe aquí registra solo las transacciones a medida que ocurren y no lo que sucede en ellas. Ok, entonces aquí está la pieza mágica ... Si quieres deshacer la restauración, debes restaurar la última instantánea y luego puedes volver a reproducir todas las transacciones que se aplicaron después (descrita en el enlace anterior). De modo que está restaurando una copia de seguridad y volviendo a aplicar todos sus scripts, solo VoltDB ahora lo ha automatizado.

La verdadera diferencia que veo con esto es que no se puede retroceder a un punto en el tiempo lógicamente como con un registro de transacciones normal. Los registros de transacciones normales (MSSQL, MySQL, etc.) pueden retrotraerse fácilmente a un punto en el tiempo (en la configuración correcta) ya que las transacciones pueden "revertirse".

Surge una pregunta interesante: refiriéndose a la pos por pedz, ¿pasará siempre la prueba ACID incluso con el registro de comandos? Haré un poco más de lectura ...

Añadir: Hice más lecturas y no creo que sea una buena idea para bases de datos transaccionales muy grandes y ocupadas. ¿Se crea automáticamente una instantánea de BD cuando los registros de comando se llenan, para guardarlo de los grandes registros de transacciones y el IO utilizado para esto? Vas a incurrir en grandes cantidades de IO con tus instantáneas hechas en un intervalo regular y también estás usando tu memoria al borde. Alos, desde mi punto de vista, pierdes tu habilidad de revertir fácilmente a un punto en el tiempo antes de la última instantánea automática: piensa que esto será muy difícil de manejar.

Preferiría atenerme a los registros de transacciones para sistemas transaccionales. Está probado y funciona.