mysqldumpをtar.gzに


88

通常、mysqldumpコマンドでMySQLデータベースをダンプした後、すぐに結果のファイルをtar / gzipします。私はこれを1つのコマンドで行う方法を探しています:

だからこれから:

mysqldump dbname -u root -p > dbname.sql
tar czvf dbname.sql.tgz dbname.sql
rm dbname.sql

このようなものに:

mysqldump dbname -u root -p > some wizardry > dbname.sql.tgz

またはさらに良い(私は通常ダンプファイルを別のサーバーにscpしているため):

mysqldump dbname -u root -p > send dbname.sql.tgz to user@host

私はdebianでbashを実行しています。

回答:


102
mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

このようなパイプではtarを使用できません。また、単一のファイルを出力するだけなので、とにかくそれを必要としません。tarは、複数のファイルがある場合にのみ役立ちます。


6
あなたは、タールを必要としないことについて正しいが、あなたがやった場合はと、パイプラインでそれを使用することができますmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
ダレンチェンバレン

それは実際に機能しますか?tarが動作するにはファイル名のリストが必要であると確信しています。
ジェームズ

2
これを更新して、ローカル(リモートsshサーバー上ではなく)で動作するようにしました。元のポスターと回答者のおかげで、日付に基づいて動的な名前を使用しています。mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
electblake

4
@electblake:ローカルの場合、「cat」を使用する必要はありません。ちょうどgzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
ジェームズ

楽しみのためnetcatに、sshにパイピングする代わりに使用できます。セキュアなネットワークを介して転送される場合(またはセキュリティを気にしない場合)、sshの暗号化オーバーヘッドを少し節約できます。最近では、のxz代わりにを使用することも検討できますgzip
ジェームズ

45

これをローカルで実行している場合は、次のコマンドを使用してデータベースをバックアップし、gzipを使用して圧縮します。

mysqldump -u userName -p (passwordPrompt) yourDatabaseName | gzip -c > output.gz 

(編集:-cキーを修正)


2
はい、これは最も簡単なソリューションです。私も使っています。
ロマンスニトコ

2
おそらくそうでしょうgzip -cか?
pilsetnieks

素敵な...しかし、このコマンドでstderrをリダイレクトするにはどうすればよいですか?2> / dev / nullを追加すると、機能しなくなります。また、パイプの前の2> / dev / nullも機能しません。
ネルソンテイシェイラ

mysqldump -u userName -p(passwordPrompt)yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz
未定義

mysqldump -u root -p databasename --routines | gzip -v> myfile.sql.gz ...ダウンロードできない部分.gzファイルを取得
Sushivam

18

名前付きパイプを使用します。

mkfifo mysql_pipe
gzip -9 -c < mysql_pipe > name_of_dump.gz &
mysqldump database > mysql_pipe 
rm mysql_pipe

私はいつもそれを使用しています、それは素晴らしいです。

http://en.wikipedia.org/wiki/Named_pipe


6
ジェームズは同じことを1行で行います。
ジョンハダッド

15
..しかし、名前付きパイプについて学ぶことは価値があります:-)
トマス・

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipeそこに、1行。もちろん、パイプを保持し、毎回使用します。
-d34dh0r53

15

リモートmysqlデータベースを削除する簡単なスクリプトを作成しました。mysql圧縮、gzipおよびssh圧縮を使用します。驚異的な速度で数GBのデータベースを吸い上げました。

    ssh -C user@host "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz

副次的な利点は、ソースデータベースサーバーに空き領域を必要としないことです。そのため、データを整理する前に、空きディスク領域がゼロのサーバー上のデータベースをバックアップできます。

それが誰かを助けることを願っています。


単純なシェルスクリプトを作成しました:#!/ bin / bash if [-z "$ 1"]; 次に、エコー "使用法:$ {0} [ホスト] [ユーザー] [データベース] [出力ファイル]" exit else HOST = $ 1 fi if [-z "$ 2"]; 次に、エコー "使用法:$ {0} $ {1} [ユーザー] [データベース] [出力ファイル]" exit else USER = $ 2 fi if [-z "$ 3"]; 次に、エコー「使用法:$ {0} $ {1} $ {2} [データベース] [出力ファイル]」exit else DB = $ 3 fi if [-z "$ 4"]; 次にOUTFILE = "$ {DB} .sql.gz"またはOUTFILE = $ 4 fi COMMAND = "ssh -C $ {USER} @ $ {HOST} \" mysqldump --opt $ {DB} | gzip -9 -c \ "> $ {OUTFILE}" ssh -C $ {USER} @ $ {HOST} "mysqldump --opt $ {DB} | gzip -9 -c"> $ {OUTFILE}
Tony Dillon

