2012-05-22 13 views
7

He revisado el manual y se mencionó que cada transacción agregará una declaración BEGIN antes de que comience a tomar el volcado. ¿Alguien puede elaborar esto de una manera más comprensible?¿Por qué un mysqldump con transacción única es más consistente que uno sin?

Aquí es lo que leo:

Esta opción emite una declaración SQL BEGIN antes de volcar los datos desde el servidor. Es útil sólo con tablas transaccionales como InnoDB y BDB, porque entonces se vuelca el estado coherente de la base de datos en el momento COMENZAR fue emitida sin bloquear cualquier aplicación."

¿Puede alguna elaborada en esto?

+1

Quizás agregue algunos enlaces o citas de partes específicas del manual con las que necesita ayuda, de lo contrario, estamos averiguando un poco sobre lo que desea saber. – Cylindric

+0

He actualizado la publicación. por favor eche un vistazo a. – Uday

Respuesta

23

Dado que el volcado se realiza en una transacción, se obtiene una vista coherente de todas las tablas de la base de datos. Esto es probablemente mejor explicado por un contraejemplo. Digamos que volcar una base de datos con dos tablas, Orders y OrderLines

  1. iniciar el volcado sin una sola transacción.
  2. Otro proceso inserta una fila en la tabla Orders.
  3. Otro proceso inserta una fila en la tabla OrderLines.
  4. El volcado procesa la tabla OrderLines.
  5. Otro proceso elimina los registros Orders y OrderLines.
  6. El volcado procesa la tabla Orders.

En este ejemplo, su volcado tendría las filas para OrderLines, pero no Orders. Los datos estarían en un estado incoherente y fallarían en la restauración si hubiera una clave externa entre Orders y OrderLines.

Si lo hubiera hecho en una sola transacción, el volcado no tendría el orden ni las líneas (pero sería consistente) ya que ambos se insertaron y luego se eliminaron después de que comenzó la transacción.

+0

Se me ocurrió un mejor/más claro ejemplo que yo, creo. :) – Cylindric

+1

Es realmente una mejor explicación ... gracias Eric .. Tengo una duda. Si mi depósito demora una hora, ¿qué tal la transacción durante esa hora y luego ...? ¿Se almacenan en búferes y se lavan al disco cuando se completa el volcado ...? o cómo sucede ...? – Uday

5

Solía ​​tener problemas donde mysqldump sin el parámetro --single-transaction fallaría consistentemente debido a los datos que se cambian durante el volcado. Por lo que puedo entender, cuando lo ejecuta dentro de una sola transacción, impide cualquier cambio que ocurra durante el volcado cause un problema. Básicamente, cuando emite --single-transaction, está tomando una instantánea de la base de datos en ese momento y volcándola en lugar de volcarla. g datos que podrían estar cambiando mientras la utilidad se está ejecutando.

+0

¿Quiere decir que, durante el volcado, todas las transacciones se realizarán solo en buufers y no se reflejarán o enjuagarán en el disco hasta que finalice el volcado ...? – Uday

+0

Creo que copia una instantánea en la memoria o en tablas temporales y luego las vuelca. –

+1

@Uday No se preocupe demasiado por * cómo * lo hace, porque depende de todo tipo de factores. El concepto sigue siendo el mismo para todo tipo de motores diferentes, ya sea MySQL, MSSQL, Oracle, lo que sea. – Cylindric

5

Esto puede ser importante para las copias de seguridad porque significa que obtiene todos los datos, exactamente como lo hace en un punto en el tiempo.

Así, por ejemplo, imaginemos una base de datos simple blog, y un poco típica de la actividad podría ser

  1. crear un nuevo usuario
  2. crear un nuevo puesto por el usuario
  3. Eliminar un usuario que borra el puesto

Ahora, cuando se copia de seguridad de su base de datos, la copia de seguridad puede copia de seguridad de las tablas en este orden

  1. Mensajes
  2. Usuarios

¿Qué pasa si alguien elimina un usuario, que es requerido por los mensajes, justo después de la copia de seguridad alcanza # 1?

Cuando restaura sus datos, encontrará que tiene una publicación, pero el usuario no existe en la copia de seguridad.

Poner en práctica una transacción significa que la copia de seguridad no ve todas las actualizaciones, inserciones y eliminaciones que ocurren en la base de datos durante la copia de seguridad.

Cuestiones relacionadas