Desidero eseguire il backup solo delle viste con mysqldump.Backup di viste con Mysql Dump
È possibile?
Se sì, come?
Desidero eseguire il backup solo delle viste con mysqldump.Backup di viste con Mysql Dump
È possibile?
Se sì, come?
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';
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).
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
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'
Grazie, questo è stato molto utile. Le mie opinioni erano distribuite su più schemi di database, e questo li ha ottenuti tutti. – thoughtcrimes1984
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
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
grazie, il comando è stato utile. –