¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Una copia antes de cada cambio

Después de esta lección: Puedo hacer una copia de una tabla antes de un cambio y restaurarla si el cambio está mal.

Lección de 55 min15 comandosLaboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

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

PalabraQué significa
Copia de seguridaduna copia de datos hecha para poder recuperarlos
Volcadoun archivo de texto con el SQL que reconstruye una tabla y sus filas
Restaurarvolver a poner los datos desde una copia
Filas afectadascuántas filas tocó un cambio
Ensayoprobar 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

Comando
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

Se 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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
mariadb-dump -h db -u student -pstudent --skip-extended-insert --no-tablespaces student_depot price_list > price_list.sql

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 líneas INSERT del archivo

Comando
grep -c "^INSERT" price_list.sql

Se 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

Comando
grep -m1 "^INSERT" price_list.sql

Se 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

Comando
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

Comando
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

Comando
mariadb -h db -u student -pstudent student_depot < price_list.sql

Se 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

Comando
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

Comando
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

Comando
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

PasoQué hacesDe qué te protege
1Volcar la tabla a un archivoun cambio que no se puede deshacer
2SELECT COUNT(*) con el mismo WHEREun WHERE que coincide con demasiado
3START TRANSACTION y ejecutar el UPDATEun cambio que ya es permanente
4Comparar ROW_COUNT() con el paso 2un número que no esperabas
5COMMIT, o ROLLBACK y volver a mirarterminar 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.

Sobre este laboratorio y su código: Laboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.