13

私が使用する標準の mysqldump コマンドは

mysqldump --opt --databases $dbname --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename

複数のデータベースをダンプするには

mysqldump --opt --databases $dbname1 $dbname2 $dbname3 $dbname_etc --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename

私の質問は、異なる MySQL アカウントから複数のデータベースを 1 つのファイルにダンプする方法です。

更新: 1 つのファイルを意味するときは、その中に異なるサイトの異なる SQL ダンプを含む 1 つの gzip ファイルを意味します。

4

3 に答える 3

12

誰もこれを明確にしていないようですので、私は 2 セントを差し上げます。

ここで注意しておきたいのは、私の経験は BASH でのものであり、BASH に限定されている可能性があるため、変数とループは環境によって異なる動作をする可能性があることです。

内部に個別のファイルを含むアーカイブを作成する最善の方法は、ZIP または TAR を使用することです。私は、その単純さと可用性から、tar を使用することを好みます。

tar 自体は圧縮を行いませんが、bzip2 または gzip にバンドルすると優れた結果が得られます。あなたの例では gzip を使用しているので、デモでそれを使用します。

まず、MySQL ダンプの問題に取り組みましょう。mysqldumpコマンドはファイルを分離しません (私の知る限り)。そこで、データベースごとに 1 つのファイルを作成するための小さな回避策を考えてみましょう。

mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; done

これで、ファイルごとにデータベースを表示する文字列ができました。これらのデータベースを必要な場所にエクスポートするだけで、> 記号の後の部分を編集できます。

次に、TAR の構文を見てみましょう。

tar -czf <output-file> <input-file-1> <input-file-2>

この構成により、アーカイブする多数のファイルを指定できます。

オプションは次のように分類されます。

c - アーカイブの圧縮/作成

z - GZIP 圧縮

f - ファイルへの出力

j - bzip 圧縮

次の問題は、新しく作成されたすべてのファイルのリストを保持することです。MySQL 内で見つかった各データベースを実行しながら、while ステートメントを展開して変数に追加します。

DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB";  done 

これで、作成されるすべてのファイルの出力を取得するために使用できる DBLIST 変数ができました。次に、1 行のステートメントを変更して、すべてが処理された後に tar コマンドを実行できます。

DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB";  done && tar -czf $filename "$DBLIST"

これは非常に大雑把な方法であり、手動でデータベースを指定することはできません。そのため、次のコマンドを使用して、指定したすべてのデータベースを含む TAR ファイルを作成します。

DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql";  done && tar -czf $filename "$DBLIST"

MySQL データベースから MySQL データベースへのループは、次の stackoverflow.com の質問「mysqldump with db in a separate file」から来ています。これは、ニーズに合わせて単純に変更されたものです。

そして、スクリプトを 1 行で自動的にクリーンアップするには、コマンドの最後に次を追加するだけです。

&& rm "$DBLIST"

コマンドを次のようにします

DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql";  done && tar -czf $filename "$DBLIST" && rm "$DBLIST"
于 2013-10-06T01:16:58.290 に答える
2
  1. MySQL サーバー アカウントごとに、データベースを個別のファイルにダンプします。

  2. すべてのダンプ ファイルに対して、次のコマンドを実行します。

    cat dump_user1.sql dump_user2.sql | gzip > super_dump.gz

Superuser.com Web サイトにも同様の投稿があります: https://superuser.com/questions/228878/how-can-i-concatenate-two-files-in-unix

于 2013-05-10T02:14:16.357 に答える