เรียกใช้ MySQLDump โดยไม่ต้องล็อคตาราง


437

ฉันต้องการคัดลอกฐานข้อมูลการผลิตสดไปยังฐานข้อมูลการพัฒนาท้องถิ่นของฉัน มีวิธีการทำเช่นนี้โดยไม่ล็อคฐานข้อมูลการผลิตหรือไม่?

ฉันกำลังใช้:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

แต่มันล็อคแต่ละตารางในขณะที่มันวิ่ง


อีกโซลูชันที่ล่าช้า: คุณสามารถใช้ Percona XtraBackup เพื่อถ่ายโอนฐานข้อมูลการผลิตของคุณโดยไม่หยุดชะงักเกี่ยวกับการประมวลผลธุรกรรม อนุญาตให้ทำการแบ็คอัพที่ร้อนแรงเช่นไม่มีผลกระทบต่อกิจกรรมปัจจุบัน ดูที่นี่: percona.com/software/mysql-database/percona-xtrabackup (ฉันไม่มีส่วนเกี่ยวข้องกับ Percona แต่อย่างใด)
delx

คำตอบ:


625

ไม่--lock-tables=falseทำงานตัวเลือก?

ตามหน้า man , ถ้าคุณทิ้งตาราง InnoDB คุณสามารถใช้--single-transactionตัวเลือก:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

สำหรับinnodb DB :

mysqldump --single-transaction=TRUE -u username -p DB

23
สำหรับ innodb DB mysqldump - single-transaction = TRUE -u ชื่อผู้ใช้ -p DB
AMB

19
ถ้าคุณมี innodb และ myisam ล่ะ?
CMCDragonkai

เป็นค่าเริ่มต้นหรือไม่
CMCDragonkai

เห็นได้ชัดว่าอยู่บน (เช่นถูกล็อก)
evandrix

290

นี่คืออายุเกินไปสาย แต่เหมาะสำหรับทุกคนที่กำลังค้นหาหัวข้อ หากคุณไม่ใช่ innoDB และคุณไม่กังวลเกี่ยวกับการล็อคในขณะที่คุณถ่ายโอนข้อมูลเพียงใช้ตัวเลือก:

--lock-tables=false

1
ขอบคุณสำหรับการตอบสนองวอร์เรนนี่เป็นประโยชน์มากและทำงานเหมือนมีเสน่ห์
กาวิน

7
using '--lock-table = false --quick' ใช้ทรัพยากรเซิร์ฟเวอร์อย่างน้อยที่สุด
SyntaxGoonoo

43
แต่คุณควรกังวลเกี่ยวกับการล็อคตาราง หากมีการเขียนหลายตารางไปในขณะที่ mysqldump กำลังทำงานอยู่ (และคุณใช้คีย์ต่างประเทศ) คุณอาจถ่ายโอนข้อมูลไม่สอดคล้องกัน คุณจะไม่ทราบจนกว่าจะกู้คืนและเรียกใช้การสืบค้น JOIN กับข้อมูลที่ไม่สอดคล้องกัน อาจใช้เวลาสักครู่ก่อนที่จะค้นพบข้อมูลที่ไม่สอดคล้องกันเนื่องจากแอปพลิเคชันของคุณใช้ JOIN ไม่ใช่ชื่อ Mysql (พร้อมตาราง MyISAM) การคืนค่าจะทำงานได้ดี mysql จะไม่เตือนคุณเกี่ยวกับความไม่สอดคล้องกัน ดังนั้น: MyIsam -> ล็อคตารางของคุณเสมอ InnoDB -> --single-transactionการใช้งาน
Costa

12
@Costa ฉันไม่คิดว่าการล็อกตารางจะเพียงพอสำหรับตาราง MyISAM หาก mysqldump ล็อคตารางในระหว่างการสืบค้นที่ดำเนินการโดยแอปพลิเคชันคุณก็จะจบลงด้วยความไม่ลงรอยกันแบบเดียวกัน คำตอบนั้นง่ายยิ่งขึ้น: MyISAM -> ใช้ InnoDB แทน
cdhowie

