Подтвердить что ты не робот

Mysqldump с db в отдельном файле

Я пишу одну строку команды, которая создает резервные копии всех баз данных в их соответствующие имена, вместо этого использует сброс всех в один 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

Эховая часть не работает.

4b9b3361

Ответ 1

mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done

Ответ 2

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

Мы создали резервную копию наших баз данных 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.

Ответ 3

Здесь легкий script, который будет:

  • dump all DB сжимает вывод → SCHEMA_NAME.sql.gz
  • используйте [autocommit/unique_checks/foreign_key_checks], чтобы ускорить импорт.
  • исключить стандартные схемы

Файл: 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 --"

Ответ 4

Вот что сработало для меня

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done

Ответ 5

Не ответ на ваш вопрос, но посмотрите на проект AutoMySQLBackup на Sourceforge вместо того, чтобы повторно изобретать колесо. Он делает то, что вы хотите, и предлагает массу дополнительных функций сверху, включая сжатие, шифрование, ротацию и уведомления по электронной почте. Я использовал его некоторое время назад, и он работал очень хорошо.

Ответ 6

Он выглядит прекрасным. Единственное, что я могу найти на данный момент (без тестирования), это то, что вам не хватает полуколонны после Show Tables.

Ответ 7

При поиске доступных пакетов для проекта AutoMySQLBackup, предложенного @Jeshurun, я пришел через Holland.

Заинтригованный именем (я живу в Бельгии на юге Нидерландов, иногда - или лучше некоторые части, называемые "Голландия" ), я решил проверить это. Возможно, это тоже поможет вам.

Ответ 8

Это то, что я использую, это очень просто и отлично работает для меня.

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

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