¿Cuáles son las prácticas que sigue para evitar actualizaciones de datos incorrectas en grandes bases de datos?

20

Un consejo típico antes de cualquier implementación de producción es hacer una copia de seguridad de la base de datos primero. De esta manera, si la nueva actualización tiene algún problema que puede conducir a la pérdida potencial de datos o la corrupción de datos lógicos, entonces todavía tiene una copia de seguridad para comparar y corregir registros antiguos.

Sin embargo, esto puede funcionar bien hasta que el tamaño de la base de datos esté en pocos GB. Una vez que el tamaño de la base de datos es enorme, las copias de seguridad tardan mucho tiempo en completarse. ¿Cuáles son algunas de las mejores prácticas que se deben seguir en tales situaciones, para evitar la corrupción de datos lógicos debido a problemas lógicos en una implementación de código?

Pritam Barhate
fuente
11
Las copias de seguridad no son solo para cuando realiza implementaciones. Quiero decir, su pérdida de datos está a solo un accidente de disco, y esos son impredecibles y pueden suceder hoy o mañana. (Las matrices de incursiones no son la respuesta, también se bloquean).
Pieter B
10
Reformularía esta pregunta, el problema no es que las copias de seguridad tarden mucho tiempo, el problema es que en caso de que una actualización tenga una falla desastrosa, puede ser necesaria una restauración , lo que puede bloquear la producción durante mucho tiempo. Entonces, lo que realmente busca es una estrategia para mitigar los riesgos de una falla durante una actualización.
Doc Brown
1
Estoy de acuerdo con @DocBrown aquí. Evitar la corrupción de datos y las copias de seguridad que toman demasiado tiempo son realmente dos preguntas separadas.
Robbie Dee
1
Cuando aceptas rápidamente no obtienes tanta información.
paparazzo
1
¿Qué quiere decir "problemas lógicos en una implementación de código"?
paparazzo el

Respuestas:

25

Como alguien que se ocupó regularmente de actualizar la base de datos de producción para los clientes para nuestras actualizaciones de software, le digo que la mejor manera de minimizar los errores es realizar las actualizaciones de la manera más sencilla posible.

Si puede realizar un cambio en todos los registros en lugar de registros específicos, es preferible.

En otras palabras, si le dan una lista de identificadores de registros que necesitan cambiar su estado, debe preguntarse por qué se realiza la actualización en el contexto del programa. Puede ser que de los 10 registros que necesita actualizar, la tabla solo tenga 10 elementos. Por lo tanto, debe preguntarse si conceptualmente todo lo que está haciendo es actualizar el estado de todos los registros.

Si puede insertar, es preferible.

El acto de agregar un registro es autónomo. Con esto quiero decir que solo hay un efecto secundario de agregar un registro, y es la existencia de un registro que no existía antes. Por lo tanto, a menos que esté agregando un registro que no debería estar allí, no debería haber problemas.

Si puede evitar la eliminación, es preferible.

Si está realizando una eliminación, está eliminando datos que de otro modo serían irrecuperables sin una copia de seguridad. Si es posible, intente organizar los datos de tal manera que pueda deshabilitar los registros cambiando su estado en lugar de eliminarlos físicamente. El exceso de datos se puede colocar en una partición o se puede eliminar por completo en un momento posterior una vez que esté seguro de que no hay problemas.

Tener una política de actualización consistente.

Si necesita actualizar un registro, puede suceder una de varias cosas:

  1. Tu registro no existe.
  2. Su registro existe pero ya ha sido cambiado.
  3. Su registro existe y requiere el cambio.

Debe tener una política para determinar el curso de acción en caso de que algo no salga según lo planeado. En aras de la simplicidad, debe ser coherente en todos los ámbitos y aplicar esta política en cualquier situación de este tipo, no solo para tablas específicas. Esto facilita la recuperación de datos más tarde. En general, mi política es escribir el script de tal manera que pueda volver a ejecutarlo más tarde. Si el script falla, es bueno saber que puede hacer los ajustes adecuados y volver a ejecutarlo, sin embargo, es libre de elegir la política que más le convenga.

Copias de seguridad

¡Esto de ninguna manera lo excusa de realizar una copia de seguridad antes de realizar cualquier actualización en un entorno de producción! Aunque incluso con una copia de seguridad, considero que no es necesario utilizar la copia de seguridad. La pérdida de datos no puede ser una posibilidad incluso en el peor de los casos .

Conclusión

No siempre podrás hacerlo a tu manera. Es probable que usted no determine el esquema de la tabla y, como tal, significa que los tipos de actualizaciones que puede realizar serán complicados y riesgosos. Aunque si tiene algo que decir al respecto, es útil tener en cuenta estos puntos, ya que hacen que las actualizaciones sean sencillas y sin un riesgo significativo.

¡Buena suerte!

Neil
fuente
Estoy de acuerdo con todo lo que dijiste, pero tenía curiosidad sobre tus pensamientos sobre las transacciones cuando hay 10 registros que deben cambiarse de 10k e insertar / actualizar todos los registros no son viables.
Estoy aquí por Winter Hats el
Luego solo actualiza los 10 registros. Dije que si puedes, hazlo. No dije hacerlo incluso si destruye la base de datos de producción de su cliente. Sigue mi consejo con un grano de sal, por favor.
Neil
12

En ese momento, debería estar utilizando un sistema de base de datos de grado comercial que admita instantáneas (Oracles lo llama Flashback ), para eso es exactamente el tipo de cosas para las que son.

