Могу ли я получить дамп всех моих баз данных *, кроме одной *, используя mysqldump? - PullRequest
22 голосов
/ 27 мая 2010

В настоящее время я использую mySQLdump для резервного копирования моей машины и серверов.

Однако есть только один проект, который я только что начал, который имеет базу данных HUUUUUGE, для которой мне не нужно делать резервные копии, и я буду большой проблемой, чтобы добавить ее в оставшуюся часть цикла резервного копирования.

В настоящее время я делаю это:

"c:\Program Files\mysql\MySQL Server 5.1\bin\mysqldump" -u root -pxxxxxx --all-databases > g:\backups\MySQL\mysqlbackup.sql

Можно ли как-то указать "кроме этой базы данных"?

Мне бы не хотелось указывать список БД вручную, так как это означало бы, что мне придется помнить об обновлении моего резервного файла пакета каждый раз, когда я создаю новую БД, и я знаю, что этого не произойдет.

РЕДАКТИРОВАТЬ: Как вы, вероятно, догадались из моей командной строки выше, я делаю это на Windows, поэтому я не могу делать какие-либо причудливые вещи Bash, только слабые вещи .bat.

В качестве альтернативы, если у вас есть другие идеи для решения этой же проблемы, они, конечно, приветствуются!

Ответы [ 7 ]

31 голосов
/ 27 мая 2010

mysql ... -N -e "show databases like '%';" |grep-v -F databaseidontwant |xargsmysqldump ... --databases > out.sql

23 голосов
/ 13 июня 2012
echo 'show databases;' | mysql -uroot -proot | grep -v ^Database$ | grep -v ^information_schema$ | grep -v ^mysql$ | grep -v -F db1 | xargs mysqldump -uroot -proot  --databases > all.sql

выводит все базы данных, кроме: mysql, information_schema, mysql и db1.

Или, если вы хотите просмотреть список перед сбросом:

  1. echo 'show databases;' | mysql -uroot -proot > databases.txt
  2. изменить databases.txt и удалить все, что вы не хотите, чтобы сбросить
  3. cat databases.txt | xargs mysqldump -uroot -proot --databases > all.sql
9 голосов
/ 08 июня 2010

А как же

- игнорировать стол = db_name.tbl_name

Не выводить заданную таблицу, которая должна быть указана с использованием базы данных и имен таблиц. Чтобы игнорировать несколько таблиц, используйте эту опцию несколько раз.

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

4 голосов
/ 06 марта 2014

Я создал следующее однострочное решение, избегая нескольких команд grep.

mysql -e "show databases;" | grep -Ev "Database|DatabaseToExclude1|DatabaseToExclude2" | xargs mysqldump --databases >mysql_dump_filename.sql

Параметр -E в grep включает расширенную поддержку регулярных выражений, что позволило обеспечить различные совпадения, разделенные символом канала "|". Дополнительные параметры могут быть добавлены к команде mysqldump. Но только перед параметром --databases.

Небольшое примечание, я хотел бы определить имя файла для дампа, как это ...

... >mysql_dump_$(hostname)_$(date +%Y-%m-%d_%H-%M).sql

Это автоматически добавит имя хоста, дату и время в имя файла. :)

3 голосов
/ 06 марта 2014

Поскольку вы используете Windows, вы должны иметь PowerShell для использования.
Вот короткий скрипт PowerShell, чтобы получить список всех баз данных, удалить ненужные из списка и затем использовать mysqldump для резервного копирования остальных.

$MySQLPath = "."
$Hostname = "localhost"
$Username = "root"
$Password = ""

# Get list of Databases
$Databases = [System.Collections.Generic.List[String]] (
    & $MySQLPath\mysql.exe -h"$Hostname" -u"$Username" -p"$Password" -B -N -e"show databases;"
)

# Remove databases from list we don't want
[void]$Databases.Remove("information_schema")
[void]$Databases.Remove("mysql")

# Dump database to .SQL file
& $MySQLPath\mysqldump.exe -h"$HostName" -u"$Username" -p"$Password" -B $($Databases) | Out-File "DBBackup.sql"
3 голосов
/ 27 мая 2010

Создайте пользователя с резервной копией и предоставьте только этому пользователю доступ к базам данных, для которых вы хотите создать резервную копию.

Вам все еще нужно помнить, чтобы явно предоставлять привилегии, но это может быть сделано в базе данных и не требует редактирования файла.

1 голос
/ 28 июня 2013

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

mysql -hServerName -uUserName -pPassword -e "SELECT CONCAT('\nmysqldump -hServerName -uUserName -pPassword --set-gtid-purged=OFF --max_allowed_packet=2048M --single-transaction --add-drop-database --opt --routines --databases ',DBList,' | mysql -hServerName2 -uUserName2 -pPAssword2 ' ) AS Cmd FROM (SELECT GROUP_CONCAT(schema_name SEPARATOR ' ') AS DBList FROM information_schema.SCHEMATA WHERE LEFT(schema_name, 8) <> 'cclegacy' AND schema_name NOT IN ('mysql','information_schema','performance_schema','test','external','othertoskip')) a \G" | cmd

Вместо перехода на mysql, где я перехожу с serverName на Servername2, вы можете перенаправить в файл, но это позволяет мне адаптировать то, что я перемещаю. Иногда я даже ИЛИ список, поэтому я могу сказать, как «Префикс%» и т. Д.

...