![mysqldumps 명령을 연결하여 단일 gzip 압축 파일 출력](https://linux55.com/image/32249/mysqldumps%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%97%B0%EA%B2%B0%ED%95%98%EC%97%AC%20%EB%8B%A8%EC%9D%BC%20gzip%20%EC%95%95%EC%B6%95%20%ED%8C%8C%EC%9D%BC%20%EC%B6%9C%EB%A0%A5.png)
이 일련의 명령이 있다고 가정 해 봅시다.
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)
데이터베이스와 "출력" 이름의 규칙성에 따라 더 개선할 수 있습니다.