ข้อมูลทั้งหมดคือ InnoDB
นี่คือสิ่งที่จะทำให้คุณได้รับข้อมูล ณ จุดเวลาที่แน่นอน:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
สร้างจุดตรวจสอบที่ช่วยให้การถ่ายโอนข้อมูลเพื่อรวบรวมข้อมูลทั้งหมดก่อนที่จะถึงจุดตรวจในขณะที่ได้รับการเปลี่ยนแปลงที่เข้ามา การเปลี่ยนแปลงขาเข้าเหล่านั้นไม่ได้เป็นส่วนหนึ่งของการถ่ายโอนข้อมูล ที่ช่วยให้มั่นใจว่าจุดในเวลาเดียวกันสำหรับตารางทั้งหมด
--routines
ดัมพ์โพรซีเดอร์ที่เก็บไว้ทั้งหมดและฟังก์ชันที่เก็บไว้
--triggers
ทิ้งทริกเกอร์ทั้งหมดสำหรับแต่ละตารางที่มี
ข้อมูลทั้งหมดคือ MyISAM หรือส่วนผสมของ InnoDB / MyISAM
คุณจะต้องกำหนดล็อกการอ่านระดับโลกดำเนินการ mysqldump และปลดล็อคระดับโลก
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
ให้มันลอง !!!
อัพเดท 2012-06-22 08:12 EDT
เนื่องจากคุณมีข้อมูลทั้งหมด <50MB ฉันมีตัวเลือกอื่น แทนที่จะเรียกใช้คำสั่ง SLEEP เป็นพื้นหลังเพื่อเก็บล็อกการอ่านส่วนกลางสำหรับ 86400 วินาที (ที่ 24 ชั่วโมง) เพียงเพื่อรับ ID กระบวนการและกำจัดข้างนอกลองตั้งค่าไทม์เอาต์ 5 วินาทีใน mysql แทนใน OS:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
นี่เป็นวิธีที่สะอาดและง่ายกว่าสำหรับฐานข้อมูลขนาดเล็กมาก