Czy mysqldump może zrzucić wyzwalacze i procedury?

10

Czy jest jakiś sposób na wykonanie mysqldump, który zapisze wszystkie wyzwalacze i procedury z określonego db?

Jakiś czas temu przeczytałem, że mysqldumprównież zapisze moje wyzwalacze, ale tak nie wygląda. Moje drugie powiązane pytanie brzmi: jak mogę sprawdzić plik SQL, jeśli istnieją wyzwalacze?

Doug
źródło

Odpowiedzi:

9

Zwykle nie oddzielam wyzwalaczy od tabel, dla których były przeznaczone. Zrzucam tak:

mysqldump -u... -p... --no-data --routines --triggers dbname > DBSchema.sql

Sprawdź obecność takich procedur i wyzwalaczy:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

Jeśli chcesz to zrobić dla wszystkich baz danych w instancji MySQL, wykonaj następujące czynności:

mysql -u... -p... -A -N -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > /tmp/dblist.txt
for DB in `cat /tmp/dblist.txt`
do
    mysqldump -u... -p... --no-data --no-create-info --routines dbname > ${DB}-routines.sql
    mysqldump -u... -p... --no-data --triggers dbname > ${DB}-schema-triggers.sql
done

W ten sposób procedury składowane przechodzą do zrzutu procedury dla bazy danych, podczas gdy schemat i wyzwalacze przechodzą do kolejnego zrzutu.

RolandoMySQLDBA
źródło
@dole Rolando ma prawo do zrzucania wyzwalaczy / procedur. Jeśli chcesz sprawdzić, czy istnieją w pliku SQL, otwórz go i wyszukaj wywołania „CREATE TRIGGER”. Jeśli w * nix,grep 'CREATE TRIGGER'
Derek Downey
@RolandoMySQLDBA, czy --triggersdomyślnie nie jest zrzucany? Jaka byłaby różnica między --no-data --routines --triggersvs --no-data --routines?
Pacerier
1
@Pacerier Zdarzały się sytuacje, w których nie chciałem wyzwalaczy i korzystałem z nich --skip-triggersprzy takich okazjach (takich jak konfigurowanie niewolników, które nie potrzebowały wyzwalaczy). Jako stałe przypomnienie sobie o możliwości pomijania opcji, zawsze używam pewnych flag w mysqldumps ( --routines, --triggers), nawet jeśli są one domyślne. To tylko osobiste preferencje. Jeśli ufasz, że ustawienie domyślne pozostanie domyślnym w zależności od wersji i nigdy nie poradzisz sobie z sytuacjami doraźnymi, to wyrażasz mysqldump w razie potrzeby, o ile wynikowy mysqldump jest odpowiedni dla Ciebie.
RolandoMySQLDBA
@RolandoMySQLDBA - Co robi -A -N?
MontyPython
Użyłem wyrażeń regularnych do dodania instrukcji wyzwalacza DROP: Zamień to: (\ / * \! 50003 CREATE * \ / \ / * \! 50017 DEFINER \ = jakiś_tekst_tutaj * \ / \ / * \! 50003 TRIGGER (. *?) ) Z tym: DROP TRIGGER / *! 50032 IF EXISTS * / $2;; \ n $ 1
AlexandruSerban