mysqldump可以转储触发器和程序吗?


10

有没有办法制作一个mysqldump来保存指定数据库中的所有触发器和过程?

不久前,我读到它mysqldump也可以保存触发器,但是看起来不一样。我的第二个相关问题是,如果存在触发器,如何才能检入sql文件?

Answers:


9

我通常不将触发器与它们原本打算的表分开。我这样转储:

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

检查是否存在例程和触发器,如下所示:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

如果要对MySQL实例中的所有数据库执行此操作,请执行以下操作:

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

这样,存储过程进入数据库的例程转储,而架构和触发器进入另一个转储。


@dole Rolando对如何转储触发器/过程的权利。如果要查看它们是否存在于sql文件中,请打开它并搜索“ CREATE TRIGGER”调用。如果在* nix中,grep 'CREATE TRIGGER'
德里克·唐尼

@RolandoMySQLDBA,--triggers默认情况下不转储吗?--no-data --routines --triggersvs 之间有什么区别--no-data --routines
Pacerier,2015年

1
@Pacerier在某些情况下,我不需要触发器,而我会--skip-triggers在这种情况下使用(例如,设置不需要触发器的从属)。为了不断提醒自己可能跳过选项,我总是在mysqldumps(--routines--triggers)中使用某些标志,即使它们是默认标志也是如此。因此,这只是个人喜好。如果您相信默认设置会在各个版本之间保持默认设置,并且永远不会处理特殊情况,那么只要生成的mysqldump对您而言正确,您就可以根据需要表达mysqldumps。
RolandoMySQLDBA 2015年

@RolandoMySQLDBA--A -N做什么?
MontyPython

我已使用正则表达式在DROP触发器语句之前添加:替换为:(\ / * \!50003 CREATE * \ / \ / * \!50017 DEFINER \ = some_text_here * \ / \ / * \!50003 TRIGGER(。*?) )这样做:DROP TRIGGER / *!50032如果存在* / $2;; \ n $ 1
AlexandruSerban
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.