Fijar de forma segura los datos de la base de datos de producción

23

Los errores ocurren y, a veces, los datos deben corregirse en producción. ¿Cuál es la forma más segura de hacerlo desde el punto de vista de una gran empresa? ¿Hay herramientas que pueden ayudar? Aquí hay algunas consideraciones que impulsan este requisito ...

  1. Necesitamos registrar quién ejecutó la consulta y qué ejecutaron
  2. Idealmente, necesitamos darle acceso a la persona para que solo ejecute consultas en las tablas de interés y solo por un corto tiempo
  3. Lo que sea que se esté ejecutando, las consultas deben tener algo de inteligencia para no permitir la ejecución prolongada y el bloqueo de SQL para ejecutarse sin permiso explícito
  4. Este proceso debe ser independiente de la base de datos o al menos comprender DB2, Oracle y SQL Server.

Estamos tratando de reducir el riesgo de que las consultas de reparación de productos ad-hoc hagan lo "incorrecto" y, al mismo tiempo, agreguemos algo de seguridad / auditorías al proceso. ¿Pensamientos o ideas?

Andrew White
fuente
26
Nunca permita que la gerencia piense que este es el Procedimiento Operativo Estándar. Esta es una cirugía de emergencia a corazón abierto sin máscaras o guantes, NO es una forma normal de tratar con los insectos que deberían haberse detectado en las pruebas.
Dan Pichelman
2
Es porque quieres trabajar de esta manera que los errores ocurrieron en primer lugar.
Reactgular
77
@MathewFoscarini ese comentario no agrega nada a la conversación ni aclara nada. También está mal que nunca dije que quería que las cosas funcionaran de esta manera, solo que tenemos algunas consideraciones que deben tener lugar. Algunas de las respuestas a continuación abordan bien todos mis puntos.
Andrew White el
1
@ AndrewWhite mis disculpas Andrew no se pretendía ofender.
Reactgular

Respuestas:

52

Nunca actualice las bases de datos de producción manualmente.

Escribe guiones.

Verifíquelos tres veces y haga que varias personas lo hagan, no solo una persona que lo haga tres veces.

Incluya consultas de validación posteriores al cambio en esos scripts.

Siempre que la situación lo permita, pruebe todo el cambio dentro de una transacción que se revierte al final, después de que se haya ejecutado la validación posterior al cambio. Cuando esté seguro con los resultados, cambie la reversión a una confirmación.

Pruebe esos scripts ad nauseam contra una base de datos de prueba.

Haga una copia de seguridad antes de ejecutar el script en la base de datos de producción.

Ejecuta los scripts.

Verifique, valide y verifique tres veces los datos modificados utilizando los scripts de validación posterior al cambio.

Haga una verificación visual de todos modos.

Si algo parece apagado, retroceda y restaure la copia de seguridad.

No continúe con los datos modificados como datos de producción hasta que esté absolutamente seguro de que todo está bien y haya finalizado la sesión de los gerentes (comerciales) involucrados.

Marjan Venema
fuente
21
@ Andrew eso no es excusa: olvídate de uno WHEREy tu base de datos estará inactiva por el resto del día. O semana.
CodeCaster
99
@ AndrewWhite Usted solicitó la forma más segura de arreglar los datos, no la más rápida . :-)
Eric King
99
@ AndrewWhite: ya tienes un problema. Si apresura la solución, tendrá DOS problemas, si no más, y / o podría empeorar los problemas, en lugar de mejorarlos.
Michael Kohne
66
@AndrewWhite: francamente, hacer que sea un proceso no trivial me parecería una ventaja. Todos serán conscientes del costo y el riesgo en comparación con la culpabilidad "bueno, lo hemos hecho 23 veces antes sin problemas" que he visto en varios lugares.
DaveE
3
@EricKing: xkcd.com/349
Robin
20

La respuesta de Marjan Venema es técnicamente válida y debe seguirse cuando sea posible. Por desgracia, Marjan responde desde el punto de vista de un teórico o un administrador de base de datos purista al que le gusta hacer las cosas de manera limpia. En la práctica, a veces las restricciones comerciales hacen que sea imposible hacer las cosas de manera limpia.

