2012-05-22 26 views
7

Tôi đã đi qua hướng dẫn và nó đã được đề cập rằng mỗi giao dịch sẽ thêm một tuyên bố BEGIN trước khi nó bắt đầu dùng bãi chứa. Ai đó có thể xây dựng điều này một cách dễ hiểu hơn?Tại sao một mysqldump có giao dịch đơn lẻ nhất quán hơn một giao dịch không có?

Dưới đây là những gì tôi đọc:

Tùy chọn này đưa ra một BEGIN câu lệnh SQL trước khi xuất dữ liệu từ máy chủ. Nó rất hữu ích chỉ với các bảng giao dịch như InnoDB và BDB, bởi vì sau đó nó bãi trạng thái nhất quán của cơ sở dữ liệu vào thời điểm khi BEGIN đã được ban hành mà không ngăn chặn bất kỳ ứng dụng."

Can một số công phu về vấn đề này?

+1

Có thể thêm một số liên kết hoặc trích dẫn các phần cụ thể của sách hướng dẫn bạn cần trợ giúp, nếu không chúng tôi dự đoán một chút về những gì bạn muốn biết. – Cylindric

+0

Tôi đã cập nhật bài đăng. xin hãy xem. – Uday

Trả lời

23

Vì bãi chứa nằm trong một giao dịch, bạn sẽ có cái nhìn nhất quán về tất cả các bảng trong cơ sở dữ liệu. Điều này có lẽ tốt nhất được giải thích bởi một ví dụ. Giả sử bạn đổ một cơ sở dữ liệu với hai bảng, OrdersOrderLines

  1. Bạn bắt đầu đổ mà không có một giao dịch duy nhất.
  2. Quy trình khác sẽ chèn một hàng vào bảng Orders.
  3. Quy trình khác sẽ chèn một hàng vào bảng OrderLines.
  4. Quy trình kết xuất bảng OrderLines.
  5. Một quy trình khác sẽ xóa các bản ghi OrdersOrderLines.
  6. Quy trình đổ bảng Orders.

Trong ví dụ này, kết xuất của bạn sẽ có các hàng cho OrderLines, nhưng không phải là Orders. Dữ liệu sẽ ở trạng thái không nhất quán và sẽ không khôi phục được nếu có khóa ngoại từ Orders đến OrderLines.

Nếu bạn đã thực hiện nó trong một giao dịch, bãi chứa sẽ không có thứ tự hoặc các dòng (nhưng nó sẽ nhất quán) vì cả hai được chèn vào sau đó bị xóa sau khi giao dịch bắt đầu.

+0

Bạn nghĩ ra một ví dụ tốt hơn/rõ ràng hơn tôi nghĩ. :) – Cylindric

+1

Nó thực sự là một lời giải thích tốt hơn .. cảm ơn Eric .. Tôi có một nghi ngờ. Nếu bãi chứa của tôi mất một giờ, làm thế nào về giao dịch trong đó 1 giờ sau đó ...? Họ có được lưu trữ trong bộ đệm và đỏ ửng vào đĩa khi bãi chứa hoàn thành ....? hoặc làm thế nào nó xảy ra ...? – Uday

5

Tôi đã từng gặp phải các sự cố trong đó mysqldump không có tham số giao dịch -single sẽ luôn thất bại do dữ liệu bị thay đổi trong khi kết xuất. Về cơ bản, khi bạn phát hành giao dịch --single, nó sẽ lấy một bản chụp của cơ sở dữ liệu tại thời điểm đó và đổ nó ra chứ không phải là dumpin g dữ liệu có thể thay đổi trong khi tiện ích đang chạy.

+0

Bạn có nghĩa là, Trong khi đổ tất cả các giao dịch sẽ xảy ra chỉ trong buufers và sẽ không được phản ánh hoặc đỏ mặt vào đĩa cho đến khi bãi chứa hoàn thành ....? – Uday

+0

Tôi nghĩ rằng nó sao chép một bản chụp vào bộ nhớ hoặc các bảng tạm thời và sau đó đổ nó. –

+1

@Uday Đừng lo lắng quá nhiều về cách thức * nó làm như thế nào, bởi vì nó phụ thuộc vào tất cả các yếu tố. Khái niệm này vẫn giữ nguyên cho tất cả các loại động cơ khác nhau, có thể là MySQL, MSSQL, Oracle, bất cứ điều gì. – Cylindric

5

Điều này có thể quan trọng đối với các bản sao lưu vì điều đó có nghĩa là bạn nhận được tất cả dữ liệu, chính xác như ở một thời điểm.

Vì vậy, ví dụ, hãy tưởng tượng một cơ sở dữ liệu blog đơn giản, và một chút đặc trưng của hoạt động có thể là

  1. Tạo một người dùng mới
  2. Tạo bài đăng mới bởi người sử dụng
  3. Xóa một người dùng mà xóa các bài

Bây giờ khi bạn sao lưu cơ sở dữ liệu của bạn, sao lưu có thể sao lưu các bảng theo thứ tự này

  1. bài
  2. Người dùng

gì sẽ xảy ra nếu ai đó xóa một tài khoản, được yêu cầu của bài, ngay sau sao lưu của bạn đạt # 1?

Khi bạn khôi phục dữ liệu của mình, bạn sẽ thấy rằng bạn có Bài đăng nhưng người dùng không tồn tại trong bản sao lưu.

Đặt một giao dịch xung quanh toàn bộ điều có nghĩa là tất cả các cập nhật, chèn và xóa xảy ra trên cơ sở dữ liệu trong quá trình sao lưu, không được sao lưu nhìn thấy.

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