2009-11-01 3 views

Antwort

2

Durch Backup nehme ich an, dass Sie nur die Definition ohne die Daten meinen.

Es scheint, dass gerade jetzt mysqldump nicht zwischen VIEWs und TABLEs unterscheidet, also ist es vielleicht das Beste, die VIEWs entweder explizit auf der Kommandozeile zu mysqldump anzugeben oder diese Liste dynamisch vor mysqldump zu finden und dann zu übergeben es ist wie vorher.

Sie können alle Ansichten in einer bestimmten Datenbank mit dieser Abfrage erhalten:

SHOW FULL TABLES WHERE table_type='view';

+0

Dank, war der Befehl sehr nützlich. –

14

HINWEIS: Diese Antwort von Ken aus vorgeschlagen bearbeiten bewegt Antwort zu besitzen.

hier ist eine vollständige Befehlszeile Beispiel eine Variante des oben

mit
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 

Das extrahiert alle der Ansicht Namen über eine Anfrage an die Datenbank INFORMATION_SCHEMA, dann Rohre, sie zu xargs einen mysqldump Befehl zu formulieren. - skip-column-names und --batch werden benötigt, um die Ausgabe von xargs freundlich zu gestalten. Diese Befehlszeile wird möglicherweise zu lang, wenn Sie viele Ansichten haben. In diesem Fall sollten Sie der Auswahl einen zusätzlichen Filter hinzufügen (z. B. nach allen Ansichten suchen, die mit einem bestimmten Zeichen beginnen).

11

I modifizierte Andomar's excellent answer die Datenbank (und andere Einstellungen), damit nur einmal angegeben werden:

#!/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 $* 

ich spare dies als mysql-dump-views.sh und nennen es über

:

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

Sichern Blick auf mehrere Datenbanken sind einfach durch Verwendung von 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

Danke, das war sehr hilfreich. Meine Ansichten wurden auf mehrere Datenbankschemas verteilt, und das hat sie alle bekommen. – thoughtcrimes1984

-1

Danke dafür - sehr nützlich.

Ein Schluckauf obwohl - vielleicht, wie ich einen etwas gewundenen Satz von Ansichten, die andere Ansichten Referenz etc:

ich, dass die „definer“ Benutzer und haben auf dem Zielschema die richtigen Berechtigungen muss existieren gefunden, sonst mysql erzeugt keine Sichten, die auf andere Sichten verweisen, da die Definitionen nicht ausreichen.

Im generierten:

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

-> gewährleisten <user> @<host> auf Ihrer Zielinstanz in Ordnung ist, oder diese Zeichenfolge ersetzen mit einem Benutzer, der das tut.

Dank Thor

0

ich so nah wie möglich an den Ausgang des mysqldump bleiben würde wie die OP gefragt, da es eine ganze Reihe von Informationen über die Ansicht enthält, die mit einer einfachen Abfrage rekonstruiert werden können nicht von der INFORMATION_SCHEMA.

Dies ist, wie ich ein Deployment View Skript aus meiner Quelldatenbank zu erstellen:

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