2009-11-01 18 views

Odpowiedz

2

Z kopii zapasowej zakładam, że masz na myśli tylko definicję bez danych.

Wygląda na to, że w tej chwili mysqldump nie rozróżnia VIEW i TABLE, więc może najlepiej jest wybrać VIEWs jawnie w wierszu poleceń do mysqldump lub wymyślić tę listę dynamicznie przed mysqldump, a następnie przekazać to jak poprzednio.

można uzyskać wszystkie widoki w konkretnej bazy danych przy użyciu tej kwerendy:

SHOW FULL TABLES WHERE table_type='view';

+0

dzięki komenda była przydatna. –

14

UWAGA: Ta odpowiedź od Ken przeniesiony z sugerowanym edycji własnych odpowiedzi.

oto pełny przykład wiersza poleceń za pomocą wariant powyższej

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 

ten wydobywa wszystkie nazwy widoku poprzez zapytania do bazy danych information_schema, następnie rur im xargs formułować polecenia mysqldump. Nazwy -skip-column-i -batch są potrzebne, aby wyjście xargs było przyjazne. Ta linia poleceń może być zbyt długa, jeśli masz dużo widoków - w takim przypadku warto dodać do filtru dodatkowy filtr (np. Wyszukać wszystkie widoki zaczynające się od danego znaku).

11

I zmodyfikowane Andomar's excellent answer aby umożliwić bazy danych (i innych ustawień) należy określić tylko raz:

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

zapisać to jako mysql-dump-views.sh i nazywają to poprzez:

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

kopii zapasowej widoki wiele baz danych jest proste, wystarczy użyć informacji:

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

Dzięki, to było bardzo pomocne. Moje widoki zostały rozłożone na wiele schematów bazy danych, a to dostało je wszystkie. – thoughtcrimes1984

-1

Dziękuję za to - bardzo przydatne.

Jeden czkawka choć - być może jak mam lekko zwichrowanych zestaw poglądów, które odwołują się inne poglądy itp:

okazało się, że „definiujący” użytkownik musi istnieć i mieć odpowiednie uprawnienia na schemacie docelowej inaczej mysql nie wygeneruje widoków, które odwołują się do innych widoków, ponieważ definicje rzeczy są niewystarczające.

w wygenerowanym: Definer

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

-> upewnić <user> @<host> jest ok, na przykład docelowym lub zastąpić ten ciąg z użytkownik, który to robi.

Dzięki Thorstein

0

będę trzymać jak najbliżej do wyjścia mysqldump jak PO poprosił, ponieważ zawiera mnóstwo informacji na temat widoku, które nie mogą być odtworzone za pomocą prostego zapytania z INFORMATION_SCHEMA.

ten sposób utworzyć widok z mojego skryptu wdrażania źródłowej bazy danych:

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 
Powiązane problemy