mysqldump เป็น tar.gz


88

โดยปกติหลังจากทิ้งฐานข้อมูล MySQL ด้วยmysqldumpคำสั่งฉันทันที 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

หรือดียิ่งขึ้น (เนื่องจากฉันมักจะสแกนไฟล์การถ่ายโอนไปยังเซิร์ฟเวอร์อื่น):

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

ฉันกำลังทุบตีกับเดเบียน

คำตอบ:


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
James

เพื่อความสนุกคุณสามารถใช้netcatแทนการส่งไปยัง ssh คุณจะประหยัดค่าใช้จ่ายเล็กน้อยในการเข้ารหัสหากมีการถ่ายโอนผ่านเครือข่ายที่ปลอดภัย (หรือคุณไม่สนใจเกี่ยวกับความปลอดภัย) ปัจจุบันคุณยังอาจพิจารณาใช้แทนxz gzip
James

45

หากคุณใช้งานเครื่องนี้อยู่ในเครื่องให้ใช้คำสั่งต่อไปนี้เพื่อสำรองฐานข้อมูล & zip โดยใช้ gzip:

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

(แก้ไข: รหัสคงที่ -c)


2
ใช่นี่เป็นทางออกที่ง่ายที่สุด ฉันก็ใช้มันเช่นกัน
Roman Snitko

2
มันน่าจะgzip -cใช่มั้ย
pilsetnieks

ดี ... แต่ฉันจะเปลี่ยนเส้นทาง stderr ในคำสั่งนี้ได้อย่างไร ถ้าฉันผนวก 2> / dev / null มันจะไม่ทำงานอีกต่อไป และ 2> / dev / null ก่อนที่ไพพ์จะไม่ทำงานเช่นกัน
เนลสัน Teixeira

mysqldump -u ชื่อผู้ใช้ -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz
กำหนด

ฉันใช้ like 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
เจมส์ทำสิ่งเดียวกันใน 1 บรรทัด
Jon Haddad

15
.. แต่การเรียนรู้เกี่ยวกับชื่อ pipes มีค่า :-)
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 ถ้า [-z "$ 1"]; echo "การใช้งาน: $ {0} [โฮสต์] [ผู้ใช้] [ฐานข้อมูล] [outputFile]" ออกจากโฮสต์อื่น = $ 1 fi ถ้า [-z "$ 2"]; echo "การใช้งาน: $ {0} $ {1} [ผู้ใช้] [ฐานข้อมูล] [outputFile]" ออกจากผู้ใช้ USER = $ 2 fi ถ้า [-z "$ 3"]; echo "การใช้งาน: $ {0} $ {1} $ {2} [ฐานข้อมูล] [outputFile]" ออกจากฐานข้อมูลอื่น = $ 3 fi ถ้า [-z "$ 4"]; ดังนั้น OUTFILE = "$ {DB} .sql.gz" else OUTFILE = $ 4 fi คำสั่ง = "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 เอง) ตัวเลือก -C เพื่อ ssh เปิดใช้งานการบีบอัด gzip ซึ่งจะทำให้เสียรอบ CPU เพิ่มเติมเนื่องจากข้อมูลถูก gzipped ที่จุดนั้น
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"

โปรดอย่าว่าฉันเป็นคนที่ดีในสิ่งเหล่านี้ฉันเพิ่งรวม 2 ตัวเลือกบนเว็บไว้ในที่เดียว

มันอาจจะดีกว่าในทางอื่น แต่นี่เป็นหนึ่งซับที่เหมาะกับฉัน

อย่างไรก็ตามไม่จำเป็นต้อง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

ฉันได้ทำงานกับสคริปต์ทุบตีด้านล่างที่พยายามรวบรวมคำแนะนำที่ดีทั้งหมดที่ฉันเคยเห็นเมื่อพูดถึงการถ่ายโอนข้อมูล / คืนค่าด้วย mysql มันมีเป้าหมายที่การดำเนินงานระยะไกล

เพียงตั้งค่า vars ใหม่และทดลองใช้ :)

คุณสมบัติคือ:

  • คุณสามารถส่งรายการของตารางเพื่อถ่ายโอนข้อมูล (เลือกถ่ายโอนข้อมูล)
  • คุณสามารถขอรหัสผ่าน (MySQL / SSH) หรือตั้งเป็นตัวแปร
  • การส่งผ่านเครือข่าย gzipped
  • คุณสามารถเลือกที่จะบันทึกการถ่ายโอนข้อมูล gzipped ไปยังเซิร์ฟเวอร์ระยะไกล
  • คุณสามารถอิมพอร์ตดัมพ์ไปยังเซิร์ฟเวอร์รีโมต on-the-fly อีกครั้ง (ไม่มีไฟล์ temp บนเซิร์ฟเวอร์โลคัล / รีโมต)
  • คุณมีความเห็นย้อนกลับว่าเกิดอะไรขึ้น (ขอบคุณ echo และ pv)
  • คุณสามารถตั้งค่าตัวแปร mysql ก่อนและหลังกระบวนการถ่ายโอนข้อมูล

สิ่งที่ต้องปรับปรุง:

  • คุณต้องผ่านรายการของตาราง (ไม่สามารถถ่ายโอนข้อมูลทุกตาราง)
  • รหัสผ่าน MySQL นั้นเหมือนกันสำหรับแหล่งที่มาและเป้าหมาย
  • คุณต้องให้สิทธิ์แก่ตนเอง (ดูเหมือนว่า 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.