Imagine el siguiente caso:

  1. Hay un error en el producto de software que hace que deje de funcionar cuando detecta lo que considera una inconsistencia de datos en la base de datos,

  2. Todos los desarrolladores que podrían solucionar el error en la aplicación son inalcanzables,

  3. Actualmente, la compañía está perdiendo miles de dólares por hora (digamos $ 6 000, lo que significa $ 100 por minuto),

  4. El error está afectando a varias tablas, una de las cuales es enorme y se refiere solo a los datos en sí, no al esquema,

  5. Para evitar el error, debe experimentar un poco con los datos, lo que implica eliminarlos y cambiarlos,

  6. La base de datos es grande y tomaría tres horas tomar o restaurar la copia de seguridad,

  7. La última copia de seguridad completa se tomó hace tres semanas; también hay copias de seguridad incrementales diarias, y la última copia de seguridad incremental diaria se realizó hace 14 horas,

  8. Se supone que las copias de seguridad de la base de datos son confiables; fueron severamente probados, incluso recientemente,

  9. No es aceptable perder 14 horas de datos, pero la pérdida de una o dos horas de datos es,

  10. El entorno de ensayo se utilizó por última vez hace seis meses; parece que no está actualizado y puede llevar horas configurarlo,

  11. La base de datos es Microsoft SQL Server 2008 Enterprise.

La forma limpia de hacer las cosas es:

  1. Restaurar la copia de seguridad en un entorno provisional,

  2. Experimenta allí

  3. Verifique el guión final dos veces,

  4. Ejecute el script en el servidor de producción.

Solo el primer paso le costará $ 18 000 a su empresa. El riesgo es bastante bajo si realiza el tercer paso sin problemas, pero dado que trabaja bajo presión extrema, el riesgo sería mucho mayor. Puede terminar con un script que funcionó perfectamente bien en la puesta en escena, luego atornilla la base de datos de producción.

En cambio, podrías haber hecho así:

  1. Cree una instantánea (Microsoft SQL Server lo admite, y lleva unos segundos revertir (y nada crear) una instantánea de una base de datos que demora una hora en hacer una copia de seguridad; me imagino que otros productos de bases de datos también admiten instantáneas),

  2. Experimente directamente en la base de datos de producción, volviendo a la instantánea si algo sale mal.

Mientras que un purista arreglaría la base de datos de una manera limpia y aún correría el riesgo de arruinar las cosas dada la presión del tiempo mientras desperdicia más de $ 20 000 de su compañía, un administrador de la base de datos que tenga en cuenta las restricciones comerciales arreglará la base de datos de una manera lo que minimizará los riesgos (gracias a las instantáneas) mientras lo hace rápidamente.

Conclusión

Soy purista y odio hacer las cosas de una manera no limpia. Como desarrollador, refactorizo ​​el código que modifico, comento las partes difíciles que no se pudieron refactorizar, compruebo la base de código y hago revisiones de código. Pero también tomo en consideración las circunstancias en las que haces las cosas limpiamente y al día siguiente que te despiden, o minimizas tanto los riesgos como el impacto financiero al hacer un truco rápido que funciona.

Si un técnico de TI quiere hacer las cosas de manera limpia solo por el bien de la limpieza, mientras que causa una pérdida de miles de dólares para la empresa, este técnico de TI tiene una profunda incomprensión de su trabajo.

Arseni Mourzenko
fuente
2
Y haga su trabajo fuera del horario comercial si es posible, cuando la actividad real del cliente es mínima
Dan Pichelman,
3
Incluso si su base de datos es grande y la copia de seguridad lleva mucho tiempo, probablemente solo pueda tomar un subconjunto de esos datos y experimentar con eso.
Radu Murzea
3
Un voto a favor para su edición, pero: si los datos son tan cruciales y costosos para el negocio, es absolutamente idiota que los procedimientos operativos estén en tan mal estado. Sin copias de seguridad confiables, sin entorno que minimice el entorno de producción, lo que requiere experimentar con datos en vivo: definitivamente no me gustaría trabajar en una empresa tan estresante y poco profesional.
CodeCaster
3
@CodeCaster: es triste, pero a menudo veo esto en la práctica, incluso en grandes empresas.
Arseni Mourzenko
3
Lo más probable es que el negocio se metió en esta situación precisamente porque no siguieron el consejo en la publicación de Marjan cuando tuvieron la oportunidad.
Eric King
4

Fijación segura de los datos de la base de datos de producción. ¿Cuál es la forma más segura de hacerlo desde el punto de vista de una gran empresa? ¿Hay herramientas que pueden ayudar?

Es una mala práctica y una puerta de invitación para más problemas y problemas de datos. Incluso hay una frase que describe este enfoque como " Rápido y sucio ".

Continuar arreglando / actualizando directamente en un servidor de producción es muy peligroso , ya que le costará a usted / a su compañía una fortuna ( demandas legales, datos malos / sucios, negocios perdidos, etc. )

