Любой вариант для mysqldump игнорировать базы данных для резервного копирования?

23

У нас есть 40 баз данных на нашем сервере.

Мы хотим сделать резервную копию 36 баз данных, используя mysqldump. Как я могу игнорировать оставшиеся 4 базы данных в команде mysqldump? Есть ли возможность для MySQL игнорировать базы данных для резервного копирования в MySQL?

Я знаю общую команду mysqldump, но она очень длинная. Я хочу игнорировать только 4 базы данных, и мне нужно взять резервную копию базы данных.

ashuthosh
источник

Ответы:

16

Вернувшись 16 декабря 2011 года, я ответил на вопрос: Как вы оцениваете специфические таблицы mysqldump?

Я собрал все таблицы, не включая определенный набор имен таблиц.

Используя те же принципы, вы могли бы собрать все имена баз данных из таблицы метаданных, information_schema.schemataкоторые вы хотите mysqldump'd, создать запрос для возврата этого списка, а затем использовать этот список баз данных для формулирования команды 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'd в DATABASES_TO_EXCLUDE

Попробуйте!

RolandoMySQLDBA
источник
Там нет необходимости исключать, 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
srcritical
источник
Нужно добавить `| вставьте -sd "" -` после grep, чтобы перейти от многострочного вывода к одной строке с каждым именем базы данных, разделенным пробелом, который требуется mysqldump. Таким образом, команда будетcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Энтони О.
8

Я не думаю, что это возможно, но вы можете попробовать это решение, которое вам нужно будет ввести имена всех баз данных, которые вы хотите сбросить.

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

Дайте мне знать, если решение поможет.

Cybermatatu
источник
1
Я знаю эту команду. Но она очень длинная. Я хочу игнорировать 4 базы данных, и мне нужно взять оставшуюся резервную копию базы данных.
ашутхош
3

Даже здесь так много отличных ответов, так что этот пост просто добавить еще один выбор. Ниже 2 строк в скрипте, вы можете взять ваши серверы все резервные копии БД, игнорируя некоторые БД.

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
включили,
спасибо @RolandoMySQLDBA, я всегда получаю помощь от твоих превосходных постов / блогов ... еще раз спасибо за твой комплимент ...
Зафар Малик
1

Многие всегда хотели, чтобы mysqldump игнорировал базы данных.

Вы поверите, что такой вариант существует сейчас ??? Нет, не в mysqldump.

Oracle (Yuck, toowee, до сих пор не скатывается с языка) имеет DataPump (expdb impdp) для выгрузки баз данных Oracle. Начиная с MySQL 5.7 в семействе Oracle (все еще болит), новая утилита резервного копирования называется mysqlpump , которая поставляется с --exclude-database и другими полезными опциями. Как и его старый сводный сводный файл данных , mysqlpump также имеет параллелизм, который помогает ускорить дампы и разделить работу . На данный момент я не включился в работу, но это выглядит очень многообещающе. Когда я глубоко погружаюсь в mysqlpump, я могу обнаружить, что он выглядит так же, как datapump от Oracle .

Если в MySQL Parallel Universe есть кто-то с историями об этом, пожалуйста, опубликуйте его здесь.

RolandoMySQLDBA
источник
0

Ответ Роландо довольно велик, но я хотел сценарий, который можно использовать в разных проектах. Итак, я взял его сценарий и изменил его так, чтобы вы могли делать такие вещи, как:

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

redgeoff
источник
0

Начиная с 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 Server Blog

Лео Гальегильос
источник