Ответ 1
mysql ... -N -e "show databases like '%';" |
grep
-v -F databaseidontwant |
xargs
mysqldump ... --databases > out.sql
В настоящее время я использую mySQLdump для резервного копирования моей машины и серверов dev.
Есть только один проект, который я только что начал, но у него есть база данных HUUUUUGE, которая мне действительно не нужна, и я буду большой проблемой, чтобы добавить ее в остальную часть цикла резервного копирования.
В настоящее время я делаю это:
"c:\Program Files\mysql\MySQL Server 5.1\bin\mysqldump" -u root -pxxxxxx --all-databases > g:\backups\MySQL\mysqlbackup.sql
Можно ли как-то указать "кроме этой базы данных"??
Мне не хотелось бы указывать список БД вручную, так как это означало бы, что я должен был бы помнить, как обновлять файл резервной копии каждый раз, когда я создаю новую БД, и я знаю, что этого не произойдет.
EDIT: Как вы, наверное, догадались из моей командной строки выше, я делаю это в Windows, поэтому я не могу делать какие-либо причудливые вещи bash, только wimpy.bat.
В качестве альтернативы, если у вас есть другие идеи для решения этой же проблемы, они более чем приветствуются, конечно!
mysql ... -N -e "show databases like '%';" |
grep
-v -F databaseidontwant |
xargs
mysqldump ... --databases > out.sql
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
.
Или, если вы хотите просмотреть список перед сбросом:
echo 'show databases;' | mysql -uroot -proot > databases.txt
databases.txt
и удалите все, что вы не хотите выгружатьcat databases.txt | xargs mysqldump -uroot -proot --databases > all.sql
Что насчет
- игнорировать стол = db_name.tbl_name
Не выгружайте указанную таблицу, которая должна быть указана с использованием имен базы данных и таблиц. Чтобы игнорировать несколько таблиц, используйте эту опцию несколько раз.
Возможно, вам нужно указать несколько, чтобы полностью игнорировать большую базу данных.
Создайте пользователя резервного копирования и предоставите только пользователю доступ к базам данных, которые вы хотите создать.
Вам все равно нужно помнить о том, чтобы явно предоставлять привилегии, но это можно сделать в базе данных и не требует редактирования файла.
Я создал следующее однострочное решение, избегая нескольких команд 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
Это автоматически объявит имя хоста, дату и время имени файла.:)
Увидев, что вы используете Windows, у вас должен быть доступный PowerShell.
Вот короткий PowerShell script, чтобы получить список всех Баз Данных, удалить ненужные из списка, а затем использовать 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"
Мне потребовалось много усилий, чтобы придумать это, но я использовал его уже несколько лет и хорошо работает...
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, вы можете перенаправить файл, но это позволяет мне адаптировать то, что я двигаю. Иногда я даже OR список, поэтому я могу сказать LIKE "Префикс%" и т.д.