El cambio que nadie pudo deshacer
Un viernes por la tarde, un ingeniero corrige los precios de un proveedor. El UPDATE está bien. El WHERE tiene una errata y coincide con toda la tabla.
Una base de datos no tiene botón de deshacer. La única vuelta atrás es una copia hecha antes del cambio.
En un trabajo, hacer esa copia es el primer paso, siempre.
Al terminar esta lección
Nota
Puedo hacer una copia de una tabla antes de un cambio y restaurarla si el cambio está mal.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Copia de seguridad | una copia de datos hecha para poder recuperarlos |
| Volcado | un archivo de texto con el SQL que reconstruye una tabla y sus filas |
| Restaurar | volver a poner los datos desde una copia |
| Filas afectadas | cuántas filas tocó un cambio |
| Ensayo | probar un cambio dentro de una transacción y deshacerlo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Trabaja con una copia de la tienda
Vas a cambiar datos y luego a repararlos. La tienda debe quedar como está.
Estos comandos crean una tabla llamada price_list en tu propia base, copiada de los productos de la tienda.
Puedes repetirlos cuando quieras para empezar de nuevo.
Aceptar el certificado del servidor
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un nombre corto para el cliente
alias db='mariadb -h db -u student -pstudent -t -e'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crear tu propia base
db "CREATE DATABASE IF NOT EXISTS student_depot"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Tirar una copia antigua
db "DROP TABLE IF EXISTS student_depot.price_list"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Copiar los productos
db "CREATE TABLE student_depot.price_list AS SELECT id, name, price, stock FROM shop.products"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Anotar cómo está ahora
db "SELECT COUNT(*) AS rows_now, MIN(price) AS cheapest, MAX(price) AS dearest FROM student_depot.price_list"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un volcado es una copia legible
La herramienta mariadb-dump pide una tabla al servidor y escribe el SQL que la reconstruye. El archivo tiene una línea CREATE TABLE y un INSERT por cada fila.
La opción --skip-extended-insert pone una fila en cada línea. --no-tablespaces hace falta porque tu cuenta quizá no puede leer los archivos de almacenamiento del servidor.
El signo > manda la salida a un archivo en vez de a la pantalla.
Copiar la tabla a un archivo
mariadb-dump -h db -u student -pstudent --skip-extended-insert --no-tablespaces student_depot price_list > price_list.sqlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Contar las líneas INSERT del archivo
grep -c "^INSERT" price_list.sqlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Leer la primera fila guardada
grep -m1 "^INSERT" price_list.sqlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Comete el error y luego repáralo
Haz ahora lo que hizo el ingeniero. Ejecuta un UPDATE sin WHERE sobre la copia.
Luego mira los precios. Después restaura el archivo. El volcado empieza cada tabla con DROP TABLE IF EXISTS, así que cargarlo sustituye la tabla dañada.
Poner todos los precios a cero
db "UPDATE student_depot.price_list SET price = 0"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ver el daño
db "SELECT COUNT(*) AS rows_now, MIN(price) AS cheapest, MAX(price) AS dearest FROM student_depot.price_list"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Restaurar desde el archivo
mariadb -h db -u student -pstudent student_depot < price_list.sqlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ver la tabla reparada
db "SELECT COUNT(*) AS rows_now, MIN(price) AS cheapest, MAX(price) AS dearest FROM student_depot.price_list"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que una copia es segura en cuanto existe el archivo. Un archivo que nunca has restaurado es solo una esperanza. Puede estar vacío o cortado. Cuenta las filas que tiene y practica una restauración sobre una copia.
Comprueba cuántas filas toca un cambio
Una copia sirve cuando todo sale mal. Mejor aún es ver el daño antes de que sea permanente.
Empieza una transacción. Ejecuta el UPDATE. Pregunta a ROW_COUNT() cuántas filas cambió. Si el número está mal, haz ROLLBACK. Si está bien, ejecútalo otra vez y haz COMMIT.
Eso es un ensayo.
Probar un cambio y deshacerlo
db "START TRANSACTION; UPDATE student_depot.price_list SET stock = stock + 5 WHERE stock < 10; SELECT ROW_COUNT() AS changed; ROLLBACK"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Contar las filas que elige el WHERE
db "SELECT COUNT(*) AS low_stock FROM student_depot.price_list WHERE stock < 10"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: un cambio seguro en cinco pasos
| Paso | Qué haces | De qué te protege |
|---|---|---|
| 1 | Volcar la tabla a un archivo | un cambio que no se puede deshacer |
| 2 | SELECT COUNT(*) con el mismo WHERE | un WHERE que coincide con demasiado |
| 3 | START TRANSACTION y ejecutar el UPDATE | un cambio que ya es permanente |
| 4 | Comparar ROW_COUNT() con el paso 2 | un número que no esperabas |
| 5 | COMMIT, o ROLLBACK y volver a mirar | terminar un cambio equivocado |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más lejos
Vuelca toda la base student_depot dejando fuera el nombre de la tabla. Cuenta sus líneas CREATE TABLE.
En un trabajo de verdad copiarías también el archivo a otro sitio y probarías la restauración en otro servidor. Una copia en el mismo lugar que los datos falla junto con ellos.