INSIGHT เข้าสู่แบ็คแพ็คด้วย mysqldump
IMHO การสำรองข้อมูลกลายเป็นรูปแบบศิลปะมากขึ้นถ้าคุณรู้วิธีเข้าหามัน
คุณมีตัวเลือก
ตัวเลือกที่ 1: mysqldump อินสแตนซ์ mysql ทั้งหมด
นี่คือสิ่งที่ง่ายที่สุดไม่มีเกมง่ายๆ !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
ทุกอย่างที่เขียนในไฟล์เดียว: โครงสร้างตารางดัชนีทริกเกอร์ขั้นตอนการจัดเก็บผู้ใช้รหัสผ่านที่เข้ารหัส ตัวเลือก mysqldump อื่น ๆ ยังสามารถส่งออกสไตล์ที่แตกต่างของคำสั่ง INSERT ไฟล์บันทึกและพิกัดตำแหน่งจากบันทึกไบนารีตัวเลือกการสร้างฐานข้อมูลข้อมูลบางส่วน (ตัวเลือก - ที่ใดก็ได้) และอื่น ๆ
ตัวเลือกที่ 2: mysqldump แยกฐานข้อมูลออกเป็นไฟล์ข้อมูลแยกต่างหาก
เริ่มต้นด้วยการสร้างรายการฐานข้อมูล (2 เทคนิคในการทำสิ่งนี้)
เทคนิค 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
เทคนิค 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
เทคนิค 1 เป็นวิธีที่เร็วที่สุด เทคนิคที่ 2 นั้นแน่นอนที่สุดและปลอดภัยที่สุด เทคนิค 2 ดีกว่าเพราะบางครั้งผู้ใช้สร้างโฟลเดอร์เพื่อวัตถุประสงค์ทั่วไปใน / var / lib / mysql (datadir) ซึ่งไม่เกี่ยวข้องกับฐานข้อมูล information_schema จะลงทะเบียนโฟลเดอร์เป็นฐานข้อมูลในตาราง information_schema.schemata เทคนิค 2 จะข้ามโฟลเดอร์ที่ไม่มีข้อมูล mysql
เมื่อคุณรวบรวมรายชื่อของฐานข้อมูลคุณสามารถดำเนินการวนรอบรายการและ mysqldump ได้แม้ในแบบคู่ขนานหากต้องการ
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
หากมีฐานข้อมูลมากเกินไปที่จะเรียกใช้ในครั้งเดียวให้ทิ้งดัมพ์ไปทีละ 10 ในเวลาเดียวกัน:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
ตัวเลือก 3: mysqldump แยกตารางออกเป็นไฟล์ข้อมูลแยกต่างหาก
เริ่มต้นด้วยการสร้างรายการของตาราง
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
จากนั้นดัมพ์ตารางทั้งหมดในกลุ่ม 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
ตัวเลือก 4: ใช้จินตนาการของคุณ
ลองชุดรูปแบบของตัวเลือกข้างต้นรวมทั้งเทคนิคต่าง ๆ เพื่อทำความสะอาดสแนปชอต
ตัวอย่าง
- เรียงลำดับรายการตามขนาดของแต่ละตารางจากน้อยไปมากหรือมากไปน้อย
- โดยใช้กระบวนการแยกต่างหากให้เรียกใช้ "ตารางการล้างด้วย READ LOCK; SELECT SLEEP (86400)" ก่อนที่จะเรียกใช้ mysqldumps ฆ่ากระบวนการนี้หลังจาก mysqldumps เสร็จสมบูรณ์ สิ่งนี้มีประโยชน์หากฐานข้อมูลมีทั้ง InnoDB และ MyISAM
- บันทึก mysqldumps ในโฟลเดอร์เก่าและหมุนโฟลเดอร์สำรองเก่าออกไป
- โหลด mysqldumps ตัวอย่างทั้งหมดลงในเซิร์ฟเวอร์แบบสแตนด์อโลน
ข้อแม้
ทางเลือกที่ 1 นำทุกสิ่งมาให้ ข้อเสียคือ mysqldumps สร้างขึ้นด้วยวิธีนี้สามารถโหลดซ้ำในรุ่น majot รุ่นเดียวกันกับ mysql ที่สร้าง mysqldump ขึ้นมา กล่าวอีกนัยหนึ่ง mysqldump จากฐานข้อมูล MySQL 5.0 ไม่สามารถโหลดได้ใน 5.1 หรือ 5.5 เหตุผล ? schema ของ mysql นั้นแตกต่างกันโดยสิ้นเชิงระหว่างรุ่นใหญ่ ๆ
ตัวเลือกที่ 2 และ 3 ไม่รวมการบันทึกชื่อผู้ใช้และรหัสผ่าน
นี่คือวิธีทั่วไปในการถ่ายโอน SQL Grants สำหรับผู้ใช้ที่อ่านได้และพกพาได้มากกว่า
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
ตัวเลือก 3 ไม่บันทึกขั้นตอนการจัดเก็บดังนั้นคุณสามารถทำดังต่อไปนี้
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
ประเด็นที่ควรสังเกตอีกประการคือ InnoDB หากคุณมีพูลบัฟเฟอร์ InnoDB ขนาดใหญ่คุณควรล้างข้อมูลให้ดีที่สุดเท่าที่จะทำได้ก่อนทำการสำรองข้อมูลใด ๆ มิเช่นนั้น MySQL จะใช้ตารางการล้างข้อมูลในเวลาที่หน้าสกปรกที่เหลืออยู่ออกจากพูลบัฟเฟอร์ นี่คือสิ่งที่ฉันแนะนำ:
ประมาณ 1 ชั่วโมงก่อนดำเนินการสำรองข้อมูลให้รันคำสั่ง SQL นี้
SET GLOBAL innodb_max_dirty_pages_pct = 0;
ใน MySQL 5.5 ค่าเริ่มต้น innodb_max_dirty_pages_pct คือ 75. ใน MySQL 5.1 และด้านหลังค่าเริ่มต้น innodb_max_dirty_pages_pct คือ 90 โดยการตั้งค่า innodb_max_dirty_pages_pct เป็น 0 สิ่งนี้จะเร่งการล้างหน้าสกปรกไปยังดิสก์ วิธีนี้จะช่วยป้องกันหรือลดผลกระทบจากการล้างข้อมูลสองเฟสที่ไม่สมบูรณ์ของข้อมูล InnoDB ก่อนดำเนินการ mysqldump กับตาราง InnoDB ใด ๆ
คำสุดท้ายใน mysqldump
คนส่วนใหญ่อายที่อยู่ห่างจาก mysqldump เพื่อสนับสนุนเครื่องมืออื่น ๆ และเครื่องมือเหล่านั้นก็ดี
เครื่องมือดังกล่าวรวมถึง
- MAATKIT ( สคริปต์การถ่ายโอนข้อมูลแบบขนาน/ กู้คืนจาก Percona [คัดค้าน แต่ดีมาก])
- XtraBackup (การสำรองข้อมูล TopNotch Snapshot จาก Percona)
- CDP R1Soft ( ตัวเลือกโมดูล MySQLที่ถ่ายภาพในเวลา)
- การสำรองข้อมูล MySQL Enterprise (ชื่อเดิม InnoDB การสำรองข้อมูลยอดนิยม [เชิงพาณิชย์])
หากคุณมีจิตวิญญาณของ MySQL DBA ที่แท้จริงคุณสามารถกอด mysqldump และมีความเชี่ยวชาญอย่างสมบูรณ์เหนือกว่าที่สามารถบรรลุได้ อาจสำรองข้อมูลทั้งหมดของคุณจะสะท้อนให้เห็นทักษะของคุณเป็น MySQL DBA