2009-11-01 18 views

risposta

2

Per backup, presumo che intendiate solo la definizione senza i dati.

Sembra che in questo momento mysqldump non distingua tra VIEW e TABLE, quindi forse la cosa migliore da fare è specificare i VIEW esplicitamente sulla riga di comando su mysqldump o calcolare questa lista dinamicamente prima di mysqldump e quindi passare giù come prima.

È possibile ottenere tutti i punti di vista in un database specifico utilizzando questa query:

SHOW FULL TABLES WHERE table_type='view';

+0

grazie, il comando è stato utile. –

14

NOTA: Questa risposta da Ken spostato da modificare suggerito di propria risposta.

Ecco un esempio completo riga di comando utilizzando una variante di quanto sopra

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 

Questo estrae tutti i nomi delle viste tramite una query al database INFORMATION_SCHEMA, quindi tubi loro di xargs di formulare un comando mysqldump. --skip-column-names e --batch sono necessari per rendere l'output xargs amichevole. Questa riga di comando potrebbe essere troppo lunga se si hanno molte viste, nel qual caso si vorrebbe aggiungere una sorta di filtro aggiuntivo alla selezione (ad esempio, cercare tutte le viste che iniziano con un determinato carattere).

11

ho modificato Andomar's excellent answer per consentire al database (e altre impostazioni) per essere specificato solo una volta:

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

risparmio questo come mysql-dump-views.sh e chiamare tramite:

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

Backup vista su più database è facile semplicemente usando 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

Grazie, questo è stato molto utile. Le mie opinioni erano distribuite su più schemi di database, e questo li ha ottenuti tutti. – thoughtcrimes1984

-1

Grazie per questo - molto utile.

Un incidente di percorso anche se - forse ho un insieme leggermente contorta di punti di vista che fanno riferimento altre viste, ecc:

ho trovato che l'utente "definitore" ha bisogno di esistere e avere i permessi giusti sul schema di destinazione, in caso contrario mysql non genererà le viste che fanno riferimento ad altre viste poiché le definizioni delle cose sono insufficienti.

Nella generato: DEFINER

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

-> Assicuriamo <user> @<host> è ok sulla istanza di destinazione, o sostituire questa stringa con una utente che lo fa.

Grazie Thorstein

0

avrei attenersi il più possibile la produzione di mysqldump come invitati alla OP, poiché include un gran numero di informazioni sulla vista che non può essere ricostruito con una semplice query da INFORMATION_SCHEMA.

Questo è come mi creo una vista script di distribuzione dal mio database di origine:

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