Будь-який варіант для mysqldump ігнорувати бази даних для резервного копіювання?


23

На нашому сервері 40 баз даних.

Ми хочемо взяти 36 резервних копій баз даних за допомогою mysqldump. Як я можу ігнорувати залишилися 4 бази даних у команді mysqldump? Чи є можливість для mysqldump ігнорувати бази даних для резервного копіювання в MySQL?

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

Відповіді:


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

Спробувати !!!


Не потрібно виключати, що 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/uk/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 " " -)
Ентоні О.

8

Я не думаю, що це можливо, але ви можете спробувати це рішення, яке вам доведеться набрати імена всіх баз даних, які ви хочете скинути.

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

Повідомте мене, чи допоможе рішення.


1
Я знаю, що ця команда. Але вона дуже тривала. Я хочу проігнорувати 4 бази даних і мені потрібно взяти резервну копію DBS.
ашутош

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, також, все ще не скачує мову) має DataPump (expdb impdp) для скидання баз даних Oracle. Оскільки MySQL 5.7 в сім'ї Oracle (все ще шкодить), нова утиліта програми резервного копіювання називається mysqlpump , яка постачається з --exclude-базами даних та іншими акуратними параметрами. Як і його попередній потік даних з даного брата , у mysqlpump також є паралелізм, що допомагає прискорити скидання та розділити роботу . В цей час я не включився в роботу, але це виглядає дуже перспективно. Коли я заглиблююсь у mysqlpump, я можу виявити, що він виглядає так само, як і помпа даних Oracle .

Якщо в MySQL Паралельний Всесвіт хтось має розповіді про нього, будь ласка, опублікуйте його тут.


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)


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.