Sin embargo, los errores estarán allí y deben corregirse. El estándar industrial de facto es aplicar parches / (secuencias de comandos de implementación) en un Staging (entorno de preproducción con la última copia de la base de datos prod) y dejar que el analista de datos / QA verifique la solución. El mismo script debe ser controlado por la versión y aplicado al entorno Prod para evitar problemas.

Hay una serie de buenas prácticas mencionadas en esta publicación relacionada: buenas prácticas de la base de datos provisional

Un buen conjunto de referencias para mirar son:

EL Yusubov
fuente
2

En la mayoría de las organizaciones, he trabajado para actualizar los datos en el entorno en vivo, siempre fue realizado por un pequeño grupo de personas con los derechos de acceso para hacerlo, generalmente con un título de trabajo como DBA. Como las actualizaciones solo pueden ser realizadas por el pequeño número de personas, existe al menos una posibilidad de que se familiaricen con los datos y, por lo tanto, reduzcan (pero no eliminen) el riesgo de problemas.

La persona que escribe el script de actualización lo haría en la prueba (como en otras respuestas) y obtendría una aprobación seria de los no técnicos (aquellos que conocen el sistema, además de alguien con autoridad superior) de que las características parecen estar 'correctas nuevamente' en Además de su propia prueba paranoica. Los scripts y los datos serían verificados independientemente por otro técnico (a menudo el rol de DBA que mencioné) en la prueba antes de que se ejecute. Los resultados se compararían con los valores anticipados (únicos para cada escenario, pero a menudo cosas como conteos de filas, etc.)

En una empresa para la que trabajé, hacer copias de seguridad no era una opción realista, pero todas las filas que se actualizaron se escribieron en un archivo de texto para referencia ANTES de la actualización, y luego DESPUÉS de la actualización si alguien alguna vez necesita consultarla. Los scripts y estos datos se guardaron en un registro de cambios de datos debidamente organizado.

Cada negocio es único, y los riesgos de actualizar algunos datos son claramente mayores que en otros.

Al tener un proceso que hace que las personas tengan que pasar por alto para hacer estas actualizaciones, esperamos que promueva una cultura que haga que las personas quieran tratar esto como un último recurso, y cree una actitud saludable de "doble verificación, triple verificación" en torno a estas cosas.

Wayne M
fuente
Ah, y por supuesto, siempre que sea posible, analice el código en la aplicación para garantizar que se atiendan las actualizaciones dependientes ocultas en la lógica ... Y si hay alguna posibilidad de que haya desencadenantes en las tablas que está actualizando, verifíquelas y piense en si necesitan deshabilitar o no.
Wayne M
2

Hay momentos en que debe corregir datos en Prod que no existen en otros servidores. Esto no se debe solo a errores, sino que podría ser una importación de datos de un archivo enviado por un cliente que era incorrecto o un problema causado por alguien que hackeó su sistema. O por un problema causado por una mala entrada de datos. Si su base de datos es grande o tiene un tiempo crítico, es posible que no tenga tiempo para restaurar la última copia de seguridad y corregirla en el desarrollador.

Su primera defensa (¡y algo sin lo que ninguna base de datos Enterprise puede permitirse prescindir!) Son las tablas de auditoría. Puede usarlos para retroceder cambios de datos incorrectos. Además, puede escribir scripts para devolver los datos al estado anterior y probarlos en otros servidores mucho antes de que necesite revertir los datos auditados. Entonces, el único riesgo es que identificó los registros correctos para revertir.

A continuación, todos los scripts para cambiar los datos de producción deben incluir lo siguiente:

Deben estar en transacciones explícitas y tener un bloque TRY Catch.

Deben tener un modo de prueba que pueda usar para revertir los cambios después de ver cuáles habrían sido. Debería tener una declaración seleccionada antes de que se realizara el cambio y una ejecución después del cambio para asegurarse de que el cambio fuera correcto. El script debe asegurarse de que se muestre el número de filas procesadas. Tenemos algo de esto preconfigurado en una plantilla que asegura que las piezas se realicen. Las plantillas para cambios también ayudan a ahorrar tiempo al escribir la corrección.

Si hay una gran cantidad de datos para cambiar o actualizar, considere escribir el script para que se ejecute en lotes con confirmaciones para cada lote. No desea bloquear todo el sistema mientras arregla un millón de registros. Si tiene una gran cantidad de datos para corregir, asegúrese de que un dba o alguien que esté acostumbrado a la optimización del rendimiento revise el script antes de ejecutarlo y, si es posible, ejecutarlo fuera del horario laboral.

