שאלה mysqldump כדי tar.gz


בדרך כלל לאחר השלכת מסד נתונים MySQL עם mysqldump הפקודה אני מיד זפת / 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

או אפילו טוב יותר (מכיוון שאני בדרך כלל scp'ing את הקובץ dump לשרת אחר):

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

אני רץ על דביאן.


80
2018-01-26 23:15






תשובות:


mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

אתה לא יכול להשתמש זפת בצינור כזה, ואתה לא צריך את זה בכל מקרה, כפי שאתה רק outputting קובץ יחיד. זפת שימושית רק אם יש לך מספר קבצים.


98
2018-01-26 23:24



אתה צודק על כך שאתה לא צריך זפת, אבל אתה יכול להשתמש בו בצינור אם אתה עושה, עם mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
האם זה באמת עובד? אני די בטוח זפת צריך רשימה של שמות קבצים לעבוד על. - James
אני מעודכן את זה לעבוד באופן מקומי (לא בשרת ssh מרחוק) אה, ואני משתמש בשם דינמי מבוסס על תאריך, תודה על הפוסטר המקורי & משיב! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake: אינך צריך להשתמש ב'חתול 'אם הוא מקומי. רק gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
רק בשביל הכיף, אתה יכול להשתמש netcat במקום צנרת. אתה יכול לחסוך קצת על הצפנה מעל ssh, אם זה מועבר על פני רשת מאובטחת (או לא אכפת לך אבטחה). כיום ייתכן גם לשקול שימוש xz במקום gzip. - James


אם אתה מפעיל את זה מקומי רק להשתמש בפקודה הבאה גיבוי מסד הנתונים שלך & zip אותו באמצעות gzip:

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

(עריכה: מקש קבוע)


37
2018-02-29 10:28



כן, זהו הפתרון הפשוט ביותר. גם אני משתמשת בו. - Roman Snitko
פשוט וקל לשימוש! תודה! - SPRBRN
זה כנראה צריך להיות gzip -c, ימין? - pilsetnieks
נחמד ... אבל איך אני להפנות stderr בפקודה זו? אם אני מוסיף 2> / dev / null זה לא עובד יותר. ו 2 / / dev / null לפני הצינור לא עובד גם. - Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz - undefine


השתמש בצינור בעל שם.

mkfifo mysql_pipe
gzip -9 -c < mysql_pipe > name_of_dump.gz &
mysqldump database > mysql_pipe 
rm mysql_pipe

אני משתמש בו כל הזמן, it'a מדהים.

http://en.wikipedia.org/wiki/Named_pipe


18
2018-02-03 17:27



ג'יימס עושה את אותו הדבר בשורה אחת. - Jon Haddad
.. אבל ללמוד על צינורות בשם שווה את זה :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe שם, שורה אחת. כמובן שהייתי שומר את הצינור מסביב ולהשתמש בו בכל פעם. - d34dh0r53


כתבתי סקריפט מהיר למצוץ מסד נתונים MySQL מרחוק. הוא משתמש דחיסה Mysql, דחיסת gzip ו SSH. מצץ למטה מסד נתונים רב GB בקצב מדהים.

    ssh -C user@host "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz

יתרון צד זה לא דורש מקום פנוי בשרת מסד הנתונים המקור, כך שאתה יכול להשתמש בו כדי גיבוי מסד נתונים בשרת עם אפס שטח דיסק פנוי לפני הולך גיזום הנתונים שלך.

מקווה שזה עוזר למישהו.


15
2018-06-18 15:52



יצרתי סקריפט מעטפת פשוט: #! / Bin / bash אם [-z "$ 1"]; ולאחר מכן הד "שימוש: $ {0} [מארח] [משתמש] [מסד נתונים] [outputFile]" יציאה נוספת HOST = $ 1 Fi אם [-z "$ 2"]; ולאחר מכן הד "שימוש: $ {0} $ {1} [משתמש] [מסד נתונים] [outputFile]" יציאה אחרת USER = $ 2 Fi אם [-z "$ 3"]; ולאחר מכן הד "שימוש: $ {0} $ {1} $ {2} [מסד נתונים] [outputFile]" יציאה אחרת DB = $ 3 Fi אם [-z "$ 4"]; ואז OUTFILE = "$ {DB} .qql.gz" אחר OUTFILE = $ 4 $ 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 דוחסת את הנתונים בתהליך השרת מיד decompresses שוב (אם mysqldump מופעל על שרת ה- DB עצמו). האפשרות C-ssh מפעילה דחיסה gzip אשר יבזבז מחזורי CPU נוספים, כי הנתונים כבר gzipped בשלב זה. - MattW.


להשתמש 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

5
2017-08-20 23:08





נסה את זה:

mysqldump --all-databases --password=dbpassword | gzip -c | ssh user@servername "cat >/tmp/filename_of_your_choice.gz"

בבקשה לא כי אני לא טוב בכל הדברים האלה, אני רק בשילוב 2 אפשרויות באינטרנט לתוך אחד.

זה יכול בהחלט להיות טוב יותר בדרך אחרת, אבל זה אחד אניה זה עובד בשבילי.

אבל זה דורש ssh.keys כדי להיות מותקן ומקובל אם אתה רוצה להשתמש בו סקריפטים או crontab או כאחד.


3
2018-04-15 21:08



ברוכים הבאים ל - ServerFault. זה נראה לי הגיוני לחלוטין. - chicks


תוכל לעשות כך:

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


2
2018-03-10 08:45





אני עובדת על זה סקריפט באש מתחת זה מנסה להרכיב את כל עצות טובות שראיתי כשמדובר dump / לשחזר עם MySQL. הוא ממוקד פעולות מרחוק.

רק reconfig Vars ולנסות את זה. :)

התכונות הן:

  • אתה יכול להעביר רשימה של שולחנות לזרוק (מזבלה סלקטיבית)
  • אתה יכול להיות מתבקש עבור סיסמאות (MySQL / SSH) או להגדיר אותם משתנים
  • רשת השידור הוא gzipped
  • אתה יכול לבחור לשמור dump gzipped לשרת מרוחק
  • אתה יכול reimport dump לשרת מרחוק ב- the-fly (אין קבצי זמני על שרת מקומי / מרוחק)
  • יש לך משוב חזותי של מה שקורה (הודות הד pv)
  • אתה יכול להגדיר משתני MySQL לפני ואחרי תהליך dump

מה צריך שיפור: 

  • אתה צריך לעבור רשימה של טבלאות (לא יכול לזרוק את כל השולחנות)
  • סיסמת MySQL זהים עבור המקור והיעד
  • אתה צריך להעניק PRIVILEGES ידנית (נראה כמו MySQL dont לתת לעשות את זה מרחוק)
  • אתה צריך להתקין sshpass
  • כמה innodb ענק שולחנות דחוסים איטי לזרוק (עשוי להיות mysqldump של תקלה)

אני משתף את התסריט כאן בתקווה שזה יכול להיות משופר על ידי הקהילה. (הטוב ביותר שנצפו עם ננו או עורך אחר הצבעים את הקוד)

--------------------------------- חתוך כאן --------------- -------------------

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

1
2018-04-03 01:33