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"
Для каждой учетной записи сервера MySQL, дамп базы данных в отдельные файлы
Для каждого файла дампа выполните эту команду:
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