これらの圧縮のうち2つは無用です。mysqldumpのオプションは、サーバープロセスのデータを圧縮し、すぐに再び解凍します(mysqldumpがDBサーバー自体で実行されている場合)。sshの-Cオプションはgzip圧縮をアクティブにします。これにより、その時点でデータが既にgzip圧縮されているため、CPUサイクルがさらに無駄になります。
MattW。

5

pvレートを使用して監視します!

mysqldump prod_db -h dbslave | pv | gzip -c > prod_2012_08_20.dump.tgz

または、サイズ(3GB)がわかっている場合は、正確な見積もりを取得します。

mysqldump prod_db -h dbslave | pv -s 3g | gzip -c > prod_2012_08_20.dump.tgz

4

これを試して:

mysqldump --all-databases --password=dbpassword | gzip -c | ssh user@servername "cat >/tmp/filename_of_your_choice.gz"

私はこれらのことを決して得意ではないので、ウェブ上の2つのオプションを1つにまとめただけです。

それは他の方法で非常に良いかもしれませんが、これは私のために働くワンライナーです。

ただしssh.keys、スクリプトなどで使用する場合は、インストールして承認する必要がありcrontabます。


1
ServerFaultへようこそ。私には完全に合理的に見えます。

2

あなたは次のようにすることができます:

mysqldump --add-drop-table -h dbhost -u dbuser -p dbname (tablename tablename ... ) | gzip -c > wp.sql.gz

例えば

mysqldump --add-drop-table -h localhost -u root -p wordpress | gzip -c > wp.sql.gz


1

mysqlでのダンプ/復元に関して私が見たすべての良いアドバイスをまとめようとする以下のこのbashスクリプトに取り組んでいます。リモート操作を対象としています。

変数を再構成して、試してみてください。:)

機能は次のとおりです。

  • ダンプするテーブルのリストを渡すことができます(選択ダンプ)
  • パスワード(MySQL / SSH)の入力を求められるか、変数で設定できます
  • ネットワーク伝送はgzip圧縮されています
  • gzipされたダンプをリモートサーバーに保存することを選択できます。
  • ダンプをリモートサーバーにオンザフライで再インポートできます(ローカル/リモートサーバーに一時ファイルはありません)
  • 何が起こっているかを視覚的にフィードバックします(echoとpvに感謝)
  • ダンププロセスの前後にmysql変数を設定できます

改善が必要なもの:

  • テーブルのリストを渡す必要があります(すべてのテーブルをダンプする)
  • MySQLパスワードはソースとターゲットで同じです
  • 手動で特権を付与する必要があります(MySQLはリモートで実行できないようです)
  • sshpassをインストールする必要があります
  • いくつかのinnodb巨大圧縮テーブルのダンプが遅い(mysqldumpのせいかもしれません)

このスクリプトをコミュニティで改善できることを願ってここで共有します。 (ナノまたはコードを着色する他のエディターで表示するのが最適です)

- - - - - - - - - - - - - - - - - ここで切れ - - - - - - - - -------------------

#!/bin/bash
#set -x

#REQUIRED VARS
SOURCE_USER=root   #MySQL user
SOURCE_HOST=localhost
SOURCE_PASSWORD=yourmysqlpass  #optional
SOURCE_DBNAME=yourdbname
TARGET_HOST=192.168.1.2
TARGET_DBNAME=yourdbname
TARGET_SSHUSER=root
TARGET_SSHPASSWORD=yoursshpass  #optional
TABLES='table1 table2 table3 table4'
TARGET_DIR="/data/dumpfiles"
EXEC_ACTION_TEXT[0]='Reimport TABLES directly into remote MySQL database'
EXEC_ACTION_TEXT[1]='Backup gzipped data to TARGED_DIR on remote TARGET_HOST'
EXEC_ACTION=0

