Вопрос по bash – mysqldump с БД в отдельном файле

26

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

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

по крайней мере, вы должны добавить & quot ;; & quot; после эха 'Dumping $ dbname' Nadir
Эхо не работает, потому что оно перенаправлено в ~ / db_backup / $ dbname.sql. Ваш mysqldump также, вероятно, не работает - то, как это написано здесь, это просто аргумент для эха. Я бы порекомендовал использовать аргумент mysqldump --result-file вместо перенаправления, просто чтобы уточнить, что происходит. Kevin Keane

Ваш Ответ

8   ответов
1

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

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done
38
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
Переходя-N вmysql пропустит заголовок столбца «База данных».
Спасибо Виниций. Я получаю сообщение "mysqldump: Got error: 1049: неизвестная база данных"; база данных "; при выборе базы & quot; и не смог понять почему.
0

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

0

предложенного @Jeshurun, я наткнулсяГолландия.

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

0

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

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

16

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

Единственное, что мы создали для резервного копирования наших баз данных 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». с паролем «Секрет» (менять!). Сначала будет получен список баз данных. Затем выполните цикл и для каждой базы данных создайте файл dump.sql в / var / db-bup (вы можете изменить). И только тогда, когда нет ошибок, можно также сжать файл, который действительно существенно сэкономит память. Когда в некоторых базах данных возникли ошибки, вы увидите файл .sql, а не файл .sql.qz.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmysql -s -r -N -u bupuser -pSecret -e 'show databases where `Database` not in("information_schema"',"performance_schema","phpmyadmin")Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Why is it a little better?Error: User Rate Limit Exceeded
This is my last versionError: User Rate Limit Exceeded
9

dump all DB a compress the output -> SCHEMA_NAME.sql.gz use [autocommit/unique_checks/foreign_key_checks] to speed up import exclude default schemas

Файл: Dump_all.sh

How to use:
./Dump_all.sh - & gt; сбросит всю БД
./Dump_all.sh SCHEMA_NAME - & gt; сбросит базу данных 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 --"
0

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

Похожие вопросы