mysqldump to a tar.gz


88

সাধারণত একটি মাইএসকিউএল ডাটাবেস mysqldumpকমান্ডের সাথে ডাম্প করার পরে আমি তত্ক্ষণাত ফলাফল ফাইলটি ট্যারি / জিজিপ করি। আমি এক আদেশে এটি করার উপায় খুঁজছি:

সুতরাং এটি থেকে:

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'

আপনি এটির মতো পাইপে টার ব্যবহার করতে পারবেন না এবং আপনার এটির কোনও প্রয়োজন নেই, কারণ আপনি কেবল একটি একক ফাইল আউটপুট করছেন। আপনার যদি একাধিক ফাইল থাকে তবে কেবল টারটি কার্যকর।


6
আপনি ডান প্রয়োজন না সম্পর্কে সঠিক, কিন্তু আপনি যদি পাইপলাইনে এটি ব্যবহার করতে পারেন, সাথেmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
ড্যারেন চেম্বারলাইন

আসলে কি কাজ করে? আমি বেশ নিশ্চিত যে তার কাজের জন্য ফাইলের নামের একটি তালিকা প্রয়োজন।
জেমস

2
আমি এটিকে স্থানীয়ভাবে (রিমোট এসএসএস সার্ভারে নয়) কাজ করার জন্য আপডেট করেছি এবং আমি পোস্টের ভিত্তিতে ডাইনামিক নামটি ব্যবহার করি, মূল পোস্টার এবং উত্তরদাতাকে ধন্যবাদ! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
ইলেক্টব্লেক

4
@ ইলেক্টব্লেক: এটি যদি স্থানীয় হয় তবে আপনার 'বিড়াল' ব্যবহার করার দরকার নেই। ঠিকgzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
জেমস

কেবল মজাদার জন্য, আপনি netcatএসপিএসের পরিবর্তে পাইপিং ব্যবহার করতে পারেন । আপনি যদি কোনও সুরক্ষিত নেটওয়ার্কের মাধ্যমে স্থানান্তরিত হয় (বা আপনি সুরক্ষার বিষয়ে চিন্তা করেন না) তবে আপনি এসএসএসের এনক্রিপশন ওভারহেডে কিছুটা সংরক্ষণ করতে পারবেন। আজকাল আপনি এর xzপরিবর্তে ব্যবহার বিবেচনা করতে পারেন gzip
জেমস

45

আপনি যদি স্থানীয়ভাবে এটি চালাচ্ছেন তবে আপনার ডাটাবেসটি ব্যাকআপ করতে এবং gzip ব্যবহার করে জিপ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

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

(সম্পাদনা: নির্দিষ্ট-সি কী)


2
হ্যাঁ, এটি সবচেয়ে সহজ সমাধান simple আমিও এটি ব্যবহার করি।
রোমান স্নিটকো

2
এটা সম্ভবত হওয়া উচিত gzip -c, তাই না?
পাইলসেটনিক্স

সুন্দর ... তবে আমি এই কমান্ডে স্টাডারকে কীভাবে পুনর্নির্দেশ করব? যদি আমি 2> / dev / নাল সংযোজন করি তবে এটি আর কাজ করে না। এবং 2> / dev / নাল পাইপের আগে কোনও কাজ করে না।
নেলসন টিক্সিরা

mysqldump -u ব্যবহারকারীর নাম -p (পাসওয়ার্ডপ্রম্পট) আপনার ডেটাবেসনেম 2> / var / লগ / ডাম্প-ত্রুটি | gzip, -v> output.gz
undefine

আমি mysqldump -u root -p ডাটাবেস - routines এর মতো ব্যবহার করছি gzip -v> myfile.sql.gz ... আমি একটি অংশ .gz ফাইল পেয়েছি যা আমি ডাউনলোড করতে পারছি না
সুশীবাম

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 লাইনে করে।
জন হাদাদাদ

15
.. তবে নামযুক্ত পাইপগুলি সম্পর্কে জানার পক্ষে এটি মূল্যবান :-)
টমাসজ জিলিয়েস্কি

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipeসেখানে, এক লাইন অবশ্যই আমি পাইপটি প্রায় রাখতাম এবং প্রতিবার ব্যবহার করতাম।
d34dh0r53

15

আমি একটি রিমোট মাইএসকিএল ডাটাবেস চুষতে একটি দ্রুত স্ক্রিপ্ট লিখেছি। এটি মাইএসকিএল সংক্ষেপণ, জিজিপ এবং এসএসএস সংক্ষেপণ ব্যবহার করে। অবিশ্বাস্য হারে একাধিক জিবি ডাটাবেস সাফল্য পেয়েছে।

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

একটি পার্শ্ব সুবিধা হ'ল এটি উত্স ডাটাবেস সার্ভারে কোনও মুক্ত স্থানের প্রয়োজন নেই, তাই আপনি আপনার ডেটা ছাঁটাই করার আগে শূন্য ফ্রি ডিস্ক স্পেস সহ একটি সার্ভারে একটি ডাটাবেস ব্যাকআপ করতে এটি ব্যবহার করতে পারেন।

আশা করি এটি কারও সাহায্য করবে।


