Gibt es eine Option für mysqldump, um Datenbanken für die Sicherung zu ignorieren?

23

Wir haben 40 Datenbanken auf unserem Server.

Wir wollen 36 Datenbanken mit mysqldump sichern. Wie kann ich die verbleibenden 4 Datenbanken im Befehl mysqldump ignorieren? Gibt es eine Option für mysqldump, um Datenbanken für die Sicherung in MySQL zu ignorieren?

Ich kenne den allgemeinen mysqldump-Befehl, aber er ist sehr langwierig. Ich möchte nur 4 Datenbanken ignorieren und muss verbleibende DBS-Sicherung nehmen.

Ashuthosh
quelle

Antworten:

16

Zurück am 16.12.2011 habe ich die Frage beantwortet Wie können Sie eine bestimmte Tabelle (n) mysqldump?

Ich habe alle Tabellen ohne bestimmte Tabellennamen gesammelt.

Nach den gleichen Grundsätzen könnten Sie alle Datenbanknamen aus der Metadatentabelle erfassen information_schema.schemata, die mysqldump enthalten soll, eine Abfrage erstellen, um diese Liste zurückzugeben, und dann diese Liste von Datenbanken verwenden, um den Befehl mysqldump zu formulieren.

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

Alles, was Sie tun müssen, ist die Datenbanken, in die mysqldump'd nicht eingefügt werden soll DATABASES_TO_EXCLUDE

Versuche es !!!

RolandoMySQLDBA
quelle
Es muss nicht ausgeschlossen werden, dass information_schemaes sowieso nicht abgeladen wird. 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
Luka
15

Verwenden Sie grep, um nicht gewünschte Datenbanken auszuschließen:

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates 

Vom Blick auf /programming/19354870/bash-command-line-and-input-limit scheint es , wie Sie lange Linien behandeln werden können. Ansonsten kannst du immer

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done
Kritisch
quelle
Man sollte `| hinzufügen Fügen Sie -sd "" -` nach dem grepein, um von der mehrzeiligen Ausgabe in eine einzelne Zeile zu wechseln. Dabei wird jeder Datenbankname durch ein Leerzeichen getrennt, das von benötigt wird mysqldump. Der Befehl lautet alsocandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.
8

Ich denke nicht, dass es möglich ist, aber Sie können diese Lösung ausprobieren, bei der Sie die Namen aller Datenbanken eingeben müssen, die Sie sichern möchten.

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

Lassen Sie mich wissen, ob die Lösung hilft.

Cybermatatu
quelle
1
Ich kenne diesen Befehl, aber es ist sehr langwierig. Ich möchte 4 Datenbanken ignorieren und muss verbleibende DBS-Backup nehmen.
Ashuthosh
3

Auch hier so viele hervorragende Antworten, so ist dieser Beitrag nur eine weitere Auswahl hinzuzufügen. Mit weniger als 2 Zeilen im Skript können Sie die Sicherung aller DBs auf Ihren Servern durchführen, wobei einige DBs ignoriert werden.

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
Zafar Malik
quelle
1
Vielen Dank für einschließlich sysdenn das ist Teil von MySQL 5.7
RolandoMySQLDBA
danke @RolandoMySQLDBA, ich bekomme immer Hilfe von Ihren ausgezeichneten Posts / Blogs ... Nochmals vielen Dank für Ihr Kompliment ...
Zafar Malik
1

Viele wollten schon immer, dass mysqldump Datenbanken ignoriert.

Würden Sie glauben, dass diese Option jetzt existiert? Nein, nicht in mysqldump.

Oracle (Yuck, toowee, noch immer nicht von der Zunge runter ) hat DataPump (expdb impdp) , um Oracle-Datenbanken zu sichern . Seit MySQL 5.7 in der Oracle-Familie (das immer noch weh tut) wird das neue Sicherungsdienstprogramm aufgerufen Probleme bereitet mysqlpump und enthält --exclude-database und andere nützliche Optionen. Wie sein älterer Stiefbruder Datenpumpe , mysqlpump verfügt auch über Parallelität zu helfen beschleunigen Deponien und dividieren Arbeit . Zu diesem Zeitpunkt habe ich mich noch nicht in den Job eingearbeitet, aber es sieht sehr vielversprechend aus. Wenn ich tief in mysqlpump eintauche, stelle ich möglicherweise fest, dass es dasselbe Erscheinungsbild wie die Oracle- Datenpumpe aufweist .

Wenn es jemanden im MySQL Parallel Universe gibt, der Geschichten darüber hat, posten Sie diese bitte hier.

RolandoMySQLDBA
quelle
0

Die Antwort von Rolando ist ziemlich gut, aber ich wollte ein Skript, das projektübergreifend wiederverwendet werden kann. Also nahm ich sein Skript und änderte es so, dass Sie Dinge tun können wie:

$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql

Hier ist das geänderte Skript:

#!/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}

(Ich hoffe immer noch, dass eine --ignore-databaseOption zu einer zukünftigen Version von mysqldump hinzugefügt wird)

redgeoff
quelle
0

Seit MySQL 5.7.8 können Sie mysqlpump(was NICHT dasselbe ist mysqldump) wie folgt verwenden:

mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql

Einfach austauschen db1,db2,db3,db4 Sie einfach die vier Datenbanken, die Sie ausschließen möchten.

Quelle: MySQL Server Blog

Leo Galleguillos
quelle