mysqldump с БД в отдельном файле
Я пишу однострочную команду, которая выполняет резервное копирование всех баз данных под соответствующими именами, вместо этого используется дамп всего в одном sql
Например: db1 сохраняется в db1.sql, а db2 сохраняется в db2.sql
До сих пор я собирал следующие команды для извлечения всех баз данных.
mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'
Я планирую передать это с помощью awk, чтобы сделать что-то вроде
awk '{mysqldump -uuname -ppwd $1 > $1.sql}'
Но это не работает.
Я новичок в bash, так что я могу ошибаться в своих мыслях.
Что я должен сделать, чтобы он экспортировал БД в соответствующие имена?
Обновить:
Хорошо, наконец-то удалось заставить его работать из подсказок ниже.
Это последний сценарий
# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...
mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done
Эхо часть не работает, хотя.
10 ответов
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
Создание резервных копий для базы данных действительно намного эффективнее. Не только легче восстановить, когда это необходимо, но также я испытал, что создание резервной копии всей базы данных будет сломано, если одна таблица будет повреждена / повреждена. А при создании резервных копий для каждой базы данных она будет разбиваться только для этой базы данных, а остальная часть остается в силе.
Единственное, что мы создали для резервного копирования наших баз данных mysql:
mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done
Лучше всего создать нового пользователя только для чтения mysql "bupuser" с псевдонимом "Secret" (изменить!). Сначала будет получен список баз данных. Затем выполните цикл и для каждой базы данных создайте файл dump.sql в /var/db-bup (вы можете изменить). И только тогда, когда ошибок не возникнет, также распакуйте файл, который действительно существенно сэкономит память. Когда в некоторых базах данных возникли ошибки, вы увидите файл.sql, а не файл.sql.qz.
Вот простой скрипт, который будет:
- сбросить всю БД компрессом вывод ->
SCHEMA_NAME.sql.gz
- используйте [autocommit/unique_checks/foreign_key_checks] для ускорения импорта
- исключить схемы по умолчанию
Файл: Dump_all.sh
Как пользоваться:
./Dump_all.sh -> сбросит всю БД
./Dump_all.sh SCHEMA_NAME -> выгрузит базу данных SCHEMA_NAME
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="YOUR_PASS"
echo "-- START --"
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql
if [ -z "$1" ]
then
echo "-- Dumping all DB ..."
for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names);
do
if [ "$I" = information_schema ] || [ "$I" = mysql ] || [ "$I" = phpmyadmin ] || [ "$I" = performance_schema ] # exclude this DB
then
echo "-- Skip $I ..."
continue
fi
echo "-- Dumping $I ..."
# Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz"
done
else
I=$1;
echo "-- Dumping $I ..."
# Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz"
fi
# remove tmp files
rm tmp_sqlhead.sql
rm tmp_sqlend.sql
echo "-- FINISH --"
Вот что сработало для меня
mysql -s -r -uroot -e 'show databases' -N | while read dbname; do
mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql;
done
Это то, что я использую, это очень просто и отлично работает для меня.
mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done
С возможностью сжатия:
mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done
Если вы не добавили пароль в команду, вам нужно ввести его один плюс общее количество баз данных, которые у вас есть.
Вот самое быстрое и простое решение, которое сработало для меня всего за несколько секунд.
- Войдите на свой сервер через FTP, используя приложение FTP CLient или приложение Winscp.
- Загрузите этот скрипт с https://gist.github.com/daniel-werner/5ab30d2e5c566adaad3022f4da9e141d, разархивируйте и загрузите файл .sh в свой /home каталог на сервере.
- SSH в вашу ОС (Linux) с учетной записью, которая имеет привилегии sudo и cd в домашний каталог.
- Сделайте скрипт исполняемым с помощью команды chmod +x dump-all-databases.sh.
- Запустите команду, используя ./dump-all-databases.sh -u root -o /var/www/db_folder...ПРИМЕЧАНИЕ: замените root именем пользователя вашей базы данных.
- Нажмите Enter, чтобы запустить скрипт
- Введите пароль пользователя mysql, т.е. если пользователь базы данных с доступом к базам данных имеет имя user12, введите его пароль при следующем запросе пароля.
- дайте ему закончить и просмотрите каталог резервных копий, чтобы убедиться, что базы данных были сброшены, как ожидалось.
Другие ссылки и кредит: https://dev.to/daniel_werner/how-to-dump-all-mysql-databases-into-separate-files-4okc
Это то, что я использую, передавая пароль в строке:
mysql -u root --password='xxxxxxx' -N -e 'show databases' | while read dbname; do mysqldump -u root --password='xxxxxxx' "$dbname" > "$dbname".sql; done
Кажется, хорошо. Единственное, что я могу найти на данный момент (без тестирования), это то, что вы пропускаете точку с запятой после Show Tables.
В поисках доступных пакетов для проекта AutoMySQLBackup, предложенного @Jeshurun, я приехал через Голландию.
Заинтригованный именем (я живу в Бельгии на юге Нидерландов, иногда - или, что лучше, в некоторых частях - называемой "Голландия"), я решил проверить его. Возможно, это может помочь вам.
Не ответ на ваш вопрос, но взгляните на проект AutoMySQLBackup на Sourceforge вместо того, чтобы заново изобретать колесо. Он делает то, что вы хотите, и предлагает множество дополнительных функций, включая сжатие, шифрование, ротацию и уведомления по электронной почте. Я использовал это некоторое время назад, и это работало очень хорошо.