আমি একটি সহজ শেল স্ক্রিপ্ট তৈরি করেছি: #! / বিন / বাশ যদি [-z "$ 1"]; তারপরে "ব্যবহার: $ {0} [হোস্ট] [ব্যবহারকারী] [ডাটাবেস] [আউটপুট ফাইল]" প্রস্থান করুন অন্য কোনও HOST = $ 1 ফাই যদি [-z "$ 2"]]; তারপরে "ব্যবহার: $ {0} $ {1} [ব্যবহারকারী] [ডাটাবেস] [আউটপুটফিল]" অন্য প্রস্থান থেকে প্রস্থান করুন USER = $ 2 ফাই যদি [-z "$ 3"]; তারপরে "ব্যবহার: $ {0} $ {1} $ {2} [ডাটাবেস] [আউটপুটফিল]" প্রস্থান করুন অন্য ডিবি = $ 3 ফাই যদি [-z "$ 4"]]; তারপরে OUTFILE = "$ {DB} .sql.gz" অন্যথায় OUTFILE = $ 4 ফাই COMMAND = "ssh -C {{ব্যবহারকারী} @ $ O HOST} \" mysqldump --opt {B DB} | gzip -9 -c \ "> $ UT আউটফিল}" ssh -C $ {ব্যবহারকারী} @ $ O হোস্ট} "mysqldump --opt $ B DB} | gzip -9 -c"> $ UT আউটফিল}
টনি ডিলন

এই সংকোচনের মধ্যে দুটি অকেজো: মাইএসকিএলডাম্পের বিকল্পটি সার্ভার প্রসেসের ডেটা সংকুচিত করে এবং তত্ক্ষণাত্ পুনরায় সংক্রামিত হয়ে যায় (যদি মাইএসকিএলডাম্প নিজেই ডিবি সার্ভারে চালিত হয়)। এসএস-এর বিকল্প বিকল্পটি জিজিপ সংকোচনকে সক্রিয় করে যা আরও সিপিইউ-চক্রগুলি নষ্ট করবে কারণ ডেটা ইতিমধ্যে সেই সময়ে জিজেপ করা হয়েছে।
ম্যাটডাব্লু

5

ব্যবহার 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

4

এটা চেষ্টা কর:

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

দয়া করে মনে করবেন না যে আমি এই বিষয়গুলিতে কোনওভাবেই ভাল নই, আমি কেবল ওয়েবে 2 টি বিকল্পকে এক সাথে সংযুক্ত করেছি।

এটি অন্য কোনও উপায়ে খুব ভাল হতে পারে তবে এটি আমার পক্ষে কাজ করে এমন একটি ওয়ান লাইনার।

তবে ssh.keysআপনি যদি এটি স্ক্রিপ্টগুলিতে crontabবা একইভাবে ব্যবহার করতে চান তবে এটি ইনস্টল এবং স্বীকৃত হওয়া প্রয়োজন ।


1
সার্ভারফল্টে আপনাকে স্বাগতম। এটি আমার কাছে পুরোপুরি যুক্তিসঙ্গত মনে হচ্ছে।
মেয়ে

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

আমি নীচে এই বাশ স্ক্রিপ্টে কাজ করছি যা মাইএসকিএল দিয়ে ডাম্প / পুনরুদ্ধার করার সময় আমি যে সমস্ত ভাল পরামর্শ দেখেছি সেগুলি একসাথে রাখার চেষ্টা করে। এটি দূরবর্তী অপারেশনগুলিতে লক্ষ্যযুক্ত।

কেবল ভারগুলি পুনরায় কনফিগার করুন এবং একবার ব্যবহার করে দেখুন। :)

বৈশিষ্ট্যগুলি হ'ল:

  • আপনি ডাম্প টেবিলের একটি তালিকা পাস করতে পারেন (নির্বাচনী ডাম্প)
  • আপনাকে পাসওয়ার্ডগুলির জন্য অনুরোধ করা যেতে পারে (মাইএসকিউএল / এসএসএইচ) বা এগুলি ভেরিয়েবলগুলিতে সেট করতে পারেন
  • নেটওয়ার্ক ট্রান্সমিশন gzip হয়
  • আপনি রিমোট সার্ভারে জিজেপড ডাম্প সংরক্ষণ করতে বেছে নিতে পারেন
  • আপনি অন-ফ্লাইতে রিমোট সার্ভারে ডাম্পের পুনঃবন্দর করতে পারেন (স্থানীয় / দূরবর্তী সার্ভারে কোনও টেম্প ফাইল নেই)
  • আপনার যা ঘটছে তার ভিজ্যুয়াল প্রতিক্রিয়া রয়েছে (প্রতিধ্বনি এবং পিভিতে ধন্যবাদ)
  • আপনি ডাম্প প্রক্রিয়া আগে এবং পরে mysql ভেরিয়েবল সেট করতে পারেন

কি উন্নতি প্রয়োজন:

  • আপনাকে টেবিলগুলির একটি তালিকা পাস করতে হবে (সমস্ত টেবিল নিক্ষেপ করতে পারবেন না)
  • মাইএসকিউএল পাসওয়ার্ড উত্স এবং লক্ষ্য জন্য একই
  • আপনাকে ব্যক্তিগতভাবে ব্যক্তিগত অনুমতি দিতে হবে (মাইএসকিউএল দেখে মনে হচ্ছে এটি রিমোটে করা উচিত নয়)
  • আপনার sshpass ইনস্টল করা প্রয়োজন
  • কিছু ইন্নাডব বিশাল সংক্ষেপিত টেবিলগুলি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়ে যায় (মাইএসকিল্ডাম্পের ত্রুটি হতে পারে)

সম্প্রদায়টি আরও উন্নত হতে পারে এই আশায় আমি এখানে এই স্ক্রিপ্টটি ভাগ করছি। (ন্যানো বা কোডটিকে রঙ করে এমন অন্য সম্পাদকের সাথে সর্বাধিক দেখা)

--------------------------------- এখানে কাটো --------------- -------------------

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

আপনি একটি কনফিগার ফাইলে আপনার পাসওয়ার্ডও সঞ্চয় করতে পারেন এবং এই বিকল্পটি ব্যবহার করতে পারেন - ডিফল্টস-এক্সট্রা-ফাইল:

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.