Czy jest jakaś opcja ignorowania przez mysqldump baz danych w celu tworzenia kopii zapasowych?

23

Na naszym serwerze mamy 40 baz danych.

Chcemy wykonać kopię zapasową 36 baz danych przy użyciu mysqldump. Jak mogę zignorować pozostałe 4 bazy danych w poleceniu mysqldump? Czy jest jakaś opcja ignorowania baz danych MySQL w MySQL?

Znam ogólne polecenie mysqldump, ale jest ono bardzo długie. Chcę zignorować tylko 4 bazy danych i muszę wykonać pozostałą kopię zapasową DBS.

Ashuthosh
źródło

Odpowiedzi:

16

Wracając 16 grudnia 2011 roku, odpowiedziałem na pytanie W jaki sposób mysqldump określonych tabel (y)?

Zebrałem wszystkie tabele, nie zawierające określonego zestawu nazw tabel.

Korzystając z tych samych zasad, możesz zebrać wszystkie nazwy baz danych z tabeli metadanych information_schema.schemata, które chcesz mysqldump'd, utworzyć zapytanie w celu zwrócenia tej listy, a następnie użyć tej listy baz danych do sformułowania polecenia 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

Wszystko, co musisz zrobić, to umieścić bazy danych, w których nie chcesz mysqldump'd DATABASES_TO_EXCLUDE

Spróbuj !!!

RolandoMySQLDBA
źródło
Nie trzeba wykluczać, information_schemaże i tak nie zostanie zrzucony. 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

Użyj grep, aby wykluczyć bazy danych, których nie chcesz:

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

Patrząc na /programming/19354870/bash-command-line-and-input-limit wydaje się, że będziesz w stanie obsłużyć długie linie. W przeciwnym razie zawsze możesz

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done
srkrytyczny
źródło
Należy dodać `| wklej -sd "" -` po grep, aby przejść z wyjścia wielowierszowego do pojedynczego wiersza z każdą nazwą bazy danych oddzieloną spacją, która jest wymagana przez mysqldump. Tak więc polecenie będziecandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.
8

Nie sądzę, aby było to możliwe, ale możesz wypróbować te rozwiązania, które będziesz musiał wpisać nazwy wszystkich baz danych, które chcesz zrzucić.

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

Daj mi znać, jeśli rozwiązanie pomoże.

Cybermatatu
źródło
1
Znam to polecenie. Ale to jest bardzo długie. Chcę zignorować 4 bazy danych i muszę zrobić pozostałą kopię zapasową DBS.
ashuthosh
3

Nawet tutaj jest tak wiele doskonałych odpowiedzi, więc ten post to tylko jeden dodatkowy wybór. Poniżej 2 wierszy skryptu możesz zabrać swoje serwery z kopii zapasowej DB, ignorując trochę DB.

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
źródło
1
Dziękujemy za uwzględnienie, sysponieważ jest to część MySQL 5.7
RolandoMySQLDBA
dzięki @RolandoMySQLDBA, zawsze otrzymuję pomoc od twoich doskonałych postów / blogów ... jeszcze raz dziękuję za komplement ...
Zafar Malik
1

Wiele osób zawsze chciało, aby mysqldump ignorował bazy danych.

Czy uważasz, że ta opcja istnieje teraz? Nie, nie w mysqldump.

Oracle (Fuj, toowee, wciąż nie zjeżdża z języka) ma DataPump (expdb impdp) do zrzucania baz danych Oracle. Ponieważ MySQL 5.7 w rodzinie Oracle (wciąż boli), nowy program narzędziowy do tworzenia kopii zapasowych nazywa się mysqlpump , który zawiera --exclude-databases i inne fajne opcje. Podobnie jak jego starsza brat danych , mysqlpump ma również równoległość, która przyspiesza zrzuty i dzieli pracę . W tej chwili nie brałem udziału w pracy, ale wygląda to bardzo obiecująco. Gdy zagłębię się w mysqlpump , może się okazać, że ma on ten sam wygląd i działanie, co pompa danych Oracle .

Jeśli jest ktoś w MySQL Parallel Universe z historiami na ten temat, opublikuj go tutaj.

RolandoMySQLDBA
źródło
0

Odpowiedź Rolando jest całkiem dobra, ale chciałem skryptu, który może być ponownie użyty w różnych projektach. Więc wziąłem jego skrypt i zmodyfikowałem go, abyś mógł robić takie rzeczy jak:

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

Oto zmodyfikowany skrypt:

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

(Nadal mam nadzieję, że --ignore-databaseopcja zostanie dodana do przyszłej wersji mysqldump)

redgeoff
źródło
0

Od MySQL 5.7.8 możesz używać mysqlpump(co NIE jest takie samo jak mysqldump) w następujący sposób:

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

Po prostu zamień db1,db2,db3,db4na cztery bazy danych, które chcesz wykluczyć.

Źródło: Blog serwera MySQL

Leo Galleguillos
źródło