Chcę utworzyć kopię zapasową tylko widoków za pomocą mysqldump.Tworzenie kopii zapasowych widoków przy użyciu Mysql Dump
Czy to możliwe?
Jeśli tak, w jaki sposób?
Chcę utworzyć kopię zapasową tylko widoków za pomocą mysqldump.Tworzenie kopii zapasowych widoków przy użyciu Mysql Dump
Czy to możliwe?
Jeśli tak, w jaki sposób?
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';
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).
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
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'
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
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
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
dzięki komenda była przydatna. –