@Costa คุณแน่นอนควรจะกังวลเกี่ยวกับการล็อกตาราง แต่ถ้าคุณไม่จำเป็นต้องมีการถ่ายโอนข้อมูลที่สอดคล้องกัน มีบางกรณีที่หายากเมื่อคุณทำไม่ได้ ตัวอย่างเช่นน้ำมันดิบ fgrep ในการถ่ายโอนข้อมูลทั้งฐานข้อมูล (การดีบัก): ฉันเดิมพันหนึ่งไม่ต้องการให้ผู้ใช้รอ ~ 20 นาทีเพื่อสร้างการถ่ายโอนข้อมูลของฐานข้อมูลการผลิต (เรื่องจริง) หากประเด็นคือการถ่ายโอนข้อมูลไม่เพียง แต่เร็วที่สุดเท่านั้น แต่ยังสอดคล้องกันคุณควรถ่ายโอนข้อมูลทาสที่ทำซ้ำหรือใช้สแนปชอตระดับต่ำกว่า (lvm, zfs, btrfs และอื่น ๆ ) โดยคำนึงถึงFLUSH TABLES WITH READ LOCKสิ่งต่างๆ
Alex Offshore

44

คำตอบจะแตกต่างกันไปขึ้นอยู่กับเครื่องมือเก็บข้อมูลที่คุณใช้ สถานการณ์ในอุดมคติคือถ้าคุณใช้ InnoDB ในกรณีนั้นคุณสามารถใช้การ--single-transactionตั้งค่าสถานะซึ่งจะให้ snapshot ที่สอดคล้องกันของฐานข้อมูลในเวลาที่เริ่มการถ่ายโอนข้อมูล


35

--skip-add-locks ช่วยสำหรับฉัน


2
หรือ - กระชับเพื่อรวมการข้ามล็อคด้วยการเพิ่มประสิทธิภาพอื่น ๆ
ppostma1

77
สิ่งนี้จะลบคำสั่ง LOCK TABLES และ UNLOCK TABLES ออกจากไฟล์ดัมพ์ซึ่งจะไม่มีผลกับการล็อกระหว่างการเอ็กซ์พอร์ต
dabest1

11
ไม่มันไม่ใช่สิ่งที่คุณกำลังมองหา! ดูความคิดเห็นของ dabest1 สิ่งนี้ไม่ช่วยป้องกันไม่ให้ตารางของคุณถูกล็อคขณะทำการ mysqldump นี่ไม่ใช่คำตอบสำหรับคำถาม
2559

@dabest และ @orrd ถูกต้อง: --skip-add-locksจะทำให้การคืนค่าการถ่ายโอนข้อมูลเร็วขึ้น นี่ไม่ใช่คำตอบที่ถูกต้อง
dr_

16

หากต้องการดัมพ์ตารางขนาดใหญ่คุณควรรวมตัวเลือก --single-transaction กับ --quick

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


2
ตัวเลือก - อย่างรวดเร็วเป็นส่วนหนึ่งของตัวเลือก - เปิดตอนนี้ และ --opt ถูกเปิดใช้งานโดยค่าเริ่มต้น
Alexander Ushakov

11

สำหรับตาราง InnoDB ให้ใช้แฟล็ก --single-transaction

มันจะทิ้งสถานะที่สอดคล้องกันของฐานข้อมูล ณ เวลาที่ BEGIN ออกโดยไม่บล็อกแอปพลิเคชันใด ๆ

DOCS MySQL

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


--skip-lock-tablesบางทีพร้อมกับ
Xavi Montero

10

สุจริตฉันจะตั้งค่าการจำลองแบบนี้ถ้าคุณไม่ล็อคตารางคุณจะได้รับข้อมูลที่ไม่สอดคล้องกันออกจากการถ่ายโอนข้อมูล

หากดัมพ์ใช้เวลานานตารางที่ดัมพ์แล้วอาจมีการเปลี่ยนแปลงพร้อมกับบางตารางที่กำลังจะถูกดัมพ์เท่านั้น

ดังนั้นล็อคตารางหรือใช้การจำลองแบบ


ฐานข้อมูลทั้งหมดนี้เกือบจะอ่านทั้งหมดเท่านั้นดังนั้นฉันไม่กังวลเกี่ยวกับการเปลี่ยนแปลง
เกร็ก

2
ความคิดเห็นนี้ไม่ถูกต้อง MVCC อนุญาตให้อ่านสถานะที่สอดคล้องกันโดยไม่ล็อคบน InnoDB
Scott Hyndman

