この一連の命令があるとしましょう。
mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1
mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1
mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2
mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2
1行のコードを使用して、どの出力(出力名が$ dbhost.$ dbname.sqlであると仮定)をbackupfile.sql.gzというファイルに入れることができますか?
編集する:以下のコメントから答えまで、@arvinsimは実際に圧縮したいと思いました。ファイルファイルは、SQLダンプではなく別々のファイルに含まれています。一つ圧縮されたSQLファイル。
答え1
( mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; \
mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; \
mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2; \
mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbp \
) | gzip > backupfile.sql.gz
または1行で:
( mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2; mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbp) | gzip > backupfile.sql.gz
答え2
@tinkの答えに対するコメントでは、.gz
ファイル内に別々のファイルが必要です。
mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1 > '/var/tmp/$dbhost1.$dbname1.sql' ; mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1 > '/var/tmp/$dbhost1.$dbname2.sql' ; mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2 > '/var/tmp/$dbhost1.$dbname3.sql' ; mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2 > '/var/tmp/$dbhost1.$dbname4.sql' ; cd /var/tmp; tar cvzf backupfile.sql.gz \$dbhost1.\$dbname*.sql
backupfile.sql.tgz
経験豊富なユーザーがこれが圧縮tarファイルであることをよりよく理解できるように、出力ファイル名の代わりに使用します。rm \$dbhost1.\$dbname*.sql
中間ファイルを削除するために追加できます。zip
圧縮tarの代替品を使用できます。- なぜそんなセリフを作りたかったのかわかりません。ただコマンドを実行するには、この行をスクリプトに入れてそこから実行する必要があります。
tar
これらの操作(、、)に「一般的な」ツールを使用すると、zip
中間ファイルをバイパスする方法がわかりません。
付録
中間ファイルが実際に必要でない場合(そして出力がメモリに適していると仮定すると)、次のPythonプログラムのようなことを試すことができます。 oneliner( ) で書くこともできますが、python -c "from subprocess import checkout; from cStr....
実際にはお勧めできません。
from subprocess import check_output
from cStringIO import StringIO
import tarfile
outputdata = [
('$dbhost1.$dbname1.sql', '$dbname1'),
('$dbhost1.$dbname2.sql', '$dbname2'),
('$dbhost1.$dbname3.sql', '$dbname3'),
('$dbhost1.$dbname4.sql', '$dbname4'),
]
with tarfile.open('/var/tmp/backupfile.sql.tgz', 'w:gz') as tgz:
for outname, db in outputdata:
cmd = ['mysqldump', '--opt', '--databases']
cmd.append(db)
cmd.extend(['--host=$dbhost1', '--user=$dbuser1', '--password=$dbpass1'])
out = check_output(cmd)
buf = StringIO(out)
buf.seek(0)
tarinfo = tarfile.TarInfo(name=outname)
tarinfo.size = len(out)
tgz.addfile(tarinfo=tarinfo, fileobj=buf)
データベースと「出力」名の規則性に応じて、さらに改善できます。