Tenga en cuenta que necesita un concepto de copia de seguridad de todos modos: tener más datos no significa que descarte las copias de seguridad porque se vuelven difíciles, todo lo contrario. Necesita algún tipo de copia de seguridad continua, por ejemplo, basada en la replicación con conmutación por error automática.

Michael Borgwardt
fuente
No digo que quiera eliminar las copias de seguridad. Las copias de seguridad programadas siempre están ahí. La pregunta es más acerca de las copias de seguridad ad-hoc, que no son un problema son los sistemas pequeños.
Pritam Barhate
Para más detalles, esta línea de pensamiento provino de NoSQL DB como plataformas de servicio. En realidad estaba leyendo la documentación de Firestore, cuando apareció. Si necesita copias de seguridad lógicamente consistentes fuera del sitio, parece muy costoso. Así que me preguntaba cómo los equipos de productos exitosos trabajan con tales sistemas y cómo se aseguran de que no ocurra la corrupción lógica de datos.
Pritam Barhate
@PritamBarhate: no necesita "más copias de seguridad" debido a las actualizaciones. En una base de datos de producción donde las personas trabajan con esos datos, las copias de seguridad deben realizarse al menos diariamente, con o sin actualizaciones. Las restauraciones son su problema, desea evitar restauraciones innecesarias en todas las circunstancias.
Doc Brown
3
La replicación con conmutación por error automática es que la redundancia no es más una estrategia de respaldo para bases de datos que uso de RAID para los discos .
Blrfl
1
Todos los puntos positivos sobre las copias de seguridad y las instantáneas, pero limpiar una operación de base de datos fallida (si se han agregado varias horas de datos nuevos antes de que se realicen) puede ser muy difícil dependiendo del escenario y los otros sistemas a los que afecta (programadores, otras entradas de la base de datos) que dependen de él, si abarca varias tablas, cachés, autenticación, etc. Siempre asumo que voy a tener que usar una copia de seguridad, pero siempre al menos trato de no tener que hacerlo nunca.
Pingüino anónimo
3

Esta es un área masiva, así que espere que esta pregunta se cierre en un tiempo bastante corto pero, fuera de mi alcance (como un ex DBA en bases de datos de yuge):

Mart / Repository

Puede mitigar algunos riesgos si tiene una base de datos separada para actualizaciones y una base de datos separada que todos usan. Entonces es solo un caso de copiar los datos de una base de datos a la otra una vez que se han realizado varias verificaciones. Mart / repositorio es cómo se describe a veces, pero es posible que tenga primario / secundario, maestro / esclavo, etc.

Código fuente

Para todo lo que pueda cambiar, tenga un código fuente que se relacione con cómo se actualizaron los datos. La cantidad de estos que tiene varía de una base de datos a otra, pero puede tener una para cada usuario, rol, fuente de datos, módulo de código, etc.

Fecha de creación / actualización

Algo que puede ser de gran ayuda al rastrear dónde han ido mal las cosas es tener una creación y actualizar datos para cada fila. Luego puede ver de un vistazo qué filas se han actualizado.

ETL

Si la actualización de la base de datos participa como parte de una fábrica de datos, es posible que pueda restaurar una cosecha anterior de archivos planos.

Apoyo

Las copias de seguridad completas, por supuesto, ocupan mucho espacio, pero el escenario habitual es que se realice una copia de seguridad completa a intervalos regulares (por ejemplo, semanalmente) y parciales con mayor frecuencia (diariamente, etc.).

Punto en el tiempo de recuperación

Dependiendo de qué RDBMS está utilizando, algunos puntos de apoyo en el tiempo de recuperación. Esto le permite retroceder al momento en que se conocía un buen estado. Sin embargo, esto requiere una gran cantidad de almacenamiento, lo que aumenta hasta qué punto desea retroceder.

Auditoría

Tener tablas de auditoría le dirá quién (o qué) realizó una actualización de una fila. Esto puede darle un buen punto de partida para la investigación.

Historia

Para algunas tablas críticas, se toma una copia de la fila pertinente en el momento de la actualización para que los datos se puedan restaurar si es necesario.

Validación de datos

Asegúrese de que se realicen verificaciones de validación básicas en los datos antes de que se almacenen, además de las verificaciones de tipo de datos básicos.

Integridad referencial

La integridad referencial no es una bala de plata, pero puede ayudar a garantizar que los datos estén bien estructurados.

Robbie Dee
fuente
2

Muchas veces, si estamos haciendo una actualización "única", hacemos una copia de seguridad de la producción y la restauramos en un servidor de prueba. Luego creamos un juego de pruebas y ejecutamos un disparo. Verificamos que los datos han cambiado a través de las pruebas y nos sentimos cómodos con la actualización exitosa y modificamos los datos de la manera que esperamos. Esto se llama ejecución en seco o de prueba. Recomiendo hacer esto

Esto les da a todos una buena idea de que la única toma tendrá éxito. No podemos garantizar el 100% porque los datos se actualizarán a partir de la fecha de ejecución de la prueba, pero aumentamos la confianza y los factores de éxito. Esto también da una idea real de cualquier problema que pueda ocurrir ya que estamos usando una copia de producción. Ahora, si por alguna razón la actualización falla, siempre podemos volver a la ejecución anterior antes de restaurar si es necesario, pero deberíamos haber encontrado y reparado cualquier problema con la ejecución en seco.

Si no puede tomar toda la base de datos (si es realmente grande) intente exportar un tamaño de muestra más pequeño y ejecute la actualización (ejecución en seco pequeña) contra los datos reales. Preferiría todo el conjunto de datos si es posible para asegurar que la prueba sea lo más completa posible.

Jon Raynor
fuente