#print config
echo "---------------------------------"
echo " SOURCE_USER:    $SOURCE_USER (MySQL)"
if [ "SOURCE_PASSWORD" != "" ]; then
echo " SOURCE_PASSWORD:<present>        "; else
echo " SOURCE_PASSWORD:<to be asked>    "
fi
echo " SOURCE_HOST:    $SOURCE_HOST     "
echo " SOURCE_DBNAME:  $SOURCE_DBNAME   "
echo " TARGET_HOST:    $TARGET_HOST     "
echo " TARGET_DBNAME:  $TARGET_DBNAME   "
echo " TARGET_SSHUSER: $TARGET_SSHUSER  "
if [ "TARGET_SSHPASSWORD" != "" ]; then
echo " TARGET_SSHPASS: <present>     "; else
echo " TARGET_SSHPASS: <to be asked>    "
fi
echo " TABLES:         $TABLES          "
echo " EXEC_ACTION:    $EXEC_ACTION - ${EXEC_ACTION_TEXT[$EXEC_ACTION]}"
echo " TARGET_DIR:     $TARGET_DIR (only for action 1)"
echo "---------------------------------"
echo "PRESS <ENTER> to continue...";  read;  echo

#read the mysql password from command-line (SOURCE and TARGET uses the same password)
if [ "$SOURCE_PASSWORD" == "" ]; then
     echo -n "Type $SOURCE_USER password for MySQL servers: "; read -s SOURCE_PASSWORD; echo
fi
echo "Creating database $TARGET_DBNAME on $TARGET_HOST if not exists ... "
mysql \
--user=$SOURCE_USER \
--password=$SOURCE_PASSWORD \
--host=$TARGET_HOST \
--execute "create database if not exists $TARGET_DBNAME;"

echo '--------------------------------------------------------------------------------------'
echo "**** ATTENTION ****: execute this command on mysql server at  $TARGET_HOST :"
echo "GRANT ALL PRIVILEGES ON $TARGET_DBNAME.* TO '$SOURCE_USER'@'%' IDENTIFIED BY 'yourpass';"
echo '--------------------------------------------------------------------------------------'
echo "PRESS <ENTER> to continue...";  read;  echo

#read the password from command-line
if [ "$TARGET_SSHPASSWORD" == "" ]; then
     echo -n "Type the password for remote SSH Server (TARGET) ['$TARGET_SSHUSER'@'$TARGET_HOST']: "; read -s TARGET_SSHPASSWORD; echo
fi

for thistable in $TABLES
do
     case "$EXEC_ACTION" in
         0)
         thisaction="gunzip | mysql --user=$SOURCE_USER --password=$SOURCE_PASSWORD -D $TARGET_DBNAME"
         endmessage='remote reimporting has finished'
         ;;
         1)
         thisaction="cat > $TARGET_DIR/`date +%Y.%m.%d`-"$thistable".gz"
         endmessage="$thisaction has finished"
         ;;
         *)   echo "EXEC_ACTION=$EXEC_ACTION not supported" && exit 1
     esac

     echo "---------------------------------------------------------------------"
     echo "-- table $thistable"
     echo "---------------------------------------------------------------------"
     (
       echo -n "-- setting variables... " > /dev/stderr  #talk to user via stderr
       echo "SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;"
       echo -n "starting mysqldump... " > /dev/stderr
       mysqldump --opt --user=$SOURCE_USER --password=$SOURCE_PASSWORD --host=$SOURCE_HOST $SOURCE_DBNAME $thistable
       echo -n "done mysqldump, reseting variables... " > /dev/stderr
       echo "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;"
       echo -n "commiting... " > /dev/stderr
       echo "COMMIT;"
       echo "done!" > /dev/stderr
     ) | \
     gzip -c -2 | \
     pv | \
     sshpass -p $TARGET_SSHPASSWORD ssh $TARGET_SSHUSER'@'$TARGET_HOST $thisaction
     echo $endmessage ' with exit status '$?
done

0

パスワードを設定ファイルに保存して、このオプション--defaults-extra-fileを使用することもできます。

mysqldump --defaults-extra-file=mysqldump.cnf DataBaseName | gzip -c > DBOutputName.sql.gz

構成ファイルは次のようになります。

[mysqldump]
host = localhost
user = username
password = "password"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.