tar.gz로 mysqldump


88

일반적으로 mysqldump명령 으로 MySQL 데이터베이스를 덤프 한 후 결과 파일을 즉시 tar / gzip합니다. 하나의 명령 으로이 작업을 수행하는 방법을 찾고 있습니다.

그래서 이것으로부터 :

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

또는 덤프 파일을 다른 서버로 scping하기 때문에 더 좋습니다.

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

데비안에서 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'
Darren Chamberlain

실제로 작동합니까? tar가 작동하려면 파일 이름 목록이 필요하다고 확신합니다.
James

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
제임스

재미로, netcatssh로 배관 하는 대신 사용할 수 있습니다 . 보안 네트워크를 통해 전송되거나 보안에 신경 쓰지 않으면 ssh의 암호화 오버 헤드를 약간 절약해야합니다. 요즘에는 xz대신 대신 사용을 고려할 수도 있습니다 gzip.
James

45

로컬로 실행하는 경우 다음 명령을 사용하여 데이터베이스를 백업하고 gzip을 사용하여 압축하십시오.

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

(편집 : 고정 -c 키)


2
예, 이것이 가장 간단한 해결책입니다. 나도 사용합니다.
로마 Snitko

2
아마해야 gzip -c오른쪽?
pilsetnieks

좋은 ...하지만이 명령에서 stderr을 어떻게 리디렉션합니까? 2> / dev / null을 추가하면 더 이상 작동하지 않습니다. 파이프가 작동하기 전에 2> / dev / null도 작동하지 않습니다.
Nelson Teixeira

mysqldump -u userName -p (암호 프롬프트) 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
제임스는 한 줄에서 같은 일을합니다.
Jon Haddad 2012

15
.. 그러나 명명 된 파이프에 대해 배우는 것은 가치가 있습니다 :-)
Tomasz Zieliński

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe한 줄로 물론 파이프를 유지하고 매번 사용합니다.
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} [호스트] [사용자] [데이터베이스] [outputFile]"echo else HOST = $ 1 fi if [-z "$ 2"]; 그런 다음 "사용 : $ {0} $ {1} [user] [database] [outputFile]"echo else USER = $ 2 fi if [-z "$ 3"]; 그런 다음 "사용 : $ {0} $ {1} $ {2} [데이터베이스] [outputFile]"echo else [-z "$ 4"] 인 경우 DB = $ 3 fi; OUTFILE = "$ {DB} .sql.gz"else 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

이러한 압축 중 두 가지는 쓸모가 없습니다. mysqldump 옵션은 서버 프로세스의 데이터를 압축하고 즉시 다시 압축 해제합니다 (mysqldump가 DB 서버 자체에서 실행되는 경우). ssh에 대한 -C 옵션은 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"

나는이 일에 능숙하지 않다는 것을 말하지 말고 웹의 두 가지 옵션을 하나로 결합했습니다.

다른 방법으로는 더 좋을 수도 있지만 이것은 나를 위해 일하는 라이너입니다.

그러나 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

나는이 bash 스크립트를 작성 하여 mysql로 ​​덤프 / 복원 할 때 본 모든 좋은 조언을 모 으려고 노력하고있다. 원격 작업을 대상으로합니다.

vars를 재구성하고 사용해보십시오. :)

특징은 다음과 같습니다.

  • 덤프 할 테이블 목록을 전달할 수 있습니다 (선택적 덤프)
  • 암호 (MySQL / SSH)를 묻거나 변수로 설정할 수 있습니다
  • 네트워크 전송이 끊김
  • gzipped 덤프를 원격 서버에 저장하도록 선택할 수 있습니다
  • 원격 서버로 덤프를 다시 가져올 수 있습니다 (로컬 / 원격 서버에 임시 파일 없음).
  • 당신은 무슨 일이 일어나고 있는지에 대한 시각적 피드백을 가지고 있습니다 (에코와 pv 감사합니다)
  • 덤프 프로세스 전후에 mysql 변수를 설정할 수 있습니다

개선이 필요한 것 :

  • 테이블 목록을 전달해야합니다 (모든 테이블을 덤프 할 수 없음)
  • MySQL 비밀번호는 소스와 대상에 동일합니다
  • PRIVILEGES를 수동으로 부여해야합니다 (MySQL이 원격으로 수행하지 않는 것처럼 보입니다)
  • sshpass를 설치해야합니다
  • 일부 innodb 거대한 압축 테이블은 덤프 속도가 느립니다 (mysqldump의 결함 일 수 있습니다)

이 스크립트는 커뮤니티에서 개선 할 수 있기를 바랍니다. (코드를 색칠하는 nano 또는 다른 편집기에서 가장 잘 볼 수 있습니다)

---------------------------------- 여기 잘라 --------------- -------------------

#!/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.