mysqldump - дамп нескольких баз данных из отдельных учетных записей mysql в один файл

Стандартная команда mysqldump, которую я использую

mysqldump --opt --databases $dbname --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename

Для сброса нескольких баз данных

mysqldump --opt --databases $dbname1 $dbname2 $dbname3 $dbname_etc --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename

Мой вопрос заключается в том, как записать несколько баз данных из разных учетных записей MySQL в один файл?

ОБНОВЛЕНИЕ: Когда я имел в виду 1 файл, я имел в виду 1 gzip-файл с разностью sql-дампов для разных сайтов внутри него.

3 ответа

Никто, кажется, не разъяснил это, поэтому я собираюсь дать свои 2 цента.

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

Лучший способ получить архив с отдельными файлами внутри него - использовать ZIP или TAR, я предпочитаю использовать tar из-за его простоты и доступности.

Tar сам по себе не выполняет сжатие, но в комплекте с bzip2 или gzip он может обеспечить отличные результаты. Поскольку ваш пример использует gzip, я буду использовать это в своей демонстрации.

Сначала давайте приступим к проблеме дампов MySQL, команда mysqldump не разделяет файлы (насколько я знаю). Итак, давайте сделаем небольшой обходной путь для создания 1 файла на базу данных.

mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; done

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

Далее давайте добавим немного взглянуть на синтаксис для TAR

tar -czf <output-file> <input-file-1> <input-file-2>

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

Опции разбиты следующим образом.

c - Сжать / Создать архив

z - сжатие GZIP

f - вывод в файл

j - сжатие bzip

Наша следующая проблема - сохранить список всех вновь созданных файлов. Мы расширим наш оператор while, чтобы добавить переменную во время работы с каждой базой данных, найденной внутри MySQL.

DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB";  done 

Теперь у нас есть переменная DBLIST, которую мы можем использовать для вывода всех наших файлов, которые мы будем создавать, и затем мы можем изменить наш 1-строчный оператор для запуска команды tar после того, как все будет обработано.

DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB";  done && tar -czf $filename "$DBLIST"

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

DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql";  done && tar -czf $filename "$DBLIST"

Цикл по базам данных MySQL из базы данных MySQL происходит из следующего вопроса stackru.com " mysqldump с базой данных в отдельном файле ", который был просто изменен, чтобы соответствовать вашим потребностям.

И чтобы скрипт автоматически очищал его в 1 строчку, просто добавьте следующее в конце команды

&& rm "$DBLIST"

заставляя команду выглядеть так

DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql";  done && tar -czf $filename "$DBLIST" && rm "$DBLIST"
  1. Для каждой учетной записи сервера MySQL, дамп базы данных в отдельные файлы

  2. Для каждого файла дампа выполните эту команду:

    cat dump_user1.sql dump_user2.sql | gzip > super_dump.gz

На сайте Superuser.com есть аналогичная запись: https://superuser.com/questions/228878/how-can-i-concatenate-two-files-in-unix

на всякий случай "несколько БД" для вас буквально "все БД"

      mysqldump -u root -p --all-databases > all.sql
Другие вопросы по тегам