ฉันได้ทำงานกับสคริปต์ทุบตีด้านล่างที่พยายามรวบรวมคำแนะนำที่ดีทั้งหมดที่ฉันเคยเห็นเมื่อพูดถึงการถ่ายโอนข้อมูล / คืนค่าด้วย 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
mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'