mysqldumps 명령을 연결하여 단일 gzip 압축 파일 출력

mysqldumps 명령을 연결하여 단일 gzip 압축 파일 출력

이 일련의 명령이 있다고 가정 해 봅시다.

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

단 한 줄의 코드를 사용하여 어떻게 모든 출력(출력 이름이 $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

또는 한 줄로:

( 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)

데이터베이스와 "출력" 이름의 규칙성에 따라 더 개선할 수 있습니다.

관련 정보