web-dev-qa-db-ja.com

別のファイルにdbを持つmysqldump

すべてを1つの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をそれぞれの名前でエクスポートするにはどうすればよいですか?

更新:
わかりました。以下のヒントから機能させることができました。
これが最後のスクリプトです

# 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

のエコー部分は機能しません。

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

データベースごとにバックアップを作成する方がはるかに効率的です。必要に応じて簡単に復元できるだけでなく、データベース全体のバックアップを作成すると、1つのテーブルが破損または破損した場合に破損することも経験しました。また、データベースごとにバックアップを作成することにより、そのデータベースでのみ機能し、残りは引き続き有効です。

Mysqlデータベースをバックアップするために作成したonelinerは次のとおりです。

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

パスワード「Secret」を使用して新しい読み取り専用のmysqlユーザー「bupuser」を作成することをお勧めします(変更!)。最初にデータベースのリストを取得します。次にループし、データベースごとに/ var/db-bupにdump.sqlファイルを作成します(変更可能)。そして、エラーが発生していない場合にのみ、ファイルをgzipして、ストレージを大幅に節約します。一部のデータベースでエラーが発生した場合、.sql.qzファイルではなく.sqlファイルが表示されます。

16
Bob Siefkes

ここで簡単なスクリプトは:

  • すべてのDBをダンプし、出力を圧縮します-> SCHEMA_NAME.sql.gz
  • [autocommit/unique_checks/foreign_key_checks]を使用してインポートを高速化する
  • デフォルトのスキーマを除外する

ファイル:Dump_all.sh

使い方:
./ Dump_all.sh->すべてのDBをダンプします
./ Dump_all.sh SCHEMA_NAME->はSCHEMA_NAME DBをダンプします

#!/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 --"
10
WonderLand

これが私のために働いたものです

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

@Jeshurunによって提案されたAutoMySQLBackupプロジェクトの利用可能なパッケージを探しているときに、私は偶然出くわしました Holland

名前に興味をそそられました(私はベルギーのオランダ南部に住んでいることがあります。「オランダ」と呼ばれることもありますが、それよりも良い部分もあります)。チェックすることにしました。おそらくそれはあなたにも役立つでしょう。

0
Bram

あなたの質問への答えではありませんが、車輪を再発明する代わりに、Sourceforgeの AutoMySQLBackup プロジェクトを見てください。それはあなたが望むことをし、圧縮、暗号化、ローテーション、そして電子メール通知を含むたくさんの追加機能を上に提供します。私はしばらく使用しましたが、とてもうまくいきました。

0
Jeshurun

元気そうです。私が現時点で(テストなしで)見つけることができるのは、Show Tablesの後にセミコロンがないことです。

0
BLaZuRE

これは私が使用しているもので、非常にシンプルでうまく機能します。

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

コマンドにパスワードを追加しなかった場合は、1とデータベースの総数を加えて入力する必要があります。

0
Yasir Elsharif