35

すべてのデータベースを1つのSQLでダンプする代わりに、すべてのデータベースをそれぞれの名前にバックアップする1行のコマンドを書いています。

例: 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

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

4

8 に答える 8

46
mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
于 2012-06-03T02:54:06.090 に答える
17

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

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 に作成します (変更できます)。また、エラーが発生しない場合にのみ、ファイルを gzip します。これにより、ストレージが大幅に節約されます。一部のデータベースでエラーが発生した場合、.sql.qz ファイルではなく、.sql ファイルが表示されます。

于 2012-06-19T07:06:43.773 に答える
1

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

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done
于 2016-10-31T09:31:01.060 に答える
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

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

于 2016-08-29T18:51:54.107 に答える
0

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

于 2012-06-03T02:52:48.933 に答える
0

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

于 2012-06-03T02:53:05.177 に答える
0

@Jeshurun によって提案された AutoMySQLBackup プロジェクトで利用可能なパッケージを探しているときに、Hollandに出会いました。

その名前に興味をそそられ(私はオランダの南にあるベルギーに住んでいて、「オランダ」と呼ばれることもあります)、調べてみることにしました。おそらく、それもあなたを助けることができます。

于 2012-06-03T09:03:37.573 に答える