mysqldump可以忽略数据库进行备份的任何选项吗?


23

我们的服务器中有40个数据库。

我们希望使用mysqldump备份36个数据库。我如何在mysqldump命令中忽略其余4个数据库?mysqldump是否有任何选项可以忽略要在MySQL中备份的数据库?

我知道一般的mysqldump命令,但是它很长。我只想忽略4个数据库,而需要进行剩余的dbs备份。

Answers:


16

早在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

试试看 !!!


无需排除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
卢卡

15

使用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

一个应该加`| 粘贴-sd“” -`后grep,为了从多输出传递给通过的空间中,这是由需要分隔每个数据库名称的一个单行mysqldump。因此命令将是candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

我认为这是不可能的,但是您可以尝试这些解决方案,您必须输入要转储的所有数据库的名称。

mysqldump -u root -password --databases db1 db2 db3 ... db36 > mydb_dump.sql

让我知道解决方案是否有帮助。


1
我知道这个命令。但是它很长。我想忽略4个数据库,需要进行剩余的dbs备份。
ashuthosh

3

即使在这里有这么多出色的答案,所以这篇文章只是增加了一个选择。通过在脚本中的以下两行,您可以使服务器的所有数据库备份都忽略某些数据库。

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

1
感谢您的加入,sys因为它是MySQL 5.7的一部分
RolandoMySQLDBA

谢谢@RolandoMySQLDBA,我总是会从您的出色帖子/博客中获得帮助...再次感谢您的夸奖...
Zafar Malik


1

许多人一直希望mysqldump忽略数据库。

您是否相信该选项现在存在?不,不在mysqldump中。

Oracle(Yuck,toowee,仍然没有放弃)使用DataPump(expdb impdp)来转储Oracle数据库。从Oracle家族中的MySQL 5.7开始(仍然很痛苦),新的备份实用程序称为mysqlpump,它带有--exclude-databases和其他简洁的选项。像其较早的继兄弟datapump一样mysqlpump还具有并行性,可帮助加快转储速度并分担工作。目前,我还没有从事这项工作,但是看起来很有希望。当我深入研究mysqlpump时,我可能会发现它带来的外观和感觉与Oracle的datapump相同

如果MySQL Parallel Universe中有任何关于它的故事,请在此处发布。


0

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中)


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.