Chạy MySQLDump mà không cần khóa bảng


437

Tôi muốn sao chép một 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 tôi. Có cách nào để làm điều này mà không khóa cơ sở dữ liệu sản xuất?

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 từng bàn khi nó chạy.


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 về xử lý giao dịch. Nó cho phép thực hiện sao lưu dự phòng, tức là nó không ảnh hưởng đến các hoạt động hiện tại. Xem tại đây: 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

Câu trả lời:


625

Liệu các --lock-tables=falsetùy chọn làm việc?

Theo trang man , nếu bạn bán các bảng InnoDB, bạn có thể sử dụng --single-transactiontùy chọn:

--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.

Đối với DB vô chủ :

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

23
cho innodb DB mysqldump --single-giao dịch = TRUE -u tên người dùng -p DB
AMB

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

Đây có phải là mặc định?
CMCDragonkai

rõ ràng trên (tức là bị khóa)?
evandrix

290

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

--lock-tables=false

1
Cảm ơn phản hồi của Warren, điều này rất hữu ích và hoạt động như một cơ duyên.
Gavin

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

43
Nhưng bạn nên lo lắng về việc khóa bàn. Nếu nhiều bảng được ghi trong khi mysqldump đang chạy (và bạn sử dụng khóa ngoại), thì kết xuất của bạn có thể không nhất quán. Bạn sẽ không biết cho đến khi bạn khôi phục nó và tình cờ chạy các truy vấn THAM GIA trên dữ liệu không nhất quán. Có thể mất một lúc để dữ liệu không nhất quán được phát hiện vì các THAM GIA được sử dụng bởi ứng dụng của bạn chứ không phải Mysql (với các bảng MyISAM); Khôi phục sẽ hoạt động tốt, mysql sẽ không cảnh báo bạn về sự không nhất quán. Vì vậy: MyIsam -> luôn khóa các bảng của bạn. InnoDB -> sử dụng --single-transaction.
Costa

12
@Costa Tôi không nghĩ các bảng khóa thậm chí là đủ cho các bảng MyISAM. Nếu mysqldump khóa các bảng ở giữa các truy vấn được ứng dụng thực thi thì bạn sẽ gặp phải sự không nhất quán tương tự. Câu trả lời thậm chí còn đơn giản hơn: MyISAM -> sử dụng InnoDB thay thế.
cdhowie

@Costa bạn chắc chắn nên lo lắng về việc khóa bảng, nhưng chỉ khi bạn cần một bãi chứa nhất quán . Có một số trường hợp hiếm khi bạn không. Ví dụ: một fgrep thô trên bãi chứa toàn cơ sở dữ liệu (gỡ lỗi): Tôi cá là người ta không muốn người dùng đợi trong khoảng 20 phút để tạo bãi chứa cơ sở dữ liệu sản xuất (câu chuyện có thật). Nếu mục đích là để kết xuất không chỉ ASAP, mà còn XÁC NHẬN, người ta nên kết xuất nô lệ sao chép hoặc sử dụng snapshaping cấp thấp hơn (lvm, zfs, btrfs, v.v.), hãy ghi nhớ FLUSH TABLES WITH READ LOCK.
Alex

44

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 --single-transactioncờ, nó sẽ cung cấp cho bạn một ảnh chụp nhanh mạch lạc của cơ sở dữ liệu tại thời điểm kết xuất.


35

--skip-add-locks đã giúp tôi


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

77
Điều này loại bỏ các câu lệnh LOCK TABLES và UNLOCK TABLES khỏi tệp kết xuất, nó không ảnh hưởng đến việc khóa trong khi xuất.
dabest1

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

@dabest và @orrd đều đúng: --skip-add-lockssẽ giúp khôi phục kết xuất nhanh hơn. Đây không phải là một câu trả lời đúng.
dr_ 4/11/2016



10

Thành thật mà nói, tôi sẽ thiết lập sao chép cho việc này, vì nếu bạn không khóa bảng, bạn sẽ nhận được dữ liệu không nhất quán từ bãi chứa.

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

Vì vậy, hoặc khóa các bảng hoặc sử dụng nhân rộng.


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

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

5
Nếu bạn chưa thiết lập sao chép, thì bạn cần phải tạo một bãi chứa để thiết lập nó. Vấn đề tương tự tồn tại.
Matt Connolly

3
Nếu bạn chưa thiết lập sao chép, thì bạn sẽ cần khóa các bảng để thực hiện kết xuất để đảm bảo tính toàn vẹn dữ liệu. Vì vậy, đó là một sự bắt 22.
JordanC

9

Điều này là muộn so với anh chàng nói rằng anh ta đến trễ như 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

Đây là điều giúp tôi bỏ thông tin_schema mà không gặp lỗi "Truy cập bị từ chối đối với người dùng 'debian-sys-duy trì' @ 'localhost' vào cơ sở dữ liệu 'information_schema' khi sử dụng 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

Bỏ phiếu, cái này hoạt động với tôi chỉ cần thêm các tham số --skip-opt --single-giao dịch --max_allowed_packet = 1G
Steven Lizarazo

1
Tôi không đề xuất "--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 yêu cầu. Nó tắt chế độ nhanh, nó không bao gồm bộ ký tự, v.v.
hoặc

3

Khi sử dụng MySQL Workbench, tại Xuất dữ liệu, bấm vào Tùy chọn nâng cao và bỏ chọn các tùy chọn "bảng khóa".

nhập mô tả hình ảnh ở đây


1

Vì không có cách tiếp cận nào hiệu quả với tôi, tôi chỉ đơn giản thực hiện:

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

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

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


2
--skip-add-lock trong quá trình kết xuất cũng vậy
codewandler


0

Một câu trả lời muộn khác:

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

Theo tài liệu:

Nó sử dụng FLUSH TABLES, LOCK TABLES và cp hoặc scp để tạo bản sao lưu cơ sở dữ liệu. Đây 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ể được chạy trên cùng một máy có chứa các thư mục cơ sở dữ liệu. mysqlhotcopy chỉ hoạt động để sao lưu các bảng MyISAM và ARCHIVE.

Thời LOCK TABLESgian phụ thuộc vào thời gian máy chủ có thể sao chép các tệp MySQL (nó không tạo ra kết xuất).


0

Hôm nay Ngay cả tôi cũng gặp phải vấn đề tương tự nhưng tôi không có quyền truy cập vào dòng lệnh. Vì vậy, tôi đã mở tệp sql trong trình soạn thảo Notepad và xóa dòng bên dưới khỏi bảng

LOCK TABLES `yourtable name` WRITE;

sau đó tôi nhập vào môi trường phát triển của mình .Works tốt. hy vọng nó sẽ giúp được ai đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.