Ответ 1
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
Я пишу одну строку команды, которая создает резервные копии всех баз данных в их соответствующие имена, вместо этого использует сброс всех в один 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, поэтому я мог ошибаться в своих мыслях.
Что делать, чтобы экспортировать db в соответствующие имена?
обновление:
Хорошо, нужно наконец-то заставить его работать с подсказками ниже.
Это окончательный script
# 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
Эховая часть не работает.
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 для чтения только с помощью пароля "Секрет" (изменить!). Сначала он получит список баз данных. Затем цикл и для каждой базы данных создайте файл dump.sql для /var/db -bup (вы можете изменить). И только тогда, когда ошибок не обнаружено, тогда также gzip файл, который действительно существенно сохранит память. Когда в некоторых базах данных возникают ошибки, вы увидите файл .sql, а не файл .sql.qz.
Здесь легкий script, который будет:
SCHEMA_NAME.sql.gz
Файл: Dump_all.sh
Как использовать:
. /Dump _all.sh → сбрасывает все БД
. /Dump _all.sh SCHEMA_NAME → сбрасывает DB 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
Не ответ на ваш вопрос, но посмотрите на проект AutoMySQLBackup на Sourceforge вместо того, чтобы повторно изобретать колесо. Он делает то, что вы хотите, и предлагает массу дополнительных функций сверху, включая сжатие, шифрование, ротацию и уведомления по электронной почте. Я использовал его некоторое время назад, и он работал очень хорошо.
Он выглядит прекрасным. Единственное, что я могу найти на данный момент (без тестирования), это то, что вам не хватает полуколонны после Show Tables.
При поиске доступных пакетов для проекта AutoMySQLBackup, предложенного @Jeshurun, я пришел через Holland.
Заинтригованный именем (я живу в Бельгии на юге Нидерландов, иногда - или лучше некоторые части, называемые "Голландия" ), я решил проверить это. Возможно, это тоже поможет вам.
Это то, что я использую, это очень просто и отлично работает для меня.
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
Если вы не добавили пароль в команду, вам нужно набрать его один плюс общее количество имеющихся у вас баз.