Answers:
早在2011年12月16日,我回答了您如何mysqldump特定表?
我收集了所有表,但不包括一组特定的表名。
使用相同的原理,您可能已经从information_schema.schemata
想要mysqldump 的元数据表中收集了所有数据库名称,创建了一个查询以返回该列表,然后使用该数据库列表来制定mysqldump命令。
DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -ANe"${SQLSTMT}"`
do
MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql
您需要做的就是将不需要mysqldump的数据库放入 DATABASES_TO_EXCLUDE
试试看 !!!
使用grep排除不需要的数据库:
candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates
通过查看/programming/19354870/bash-command-line-and-input-limit,看来您将能够处理长行。否则你总是可以
candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
mysqldump $candidate
done
grep
,为了从多输出传递给通过的空间中,这是由需要分隔每个数据库名称的一个单行mysqldump
。因此命令将是candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
即使在这里有这么多出色的答案,所以这篇文章只是增加了一个选择。通过在脚本中的以下两行,您可以使服务器的所有数据库备份都忽略某些数据库。
DB_LIST=`mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"`
mysqldump -R -B $DB_LIST > BACKUPNAME.sql
sys
因为它是MySQL 5.7的一部分
许多人一直希望mysqldump忽略数据库。
您是否相信该选项现在存在?不,不在mysqldump中。
Oracle(Yuck,toowee,仍然没有放弃)使用DataPump(expdb impdp)来转储Oracle数据库。从Oracle家族中的MySQL 5.7开始(仍然很痛苦),新的备份实用程序称为mysqlpump,它带有--exclude-databases和其他简洁的选项。像其较早的继兄弟datapump一样,mysqlpump还具有并行性,可帮助加快转储速度并分担工作。目前,我还没有从事这项工作,但是看起来很有希望。当我深入研究mysqlpump时,我可能会发现它带来的外观和感觉与Oracle的datapump相同。
如果MySQL Parallel Universe中有任何关于它的故事,请在此处发布。
Rolando的答案非常好,但是我想要一个可以在项目之间重用的脚本。因此,我采用了他的脚本并对其进行了修改,以便您可以执行以下操作:
$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql
这是修改后的脚本:
#!/usr/bin/env bash
# This is an adapted version of Rolando's awesome script at
# /dba//a/35104/94046
# Usage: mysqldump-ignore-databases.sh username password dbs-to-exclude mysqldump-options
# e.g.
# mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema'
# '--skip-lock-tables' > dbs.sql
#
# mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'mysql' '-h example.com' '-h example.com' > dbs.sql
USERNAME=$1
PASSWORD=$2
DATABASES_TO_EXCLUDE=$3
MYSQLDUMP_OPTIONS=$4
MYSQL_OPTIONS=$5
EXCLUSION_LIST=""
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
if [ "${EXCLUSION_LIST}" != "" ]
then
EXCLUSION_LIST="${EXCLUSION_LIST},"
fi
EXCLUSION_LIST="${EXCLUSION_LIST}'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u${USERNAME} -p${PASSWORD} ${MYSQL_OPTIONS} -ANe"${SQLSTMT}"`
do
MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
mysqldump -u${USERNAME} -p${PASSWORD} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}
(我仍然希望将--ignore-database
选项添加到将来版本的mysqldump中)
从MySQL 5.7.8开始,您可以按以下方式使用mysqlpump
(与并不相同mysqldump
):
mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql
只需更换 db1,db2,db3,db4
为要排除的四个数据库即可。
资料来源:MySQL服务器博客
information_schema
它不会被丢弃。mysqldump does not dump the INFORMATION_SCHEMA or performance_schema database by default. To dump either of these, name it explicitly on the command line and also use the --skip-lock-tables option. You can also name them with the --databases option. Before MySQL 5.5 mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line.
dev.mysql.com/doc/refman/5.5/en/mysqldump.html