有没有一种方法可以转储除系统数据库以外的所有mysql数据库?

5

我使用 mysqldump 命令将所有数据库自动转储到文本文件,并将这个转储备份保存下来。我使用 --all-databases 选项来转储我的数据库,但它也会转储系统数据库(information_schema、phpmyadmin 等),而我并不需要它们。

有没有一种方法可以使用 mysqldump 命令转储所有数据库,而无需在命令行中显式命名它们(这样我就不必每次创建新数据库时修改备份脚本),但同时忽略所有系统数据库呢?

3个回答

3

类似的方法,排除您不想备份的数据库:

user=''
pass=''
# Use a | as a separator
exclude_dbs='information_schema|mysql|performance_schema'

mysqldump -u "$user" -p"$pass" --databases $(mysql -u $user -p$pass -rs -e 'SHOW DATABASES;' | tail -n+1 | grep -v -E '^('$exclude_dbs')$' | tr '\n' ' ') > databases.sql

2

root 用户身份登录,并在命令行中输入以下命令:

for DB in $(mysql -Bse 'show databases' | grep -v information_schema); do \
   mysqldump $DB > "/$DB.sql"; \
done

2
您可以编写如下的bash脚本。在导出数据库之前,它会检查数据库的名称。
#!/bin/sh
DATABASES="$(/lighttpd/local/bin/mysql --user=user --password=pass -Bse 'show databases')"

for db in ${DATABASES[@]}
do
if [ $db == "information_schema" ]
then
continue
fi
echo ${db}-$(date +%m-%d-%y).sql.bz2 is being saved in /backup/mysql
mysqldump --user=user --password=pass $db --single-transaction -R | bzip2 -c > ${db}-$(date +%m-%d-%y).sql.bz2
done

1
好的,但这意味着我必须在脚本中手动列出系统数据库。有没有一种方法可以通过编程方式判断数据库是由系统还是用户创建的? - Tom
据我所知没有。我的MySQL数据库只有information_schema和mysql作为系统数据库。 - John Coates
如果您想将所有转储文件重新组合成一个大的转储文件,您可能希望将每个文件连接在一起,最后再进行bzip压缩。 - Ross

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