سؤال mysqldump إلى tar.gz


عادة بعد إغراق قاعدة بيانات 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

أنا أعمل باش على ديبيان.


80
2018-01-26 23:15


الأصل




الأجوبة:


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

لا يمكنك استخدام tar في أنبوب مثل هذا ، ولا تحتاج إليه على أي حال ، لأنك تقوم بإخراج ملف واحد فقط. القطران مفيد فقط إذا كان لديك ملفات متعددة.


98
2018-01-26 23:24



أنت على حق في عدم الحاجة إلى القطران ، ولكن يمكنك استخدامه في خط الأنابيب إذا فعلت ذلك mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
هل هذا فعلا العمل؟ أنا متأكد من القطران يحتاج إلى قائمة من أسماء الملفات للعمل عليها. - James
لقد قمت بتحديث هذا للعمل محليًا (وليس على خادم ssh عن بعد) oh ، واستخدم اسمًا ديناميكيًا استنادًا إلى التاريخ ، وذلك بفضل الملصق والأصعب الأصليين! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
electblake: لست بحاجة إلى استخدام "cat" إذا كان محليًا. مجرد gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
فقط للمتعة ، يمكنك استخدامها netcat بدلا من الأنابيب إلى سه. يمكنك توفير القليل على عبء تشفير ssh ، إذا كان يتم نقله عبر شبكة آمنة (أو لا تهتم بالأمان). في الوقت الحاضر قد تفكر في استخدام xz بدلا من gzip. - James


إذا كنت تقوم بتشغيل هذا محليًا ، فاستخدم الأمر التالي للنسخ الاحتياطي لقاعدة البيانات الخاصة بك وقم بضغطها باستخدام gzip:

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

(تحرير: مفتاح ثابت -c)


37
2018-02-29 10:28



نعم ، هذا هو الحل الأكثر بساطة. أنا استخدمها أيضا. - Roman Snitko
بسيطة وسهلة الاستخدام! شكر! - SPRBRN
ربما ينبغي أن يكون gzip -c، حق؟ - pilsetnieks
لطيف ... ولكن كيف يمكنني إعادة توجيه stderr في هذا الأمر؟ إذا قمت بإلحاق 2> / dev / null لم يعد يعمل. و 2> / dev / فارغة قبل أن لا يعمل الأنبوب أما. - 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 عن بعد. ويستخدم ضغط الخلية ، ضغط GZIP و ssh. امتص أسفل قاعدة بيانات متعددة GB بمعدل لا يصدق.

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

الميزة الجانبية هي أنه لا يتطلب مساحة خالية على خادم قاعدة البيانات المصدر ، بحيث يمكنك استخدامه لعمل نسخة احتياطية من قاعدة بيانات على خادم مع مساحة خالية خالية من القرص قبل الدخول في تشذيب البيانات الخاصة بك.

آمل أن يساعد شخص ما.


15
2018-06-18 15:52



لقد قمت بإنشاء برنامج نصي بسيط يحتوي على shell: #! / bin / bash إذا كان [-z "$ 1"]؛ ثم صدى "Usage: $ {0} [host] [user] [database] [outputFile]" exit else HOST = $ 1 fi if [-z "$ 2"]؛ ثم صدى "الاستخدام: $ {0} $ {1} [مستخدم] [قاعدة بيانات] [outputFile]" exit else USER = $ 2 fi if [-z "$ 3"]؛ ثم صدى "الاستخدام: $ {0} $ {1} $ {2} [database] [outputFile]" exit else DB = $ 3 fi if [-z "$ 4"]؛ ثم OUTFILE = "$ {DB} .sql.gz" آخر 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 نفسه). يقوم الخيار -C to ssh بتنشيط ضغط gzip الذي سيضيع المزيد من دورات CPU لأن البيانات مفعّلة بالفعل عند هذه النقطة. - MattW.


استعمال pv ومراقبة معدل!

mysqldump prod_db -h dbslave | pv | gzip -c > prod_2012_08_20.dump.tgz

أو إذا كنت تعرف الحجم (3 غيغابايت) ، احصل على تقدير دقيق:

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"

من فضلك لا أكون جيدًا بأي حال من الأحوال في هذه الأشياء ، لقد جمعت بين خيارين على الويب في واحد.

قد يكون من الأفضل للغاية بطريقة أخرى ولكن هذا هو واحد بطانة الذي يعمل بالنسبة لي.

ومع ذلك يتطلب 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





أنا أعمل على هذا برنامج باش النصي أدناه يحاول أن يضع كل النصائح الجيدة التي رأيتها عندما يتعلق الأمر بالتفريغ / الاستعادة باستخدام mysql. يتم استهدافها في العمليات عن بعد.

فقط إعادة تكوين vars ومحاولة إعطائها. :)

الميزات هي:

  • يمكنك تمرير قائمة الجداول تفريغ (تفريغ انتقائي)
  • يمكنك المطالبة بكلمة مرور (MySQL / SSH) أو تعيينها في المتغيرات
  • نقل الشبكة هو gzipped
  • يمكنك اختيار حفظ تفريغ gzipped إلى ملقم بعيد
  • يمكنك إعادة تفريغ إلى ملقم بعيد على ذبابة (لا توجد ملفات مؤقتة على الملقم المحلي / البعيد)
  • لديك ملاحظات مرئية لما يحدث (بفضل الصدى و pv)
  • يمكنك ضبط متغيرات mysql قبل وبعد عملية التفريغ

ما يحتاج إلى تحسين: 

  • تحتاج إلى تمرير قائمة الجداول (لا يمكن تفريغ جميع الجداول)
  • كلمة مرور MySQL هي نفسها للمصدر والهدف
  • تحتاج إلى منح الامتيازات يدويًا (يبدو أن MySQL لا تدعها تفعل ذلك عن بُعد)
  • تحتاج إلى تثبيت 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