मैं नीचे इस बैश स्क्रिप्ट पर काम कर रहा हूं जो उन सभी अच्छी सलाहों को एक साथ रखने की कोशिश करता है जो मैंने देखा है जब यह myqql के साथ डंप / रीस्टोर करने की बात आती है। यह सुदूर संचालन पर लक्षित है।
बस varf reconfig और यह एक कोशिश दे। :)
विशेषताएं हैं:
- आप डंप करने के लिए तालिकाओं की एक सूची पारित कर सकते हैं (चयनात्मक डंप)
- आपको पासवर्ड (MySQL / SSH) के लिए संकेत दिया जा सकता है या उन्हें चर में सेट किया जा सकता है
- नेटवर्क ट्रांसमिशन gzipped है
- आप रिमोट सर्वर पर gzipped डंप को बचाने का विकल्प चुन सकते हैं
- आप दूरस्थ-ऑन-द-फ्लाई (स्थानीय / दूरस्थ सर्वर पर कोई अस्थायी फ़ाइलों को डंप कर सकते हैं)
- आपके पास क्या हो रहा है की दृश्य प्रतिक्रिया है (प्रतिध्वनि और धन्यवाद के लिए)
- आप डंप प्रक्रिया से पहले और बाद में mysql वैरिएबल सेट कर सकते हैं
क्या सुधार की जरूरत है:
- आपको तालिकाओं की एक सूची पारित करने की आवश्यकता है (सभी तालिकाएँ डंप नहीं कर सकते)
- MySQL पासवर्ड स्रोत और लक्ष्य के लिए समान हैं
- आपको मैन्युअल रूप से PRIVILEGES की आवश्यकता है (ऐसा लगता है कि MySQL इसे दूरस्थ रूप से न करें)
- आपको sshpass इंस्टॉल करना होगा
- कुछ निर्दोष विशाल संकुचित तालिकाओं को डंप करने के लिए धीमा है (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
mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'