A continuación, todas las secuencias de comandos para cambiar cualquier cosa en la producción se revisan en código y se ponen en control de origen. Todos ellos, sin excepción.

Finalmente, los desarrolladores no deben ejecutar estos scripts. Deben ser ejecutados por dbas o un grupo de administración de configuración. Si no tiene ninguno de ellos, entonces solo las personas que son líderes tecnológicos o superiores deberían tener los derechos para ejecutar cosas en productos. Cuantas menos personas ejecuten cosas en productos, más fácil será localizar un problema. Las secuencias de comandos deben escribirse de modo que simplemente se ejecuten, no resalten partes y se ejecuten paso a paso. Es lo más destacado lo que a menudo causa problemas a las personas cuando se olvidan de resaltar la cláusula where.

HLGEM
fuente
0

He actualizado datos muchas veces en la ejecución de bases de datos de producción. Estoy de acuerdo con la respuesta anterior, que este nunca sería un procedimiento operativo estándar.

También sería costoso (miraríamos por encima de los hombros de los demás y discutiremos 2 o 3 tal vez)

Y la regla de oro: siempre haga una declaración de selección para mostrar lo que se haría antes de hacer una declaración de actualización / eliminación / inserción

¡La regla de oro aplicada por las otras dos personas en el equipo!

usuario99432
fuente
0

re: la respuesta de MainMa ...

Hay un error en el producto de software que hace que deje de funcionar cuando detecta lo que considera una inconsistencia de datos en la base de datos,

  • ¿Cómo sabes que es un "error"? Los datos son inconsistentes de acuerdo con las reglas establecidas por el desarrollador del producto de software.

Todos los desarrolladores que podrían solucionar el error en la aplicación son inalcanzables,

Actualmente, la compañía está perdiendo miles de dólares por hora (digamos $ 6 000, lo que significa $ 100 por minuto),

  • Aparentemente, una pérdida de $ 100 / minuto no es lo suficientemente importante para la administración de la compañía como para que puedan ubicar y asegurar que los desarrolladores competentes regresen para corregir su error y ayudarlo a restaurar la base de datos.

El error está afectando a varias tablas, una de las cuales es enorme y se refiere solo a los datos en sí, no al esquema

  • Todos los problemas de la base de datos "conciernen" al esquema. El diseño del esquema es lo que determinará cómo resolverá este problema.

Para evitar el error, debe experimentar un poco con los datos, lo que implica eliminarlos y cambiarlos,

  • Para eso está su base de datos provisional. Es posible que deba repoblarlo con datos "corruptos" de la base de datos de producción justo después de realizar una copia de seguridad completa en línea de la producción.

La base de datos es grande y tomaría tres horas tomar o restaurar la copia de seguridad,

  • Entonces es mejor que comience de inmediato para que pueda ejecutarse mientras analiza el problema, desarrolla sus scripts de corrección, los prueba y los refina junto con los desarrolladores y otros DBA que lo ayudan.

La última copia de seguridad completa se tomó hace tres semanas; también hay copias de seguridad incrementales diarias, y la última copia de seguridad incremental diaria se realizó hace 14 horas,

  • ¿No tiene al menos copias de seguridad diarias completas en línea? Estás jodido. Pero probablemente estés acostumbrado a eso. Lo bueno es que se está ejecutando la copia de seguridad completa que comenzó anteriormente. Asegúrese de que la administración analice cada minuto los costos que podrían haberse evitado con las copias de seguridad diarias en línea.

Se supone que las copias de seguridad de la base de datos son confiables; fueron severamente probados, incluso recientemente,

  • ¡Excelente! Entonces es posible que no tenga que restaurar la base de datos más de una vez.

No es aceptable perder 14 horas de datos, pero la pérdida de una o dos horas de datos es,

  • Bajo el escenario que ha descrito, todas las apuestas están canceladas. Esta es una situación de "gestión de desastres de información". Una buena cosa que la administración debe hacer es documentar los costos que podrían evitarse en el futuro con copias de seguridad y procedimientos y recursos de recuperación.

El entorno de ensayo se utilizó por última vez hace seis meses; parece que no está actualizado y puede llevar horas configurarlo,

  • Si su sistema de respaldo admite respaldos en línea (es decir, una base de datos completamente operativa durante el respaldo), entonces puede hacer el extracto para repoblar la base de datos provisional al mismo tiempo si tiene suficientes recursos de hardware para evitar ralentizar el respaldo.

La base de datos es Microsoft SQL Server 2008 Enterprise.

  • Más difícil de hacer todo esto pero no imposible. ¡Buena suerte!
DocSalvager
fuente