2008-09-19 31 views
374

Tôi muốn sao chép cơ sở dữ liệu sản xuất trực tiếp vào cơ sở dữ liệu phát triển địa phương của mình. Có cách nào để làm điều này mà không cần khóa cơ sở dữ liệu sản xuất?Chạy MySQLDump mà không cần Khóa Bàn

Tôi hiện đang sử dụng:

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

Nhưng nó khóa mỗi bảng khi nó chạy.

+0

Một giải pháp muộn khác: Bạn cũng có thể sử dụng Percona XtraBackup để kết xuất cơ sở dữ liệu sản xuất của mình mà không bị gián đoạn liên quan đến xử lý giao dịch. Nó cho phép sao lưu nóng, tức là nó không ảnh hưởng đến các hoạt động hiện tại. Xem tại đây: https://www.percona.com/software/mysql-database/percona-xtrabackup (Tôi không có liên kết theo bất kỳ cách nào với Percona.) – delx

Trả lời

512

Tùy chọn --lock-tables=false có hoạt động không?

Theo man page, nếu bạn đang bán phá giá các bảng InnoDB bạn có thể sử dụng tùy chọn --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. 
+14

cho innodb DB mysqldump --single-transaction = TRUE -u tên người dùng -p DB – AMB

+12

Nếu bạn có innodb và myisam thì sao? – CMCDragonkai

+0

Tính năng này có được bật theo mặc định không? – CMCDragonkai

8

Thành thực mà nói, tôi sẽ thiết lập sao chép cho điều này, như thể bạn không khóa bảng bạn sẽ nhận được không phù hợp dữ liệu ra khỏi bãi chứa.

Nếu bãi chứa mất nhiều thời gian hơn, các bảng đã bị bán phá giá có thể đã thay đổi cùng với một số bảng sắp bị bán phá giá.

Vì vậy, hãy khóa bàn hoặc sử dụng sao chép.

+0

Toàn bộ DB này gần như hoàn toàn chỉ đọc nên tôi không quá lo lắng về việc nó thay đổi. – Greg

+2

Nhận xét này không đúng. MVCC cho phép đọc trạng thái nhất quán mà không cần khóa trên InnoDB. –

+5

Nếu bạn không có bản sao đã được thiết lập, sau đó bạn cần phải làm một bãi chứa để thiết lập nó. Cùng tồn tại vấn đề. –

42

Câu trả lời khác nhau tùy thuộc vào công cụ lưu trữ bạn đang sử dụng. Kịch bản lý tưởng là nếu bạn đang sử dụng InnoDB. Trong trường hợp đó, bạn có thể sử dụng cờ --single-transaction, cờ này sẽ cung cấp cho bạn một bản chụp nhanh của cơ sở dữ liệu tại thời điểm bãi chứa bắt đầu.

268

Đây là độ tuổi quá muộn, nhưng tốt cho bất kỳ ai đang tìm kiếm chủ đề. Nếu bạn không InnoDB, và bạn không phải lo lắng về khóa khi bạn đổ chỉ đơn giản là sử dụng tùy chọn:

--lock-tables=false 
+1

Cảm ơn phản ứng Warren, điều này rất hữu ích và làm việc như một say mê. – Gavin

+0

ditto. hoạt động hoàn hảo. – simplethemes

+7

sử dụng '--lock-table = false --quick' sử dụng tài nguyên máy chủ ít nhất – SyntaxGoonoo

31

--skip-add-locks giúp cho tôi

+1

hoặc cũng --compact để bao gồm các khóa bỏ qua cùng với các tối ưu hóa khác. – ppostma1

+54

Thao tác này sẽ loại bỏ các câu lệnh LOCK BẢNG BIỂU TƯỢNG và KHÓA TỪ KHÓA khỏi tệp kết xuất, nó không ảnh hưởng đến khóa trong quá trình xuất. – dabest1

+6

Không, đó không phải là những gì bạn đang tìm kiếm! Xem nhận xét của dabest1. Điều này KHÔNG NÓI để giữ cho các bảng của bạn không bị khóa khi đang thực hiện mysqldump. Đây KHÔNG phải là câu trả lời cho câu hỏi. – orrd

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

Bỏ phiếu, điều này làm việc cho tôi chỉ cần thêm các tham số --skip-opt --single-transaction --max_allowed_packet = 1G –

+0

Tôi không khuyên bạn nên "--skip-opt" cho mục đích này. Điều đó làm nhiều hơn những gì câu hỏi ban đầu được yêu cầu. Nó tắt chế độ nhanh, nó không bao gồm bộ ký tự, v.v. – orrd

7

này là về muộn so với anh chàng người nói rằng ông ấy đã khuya, anh câu trả lời ban đầu, nhưng trong trường hợp của tôi (MySQL qua WAMP trên Windows 7), tôi đã phải sử dụng:

--skip-lock-tables 
+0

Đây là những gì làm việc cho tôi để đổ information_schema mà không có lỗi "Truy cập bị từ chối cho người dùng 'debian-sys-maint' @ 'localhost' vào cơ sở dữ liệu 'information_schema' khi sử dụng LOCK BẢNG" –

0

Như không ai trong số những phương pháp làm việc cho tôi, tôi chỉ đơn giản là đã làm một:

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

Nó sẽ loại trừ cả LOCK TABLE <x>UNLOCK TABLES lệnh.

Lưu ý: Hy vọng dữ liệu của bạn không chứa chuỗi đó!

+1

--skip-add-locks trong dump cũng vậy – codewandler

0

Một câu trả lời cuối:

Nếu bạn đang cố gắng để tạo ra một bản sao nóng của cơ sở dữ liệu máy chủ (trong một môi trường Linux) và cơ sở dữ liệu của tất cả các bảng là MyISAM bạn nên sử dụng mysqlhotcopy.

Acordingly đến tài liệu:

Nó sử dụng BẢNG FLUSH, BẢNG LOCK, và cp hay scp để tạo ra một cơ sở dữ liệu sao lưu. Đó là một cách nhanh chóng để tạo bản sao lưu cơ sở dữ liệu hoặc các bảng đơn lẻ, nhưng nó chỉ có thể chạy trên cùng một máy nơi thư mục cơ sở dữ liệu được đặt. mysqlhotcopy chỉ hoạt động để sao lưu các bảng MyISAM và ARCHIVE.

Thời gian LOCK TABLES phụ thuộc vào thời gian máy chủ có thể sao chép các tệp MySQL (nó không làm đổ).

Các vấn đề liên quan