如何在除了两个数据库之外备份所有MySQL数据库

3

这可能非常简单,但是我将在一个实时服务器上执行此操作,不想搞砸它。

请问有人能告诉我如何对所有数据库、程序、触发器等进行mysqldump,但排除mysql和performance_schema数据库吗?


1
https://dev59.com/g2kx5IYBdhLWcg3wA_tS - Grzegorz
3个回答

8

是的,您可以同时转储多个模式:

mysqldump --user=[USER] --password=[PASS] --host=[HOST] --databases mydb1 mydb2 mydb3 [...] --routines > dumpfile.sql

或者

mysqldump --user=[USER] --password=[p --host=[HOST] --all-databases --routines > dumpfile.sql

关于最后一个命令,如果您不想转储performance_schema(编辑:如@Barranka所述,默认情况下mysqldump不会转储它),mysql、phpMyAdmin模式等,则只需确保[USER]无法访问它们。


我喜欢不同用户的答案相互丰富的时候。 - Barranka
没错!这就是 Stack Overflow 的用途 :-) - Basile

2

如参考手册所述:

mysqldump 默认不会转储 INFORMATION_SCHEMAperformance_schema 数据库。要转储其中任何一个,请在命令行中明确指定其名称,并使用 --skip-lock-tables 选项。您还可以使用 --databases 选项来指定它们的名称。

这样就解决了您关于转储这些数据库的问题。

现在,要转储所有数据库,我认为您应该这样做:

mysqldump -h Host -u User -pPassword -A -R > very_big_dump.sql

要在不转储所有数据的情况下进行测试,您可以添加-d标志,仅转储数据库、表(和例程)定义而没有数据。
正如Basile在他的答案中提到的那样,省略转储mysql数据库的最简单方法是使用没有访问权限的用户调用mysqldump。因此,要点是:使用或创建仅对您打算转储的数据库具有访问权限的用户。

正如你所提到的,INFORMATION_SCHEMA或performance_schema不会默认被转储,但mysql会被转储。 - Basile

2

mysqldump没有过滤数据库列表的选项,但你可以运行两个命令:

# DATABASES=$(mysql -N -B -e "SHOW DATABASES" | grep -Ev '(mysql|performance_schema)')
# mysqldump -B $DATABASES

你需要添加 -R 标志来包含转储中的存储过程(我是吃了亏才学到的:S) - Barranka
@Barranka 你可以添加更多内容,但是OP似乎在询问如何跳过某些数据库。 - Eugene Yarmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接