2009-11-01 12 views

Respuesta

2

Por copia de seguridad, supongo que solo quiere decir la definición sin los datos.

Parece que en este momento mysqldump no distingue entre VIEW y TABLE, así que quizás lo mejor que se puede hacer es especificar las VIEW explícitamente en la línea de comando a mysqldump o resolver esta lista dinámicamente antes de mysqldump y luego pasar hacia abajo como antes.

Usted puede obtener todos los puntos de vista en una base de datos específica usando esta consulta:

SHOW FULL TABLES WHERE table_type='view';

+0

gracias, el comando fue muy útil. –

14

NOTA: Esta respuesta de Ken trasladó de edición sugerido propia respuesta.

aquí es un ejemplo completo de línea de comandos usando una variante de la anterior

mysql -u username INFORMATION_SCHEMA 
    --skip-column-names --batch 
    -e "select table_name from tables where table_type = 'VIEW' 
     and table_schema = 'database'" 
    | xargs mysqldump -u username database 
    > views.sql 

Esto extrae todas las nombres de vista a través de una consulta a la base de datos INFORMATION_SCHEMA, a continuación, los tubos a xargs para formular un comando mysqldump. --skip-column-names y --batch son necesarios para que la salida xargs sea amigable. Esta línea de comando puede ser demasiado larga si tienes muchas vistas, en cuyo caso querrás agregar algún tipo de filtro adicional a la selección (por ejemplo, busca todas las vistas que comiencen con un personaje dado).

11

he modificado Andomar's excellent answer para permitir que la base de datos (y otros ajustes) que sólo se especifica una vez:

#!/bin/bash -e 
mysql --skip-column-names --batch -e \ 
"select table_name from information_schema.views \ 
where table_schema = database()" $* | 
xargs --max-args 1 mysqldump $* 

puedo guardar esto como mysql-dump-views.sh y llamo a través de:

$ mysql-dump-views.sh -u user -ppassword databasename >dumpfile.sql 
4

Copia de seguridad de puntos de vista sobre las bases de datos múltiples son fáciles usando simplemente information_schema:

mysql --skip-column-names --batch -e 'select CONCAT("DROP TABLE IF EXISTS ", TABLE_SCHEMA, ".", TABLE_NAME, "; CREATE OR REPLACE VIEW ", TABLE_SCHEMA, ".", TABLE_NAME, " AS ", VIEW_DEFINITION, "; ") table_name from information_schema.views' 
+0

Gracias, esto fue muy útil. Mis puntos de vista se distribuyeron en varios esquemas de bases de datos, y esto los obtuvo a todos. – thoughtcrimes1984

-1

Gracias por esto, muy útil.

Un hipo aunque - tal vez como tengo un conjunto ligeramente complicado de puntos de vista que hacen referencia a otros puntos de vista, etc:

me encontré con que el usuario "definidor" tiene que existir y tener los permisos correctos en el esquema de destino, de lo contrario mysql no generará las vistas que hacen referencia a otras vistas ya que las definiciones son insuficientes.

En la generada: DEFINER

/* 50013 = DEFINER <user> @<host> SEGURIDAD SQL */

-> asegurar <user> @<host> está bien en su instancia de destino, o reemplazar esta cadena con una usuario que lo hace

Gracias Thorstein

0

me gustaría seguir lo más cerca posible a la salida de mysqldump como el PO pidió, ya que incluye una gran cantidad de información acerca de la opinión de que no puede ser reconstruido con una simple consulta de INFORMATION_SCHEMA.

Éste es cómo crear una vista script de implementación de mi base de datos fuente:

SOURCEDB="my_source_db" 
mysql $SOURCEDB --skip-column-names -B -e \ 
"show full tables where table_type = 'view'" \ 
| awk '{print $1}' \ 
| xargs -I {} mysqldump $SOURCEDB {} > views.sql 
Cuestiones relacionadas