¿Cuál es su forma número uno de tener cuidado con una base de datos activa? [cerrado]

80

Para mi cliente, de vez en cuando trabajo en su base de datos en vivo para solucionar un problema que ellos mismos han creado, o para corregir datos erróneos que crearon los errores de mi producto. Al igual que el acceso root de Unix, es peligroso. ¿Qué lecciones debo aprender antes de tiempo?

¿Qué es lo primero que debe hacer para tener cuidado al operar con datos en vivo?

Kevin Conner
fuente

Respuestas:

101

Tres cosas que he aprendido de la manera más difícil a lo largo de los años ...

Primero, si está haciendo actualizaciones o eliminaciones de datos en vivo, primero escriba una consulta SELECT con la cláusula WHERE que usará. Asegúrate de que funcione. Asegúrate de que sea correcto. Luego, anteponga la instrucción UPDATE / DELETE a la cláusula WHERE de trabajo conocida.

Nunca querrás tener

DELETE FROM Customers

sentado en su analizador de consultas esperando que escriba la cláusula WHERE ... accidentalmente presione "ejecutar" y acaba de eliminar su tabla de clientes. ¡Ups!

Además, dependiendo de su plataforma, descubra cómo realizar una copia de seguridad rápida y sucia de una mesa. En SQL Server 2005,

SELECT *
INTO CustomerBackup200810032034
FROM Customer

copiará todas las filas de toda la tabla Customer en una nueva tabla llamada CustomerBackup200810032034, que luego podrá eliminar una vez que haya realizado las actualizaciones y se haya asegurado de que todo esté bien. Si ocurre lo peor, es mucho más fácil restaurar los datos faltantes de esta tabla que intentar restaurar la copia de seguridad de anoche desde un disco o cinta.

Finalmente, tenga cuidado con las eliminaciones en cascada que eliminan las cosas que no tenía la intención de eliminar: verifique las relaciones de sus tablas y las restricciones clave antes de modificar nada.

Dylan Beattie
fuente
1
¿No te refieres a BORRAR DE Los clientes solo son técnicos :-)
craigmoliver
5
O mejor aún, no uses nada en cascada.
dkretz
108
BEGIN TRANSACTION;

De esa manera, puede retroceder después de un error.

Paul Tomblin
fuente
Sí, prácticamente la única forma de evitar la locura de la palma de la mano.
willasaywhat
11
@Graeme, no debería hacer DDL en bases de datos de producción. Debe escribir un script, ejecutarlo en su base de datos de prueba y, después de que su base de datos de prueba pase el control de calidad, entonces ejecutarlo en el servidor de producción.
Paul Tomblin
1
@Paul: absolutamente. Pero se podría argumentar que debería hacer lo mismo con cualquier tipo de modificación a su base de datos de producción, ya sea DDL o DML, en cuyo caso toda esta pregunta no tiene sentido.
Graeme Perrow
3
Eduardo, obtuvo 45 votos hasta ahora porque, la mayoría de las veces, el sudor frío comienza antes de que el dedo haya terminado de moverse completamente hacia abajo en el teclado, pero es demasiado tarde para detener el dedo.
Euro Micelli
1
También es útil porque puede ejecutar un montón de selecciones dentro de la misma transacción para verificar los resultados antes de comprometerse, si son inesperados, no hay ningún daño, simplemente retroceda.
Dave Cluderay
50

Haga una copia de seguridad primero: debería ser la ley número 1 de la administración de sistemas de todos modos

EDITAR : incorporando lo que otros han dicho, asegúrese de que sus ACTUALIZACIONES tengan cláusulas WHERE apropiadas.

Idealmente, el cambio de una base de datos en vivo nunca debería suceder (más allá de INSERTs y mantenimiento básico). Cambiar la estructura de la base de datos en vivo está especialmente cargado de mal karma potencial.

warren
fuente
25

Realice los cambios en una copia y, cuando esté satisfecho, aplique la corrección a la versión en vivo.

