¿Cómo puedo hacer una copia de seguridad de una estructura de tabla pero NO sus datos en MySQL?

20

Estoy usando MySQL Administrator para hacer la copia de seguridad de mi base de datos. Puedo hacer una copia de seguridad de toda la base de datos con todas sus tablas. Hay algunas tablas cuyo tamaño es muy grande, así que me pregunto si solo podría hacer una copia de seguridad de la estructura de las tablas (solo sus elementos) pero no sus datos.

Andrew Schulman
fuente

Respuestas:

40

Use el --no-datainterruptor con mysqldump para decirle que no descargue los datos, solo la estructura de la tabla.

Esto generará la instrucción CREATE TABLE para las tablas.

Algo como esto

mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql

Para apuntar a tablas específicas, introdúzcalas después del nombre de la base de datos.

mysqldump --no-data -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_no-data

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

LukeR
fuente
+1 parece correcto.
David Pashley
Muchas gracias LukeR. Podría arreglármelas con eso. En el momento de escribir, ni siquiera sabía nada sobre mysqldump, pero podía resolver el problema con el interruptor --no-data. Luego también encontré en MySQL Administrator el "CREAR SCRIPT" de esa tabla para poder resolver este problema también con esta alternativa.
3

como dijo LukeR, la opción --no-data para mysqldump hará lo que quieras.

Para agregar a eso, aquí hay un script de copia de seguridad que escribí que volca todas las bases de datos mysql en archivos de texto sin formato, y crea archivos de volcado separados para el esquema y los datos de la tabla de cada base de datos (es bastante común querer restaurar o crear las tablas en otro servidor mysql SIN los datos, y eso es mucho más fácil de hacer cuando ya tiene un archivo pequeño con solo los comandos CREATE TABLE / CREATE INDEX, etc.)

#! / bin / bash

# backup-mysql.sh
# #
# Craig Sanders <[email protected]>
# este script está en el dominio público. Haz lo que quieras con eso.

MYUSER = "NOMBRE DE USUARIO"
MYPWD = "PASSWD"

ARGS = "- transacción única - registros de descarga - inserción completa"

BASES DE DATOS = $ (mysql -D mysql --skip-column-names -B -e 'mostrar bases de datos;' | egrep -v 'information_schema');


BACKUPDIR = / var / backups / mysql

AÑO = $ (fecha + "% Y")
MES = $ (fecha + "% m")
DIA = $ (fecha + "% d")

FECHA = "$ AÑO- $ MES / $ AÑO- $ MES- $ DÍA"

mkdir -p $ BACKUPDIR / $ DATE
cd $ BACKUPDIR / $ DATE

para i en $ BASES DE DATOS; hacer
  echo -n "copia de seguridad de $ i: esquema ..."
  mysqldump $ ARGS --no-data -u $ MYUSER -p $ MYPWD $ i> $ i.schema.sql

  echo -n "datos ..."
  mysqldump $ ARGS --skip-opt --no-create-db --no-create-info -u $ MYUSER -p $ MYPWD $ i> $ i.data.sql

  echo -n "comprimiendo ..."
  gzip -9fq $ i.schema.sql $ i.data.sql
  echo "hecho".
hecho

# eliminar archivos de respaldo de más de 30 días
OLD = $ (find $ BACKUPDIR -type d -mtime +30)
si [-n "$ VIEJO"]; luego
        echo borrando viejos archivos de respaldo: $ OLD
        echo $ ANTIGUO | xargs rm -rfv
fi
cas
fuente
Muchas gracias Craig por tu respuesta! Acabo de recoger la respuesta de LukeR como fue primero. Gracias por el guión, es una buena referencia.
¿Puedo sugerir agregar --routinesal script de esquema?
Jonathan
0

También puede hacerlo manualmente a través de la mysqlinterfaz de línea de comandos haciendo DESCRIBE <tablename>y copiando y pegando los resultados.

madriguera
fuente
DESCRIBE no te dará algo que puedas copiar y pegar. MOSTRAR CREAR TABLA will.
David Pashley
no es un tugurio de lo que debería ser la declaración CREATE, pero muestra los tipos y las relaciones de columna
Warren