Dapatkah mysqldump dump memicu dan prosedur?

10

Apakah ada cara membuat mysqldump yang akan menyimpan semua pemicu dan prosedur dari db yang ditentukan?

Beberapa waktu lalu saya membaca bahwa mysqldumpitu juga akan menyelamatkan pemicu saya, tetapi sepertinya tidak. Pertanyaan saya yang terkait kedua adalah bagaimana saya bisa memeriksa dalam file sql jika ada pemicu?

membagikan doug
sumber

Jawaban:

9

Saya biasanya tidak memisahkan pemicu dari tabel yang seharusnya. Saya dump seperti ini:

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

Periksa keberadaan rutin dan pemicu seperti ini:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

Jika Anda ingin menyelesaikan ini untuk semua DB di MySQL Instance, lakukan ini:

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

Dengan begitu, prosedur tersimpan disimpan dalam dump rutin untuk DB, sementara skema dan pemicu masuk dump lain.

RolandoMySQLDBA
sumber
@dole Rolando tentang cara membuang pemicu / prosedur. Jika Anda ingin melihat apakah ada dalam file sql, buka dan cari panggilan 'CREATE TRIGGER'. Jika dalam * nix,grep 'CREATE TRIGGER'
Derek Downey
@RolandoMySQLDBA, Apakah tidak --triggersdibuang secara default? Apa perbedaan antara --no-data --routines --triggersvs --no-data --routines?
Pacerier
1
@ Paser Ada situasi di mana saya tidak ingin pemicu dan saya akan gunakan --skip-triggerspada kesempatan seperti itu (seperti menyiapkan budak yang tidak membutuhkan pemicu). Sebagai pengingat untuk diri saya sendiri tentang kemungkinan melewatkan opsi, saya selalu menggunakan flag tertentu di mysqldumps ( --routines, --triggers) walaupun itu default. Jadi, itu hanya preferensi pribadi. Jika Anda percaya bahwa pengaturan default akan tetap default dari versi ke versi dan tidak pernah berurusan dengan situasi adhoc, maka Anda mengekspresikan mysqldumps sesuai kebutuhan selama mysqldump yang dihasilkan benar untuk Anda.
RolandoMySQLDBA
@RandooMySQLDBA - Apa yang harus dilakukan -A -N
MontyPython
Saya telah menggunakan ekspresi reguler untuk menambahkan pernyataan pemicu DROP: Ganti ini: (\ / * \! 50003 BUAT * \ / \ / * \! 50017 DEFINER \ = some_text_here * \ / \ / * \! 50003 TRIGGER (. *?) ) Dengan ini: DROP TRIGGER / *! 50032 JIKA ADA * / $2;; \ n $ 1
AlexandruSerban