Bob King
fuente
la mayoría de las veces, copy db es diferente a live y no todos los cambios se comportan igual que copy y live.
bugBurger
Si la base de datos de copia es diferente de la base de datos en vivo, ¿no significa eso que en realidad no es una base de datos de copia? El propósito completo de una base de datos de prueba / qa / copia es probar los cambios antes de que se apliquen a una base de datos en vivo / de producción.
Wilco
22

A menudo, antes de hacer una ACTUALIZACIÓN o ELIMINACIÓN, escribo el SELECT equivalente.

Patrick McElhaney
fuente
Como comprobación rápida y sencilla, también me gusta este método. Dependiendo de la cantidad de resultados, puede que no funcione, pero al menos es un comienzo para ACTUALIZACIONES y ELIMINACIONES.
osp70
18

NUNCA realice una actualización a menos que esté en un BEGIN TRAN t1, ni en una base de datos de desarrollo, ni en producción, ni en ningún lugar. NUNCA ejecute un COMMIT TRAN t1 fuera de un comentario; escriba siempre

--COMMIT TRAN t1

y luego seleccione la declaración para ejecutarla. (Obviamente, esto sólo se aplica a los clientes de consultas de GUI). Si hace estas cosas, se convertirá en una segunda naturaleza y no perderá casi nada de tiempo.

De hecho, tengo una macro de "actualización" que escribe esto. Siempre pego esto para configurar mis actualizaciones. Puede hacer uno similar para eliminaciones e inserciones.

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1
Patrick Szalapski
fuente
Sí, esto es precisamente lo que hago. Demasiada gente está diciendo "no olvides la cláusula where", pero ¿y si está mal? Nunca, nunca actualice una base de datos en vivo sin este patrón de inicio / reversión / confirmación.
Eric Z Beard
Una mejora adicional es primero hacer un "seleccionar * desde" con la cláusula where para asegurarse de que sea correcta, luego ejecutar la actualización con la misma cláusula where.
Eric Z Beard
Eric tiene razón, aunque dejo esto fuera de mi macro para evitar el deslizamiento del alcance. Tengo otra macro que escribe "seleccionar * de" para uso general.
Patrick Szalapski
No hay una buena razón para no hacerlo de esta manera. Cuando tuve que escribir scripts de actualización en un trabajo anterior, lo hice de esta manera, junto con un SELECT antes de la actualización y un SELECT después , para poder ver los resultados. Después de ejecutarlo varias veces y ver que los resultados eran correctos, cambié el ROLLBACK a COMMIT.
Ryan Lundy
13

Siempre asegúrese de que sus UPDATEs y DELETEs tengan la cláusula WHERE adecuada.

Wayne
fuente
Sí, me he quemado con esto antes.
Ian Jacobs
Yo también. Desde entonces he deseado que SQL hubiera sido diseñado para que la cláusula where fuera primero.
Greg Hewgill
Me encanta esa sensación de hundimiento cuando se ejecuta una ACTUALIZACIÓN rápida y dice "1279209394 Registro (s) afectado". UH oh. ;)
Kevin Fairchild
13

Para responder mi propia pregunta:

Al escribir una declaración de actualización, escríbala fuera de orden.

  1. Escribir UPDATE [table-name]
  2. Escribir WHERE [conditions]
  3. Regresa y escribe SET [columns-and-values]

Elegir las filas que desea actualizar antes de decir qué valores desea cambiar es mucho más seguro que hacerlo en el otro orden. Hace que sea imposible update person set email = '[email protected]'estar sentado en su ventana de consulta, listo para ser ejecutado por una pulsación de tecla fuera de lugar, listo para estropear cada fila de la tabla.

Editar: como han dicho otros, escriba la WHEREcláusula para sus eliminaciones antes de escribir DELETE.

Kevin Conner
fuente
11

Como ejemplo, creo SQL como este

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

