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.