5
หากคุณยังไม่มีการจำลองแบบติดตั้งแล้วคุณต้องทำการดัมพ์เพื่อตั้งค่า มีปัญหาเดียวกัน
Matt Connolly

3
หากคุณไม่มีการตั้งค่าการจำลองแบบอยู่แล้วคุณจะต้องล็อคตารางเพื่อถ่ายโอนข้อมูลเพื่อให้แน่ใจว่ามีความถูกต้องของข้อมูล ดังนั้นจึงเป็นเรื่องที่ 22
JordanC

9

นี่เป็นเรื่องที่ล่าช้าไปเมื่อเทียบกับคนที่บอกว่าเขามาสายเหมือนคำตอบเดิม แต่ในกรณีของฉัน (MySQL ผ่าน WAMP บน Windows 7) ฉันต้องใช้:

--skip-lock-tables

นี่คือสิ่งที่ทำงานสำหรับฉันที่จะถ่ายโอนข้อมูล data_schema โดยไม่มีข้อผิดพลาด "การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'debian-sys-maint' @ 'localhost' ไปยังฐานข้อมูล 'information_schema' เมื่อใช้ LOCK TABLES"
Rui F Ribeiro

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

โหวตขึ้นหนึ่งอันนี้เหมาะกับฉันเพียงแค่เพิ่มพารามิเตอร์ --skip-opt - ธุรกรรมเดี่ยว --max_allowed_packet = 1G
Steven Lizarazo

1
ฉันไม่แนะนำ "--skip-opt" เพื่อจุดประสงค์นี้ นั่นเป็นอะไรที่มากกว่าคำถามเดิมที่ถาม มันปิดโหมดรวดเร็วไม่รวม charset ฯลฯ เป็นต้น
orrd


1

เนื่องจากวิธีการเหล่านี้ไม่ได้ผลสำหรับฉันฉันก็ทำ:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

มันจะไม่รวมทั้งLOCK TABLE <x>และUNLOCK TABLESคำสั่ง

หมายเหตุ:หวังว่าข้อมูลของคุณจะไม่มีสตริงนั้นอยู่!


2
--skip-add-lock ระหว่างการถ่ายโอนข้อมูลทำได้เช่นกัน
codewandler

1

เนื่องจากhttps://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables :

ตัวเลือกบางตัวเลือกเช่น --opt (ซึ่งถูกเปิดใช้งานตามค่าเริ่มต้น) จะเปิดใช้งาน - ล็อคตารางโดยอัตโนมัติ หากคุณต้องการแทนที่สิ่งนี้ให้ใช้ --skip-lock-tables ในตอนท้ายของรายการตัวเลือก


0

คำตอบที่ปลายอีก:

ถ้าคุณกำลังพยายามที่จะทำสำเนาร้อนของฐานข้อมูลเซิร์ฟเวอร์ (ในสภาพแวดล้อมลินุกซ์) และโปรแกรมฐานข้อมูลของตารางทั้งหมดเป็น MyISAM คุณควรmysqlhotcopyใช้

เอกสารประกอบ:

มันใช้ล้างตารางล็อคตารางและ cp หรือ scp เพื่อทำการสำรองฐานข้อมูล เป็นวิธีที่รวดเร็วในการสำรองข้อมูลของฐานข้อมูลหรือตารางเดี่ยว แต่สามารถเรียกใช้บนเครื่องเดียวกับที่มีไดเรกทอรีฐานข้อมูลอยู่ mysqlhotcopy ใช้ได้กับการแบ็คอัพตาราง MyISAM และ ARCHIVE เท่านั้น

LOCK TABLESเวลาขึ้นอยู่กับเวลาที่เซิร์ฟเวอร์สามารถคัดลอกไฟล์ MySQL (มันไม่ได้ทำให้การถ่ายโอนข้อมูล)


0

วันนี้แม้ฉันประสบปัญหาเดียวกัน แต่ฉันไม่สามารถเข้าถึงบรรทัดคำสั่งดังนั้นฉันเปิดไฟล์ sql ในตัวแก้ไข Notepad และลบบรรทัดด้านล่างจากตาราง

LOCK TABLES `yourtable name` WRITE;

จากนั้นฉันก็นำเข้าสู่สภาพแวดล้อมการพัฒนาของฉันทำงานได้ดี หวังว่ามันจะช่วยให้ใครบางคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.