Resalto el texto desde el final hasta el Seleccionar y ejecuto ese SQL. Una vez que verifico que está extrayendo el registro que quiero actualizar, presiono shift-up para resaltar la declaración de actualización y ejecutarla.

Tenga en cuenta que utilicé un alias. Nunca actualizo explícitamente el nombre de una tabla. Siempre uso un alias.

Si hago esto junto con transacciones y rollback / commits, estoy realmente seguro.

wcm
fuente
También utilizo una verificación de selección; he detectado varios errores de cláusula where de esta manera. Es una buena prueba de cordura, especialmente cuando las declaraciones son complejas.
Bob Probst
Este método se perfeccionó durante un breve período después de ver a mi supervisor eliminar una tabla importante en producción a la mitad del día.
wcm
Cambio la selección y actualizo y elimino los comentarios en la selección. Luego, cuando estoy listo, resalto el área y corro. Funciona para eliminar también.
rball
11

¿Mi forma número uno de tener cuidado con una base de datos activa? No lo toques. :)

Las copias de seguridad pueden deshacer el daño que infliges en la base de datos, pero aún es probable que introduzcas efectos secundarios negativos durante ese período de tiempo.

No importa qué tan sólido crea que es el script con el que está trabajando, ejecútelo a través de un ciclo de prueba. Incluso si un "ciclo de prueba" significa ejecutar el script en su propia instancia de la base de datos, asegúrese de hacerlo. Es mucho mejor introducir defectos en su caja local que en un entorno de producción.

Gabriel Isenberg
fuente
6
  1. Compruebe, vuelva a comprobar y vuelva a comprobar cualquier estado que esté realizando actualizaciones. Incluso si cree que solo está haciendo una actualización simple de una sola columna, tarde o temprano no tendrá suficiente café y olvidará una cláusula 'dónde', destruyendo una mesa completa.

Algunas otras cosas que he encontrado útiles:

He descubierto que estas 3 cosas me han impedido hacer un daño grave.

dmercer
fuente
Sí, clásico: UPDATE TABLE_NAME SET FIELD_X = 'lo que sea' [DÓNDE = falta]
Stefan Steiger
6
  • Nadie quiere respaldo, pero todos claman por la recuperación.
  • Cree su base de datos con referencias de clave externa, porque debe:
  • Hágase lo más difícil posible para usted actualizar / eliminar datos y destruir la integridad estructural / algo más con eso
  • Si es posible, ejecútelo en un sistema en el que tenga que confirmar los cambios antes de almacenarlos permanentemente (es decir, desactive la confirmación automática mientras repara la base de datos)
  • Intente identificar las clases de su problema para que comprenda cómo solucionarlo sin problemas
  • Obtenga una rutina para reproducir copias de seguridad en una base de datos, siempre tenga a mano una segunda base de datos en un servidor de prueba para que pueda trabajar en eso
  • Porque recuerde: si algo falla por completo, debe volver a estar en funcionamiento lo más rápido posible

Bueno, eso es todo en lo que puedo pensar ahora. Tome los pasajes en negrita y verá cuál es el número 1 para mí. ;-)

Georgi
fuente
Solo me gustaría agregar algo a la mención del compromiso automático, porque es un mecanismo de seguridad importante. Si se está conectando directamente a la base de datos, generalmente puede desactivar el compromiso automático en los parámetros de conexión de la base de datos. De lo contrario (producto db front-end), es posible que deba buscar una configuración de aplicación.
Mike Monette
3

Tal vez considere no usar eliminaciones o eliminaciones en absoluto. O tal vez reduzca los permisos de usuario para que solo un usuario de base de datos especial pueda eliminar / eliminar cosas.

Gilles
fuente
3

Si está utilizando Oracle u otra base de datos que lo admita, verifique sus cambios antes de realizar un COMMIT.

Wayne
fuente
Debe tener cuidado porque los registros pueden estar bloqueados mientras su transacción está pendiente.
Greg Ogle
Por lo general, uso el desarrollador de SQL para Oracle y nunca se confirma automáticamente, incluso después de ejecutarlo. Entonces tenemos una vista previa y luego confirmamos. ¡Característica genial!
lakshminb7
3

Los datos siempre deben implementarse para vivir a través de scripts, que se pueden ensayar tantas veces como sea necesario para hacerlo bien en dev. Cuando haya datos dependientes para que el script se ejecute correctamente en el desarrollador, organícelo de manera adecuada; no puede salirse con la suya con este paso si realmente quiere tener cuidado.

Haoest
fuente
3

¡Comprueba dos veces, confía una vez!

PaulH
fuente
2

Haga una copia de seguridad o vuelque la base de datos antes de comenzar.

Lou Franco
fuente
2

Para agregar a lo que dijo @ Wayne , escriba su WHEREantes del nombre de la tabla en una declaración DELETEo UPDATE.

2 revoluciones
fuente
2

RESPALDA SUS DATOS. Aprendí eso de la manera más difícil trabajando con bases de datos de clientes de forma regular.

Arrendajo
fuente
2

Siempre agregue una cláusula using.

cciotti
fuente
2

Mi regla (como desarrollador de aplicaciones): ¡No la toques! Para eso están los DBA capacitados. Diablos, ni siquiera quiero permiso para tocarlo. :)

Herms
fuente
2

Diferentes colores por entorno: Hemos configurado nuestro desarrollador PL \ SQL (IDE para Oracle) para que cuando inicie sesión en la base de datos de producción, todas las ventanas estén en rojo brillante. Algunos han ido tan lejos como para asignar un color diferente para desarrollo y prueba también.

Doron Yaacoby
fuente
1

Asegúrese de especificar una cláusula where al eliminar registros.

Bill el lagarto
fuente
1

Siempre pruebe primero cualquier consulta más allá de la selección en los datos de desarrollo para asegurarse de que tenga el impacto correcto.

Carlton Jenke
fuente
1
  1. si es posible, pida emparejarse con alguien
  2. Siempre cuente hasta 3 antes de presionar Enter (si está solo, ¡esto enfurecerá a su pareja!)
Miguel Pascua
fuente
1

Si estoy actualizando una base de datos con un script, siempre me aseguro de poner uno o dos puntos de interrupción al comienzo de mi script, en caso de que apriete el botón de ejecutar / ejecutar por accidente.

Brian Vander Plaats
fuente
1

Agregaré a las recomendaciones de hacer BEGIN TRAN antes de su ACTUALIZACIÓN, pero no olvide hacer el COMMIT; puede hacer el mismo daño si deja abierta su transacción no comprometida. No se distraiga con teléfonos, compañeros de trabajo, almuerzos, etc. cuando esté en medio de actualizaciones o encontrará que todos los demás están encerrados hasta que usted COMPROMETE o ROLLBACK.

SqlACID
fuente
1

Siempre comento cualquier consulta destructiva (insertar, actualizar, eliminar, soltar, alterar) cuando escribo consultas ad hoc en Query Analyzer. De esa forma, la única forma de ejecutarlos es resaltarlos, sin seleccionar la parte comentada, y presionar F5.

También creo que es una buena idea, como ya se mencionó, escribir su declaración where primero, con una selección, y asegurarse de que está alterando los datos correctos.

Kibbee
fuente
1
  1. Siempre retroceda antes de cambiar.
  2. Siempre haga modificaciones (por ejemplo, ALTER TABLE) a través de un script.
  3. Siempre modifique los datos (por ejemplo, ELIMINAR) mediante un procedimiento almacenado.
user20282
fuente
1

Cree un usuario de solo lectura (u obtenga el DBA para que lo haga) y solo use ese usuario para mirar la base de datos. Agregue los permisos adecuados al esquema para que pueda ver el contenido de los procedimientos almacenados / vistas / activadores / etc. pero no tener la capacidad de cambiarlos.

Richard Nienaber
fuente