Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khôi phục sau khi truy vấn cập nhật MySQL sai?

Có hai bài học được rút ra ở đây:

  1. Sao lưu dữ liệu
  2. Thực hiện các câu lệnh CẬP NHẬT / XÓA trong một giao dịch, vì vậy bạn có thể sử dụng ROLLBACK nếu mọi thứ không diễn ra như kế hoạch

Nhận thức được việc xử lý giao dịch (tự động gửi, rõ ràng và ẩn) đối với cơ sở dữ liệu của bạn có thể giúp bạn không phải khôi phục dữ liệu từ bản sao lưu.

Giao dịch kiểm soát (các) câu lệnh thao tác dữ liệu để đảm bảo chúng là nguyên tử. Là "nguyên tử" có nghĩa là giao dịch xảy ra hoặc không. Cách duy nhất để báo hiệu hoàn tất giao dịch với cơ sở dữ liệu là sử dụng COMMIT hoặc ROLLBACK (theo ANSI-92, đáng buồn là không bao gồm cú pháp để tạo / bắt đầu một giao dịch, vì vậy nó là dành riêng cho nhà cung cấp). COMMIT áp dụng các thay đổi (nếu có) được thực hiện trong giao dịch. ROLLBACK không quan tâm đến bất kỳ hành động nào đã diễn ra trong giao dịch - rất mong muốn khi câu lệnh UPDATE / DELETE thực hiện điều gì đó ngoài ý muốn .

Thông thường, các câu lệnh DML (Chèn, Cập nhật, Xóa) riêng lẻ được thực hiện trong một giao dịch tự động gửi - chúng được cam kết ngay sau khi câu lệnh hoàn tất thành công. Có nghĩa là không có cơ hội để khôi phục cơ sở dữ liệu về trạng thái trước khi câu lệnh được chạy trong các trường hợp như của bạn. Khi có sự cố, tùy chọn khôi phục duy nhất có sẵn là tạo lại dữ liệu từ bản sao lưu (cung cấp bản sao lưu tồn tại). Trong MySQL, autocommit là trên theo mặc định cho InnoDB - MyISAM không hỗ trợ giao dịch. Nó có thể được tắt bằng cách sử dụng:

SET autocommit = 0

Một giao dịch rõ ràng là khi (các) câu lệnh được bao bọc trong một khối mã giao dịch được xác định rõ ràng - đối với MySQL, đó là START TRANSACTION . Nó cũng yêu cầu một COMMIT được thực hiện rõ ràng hoặc ROLLBACK khi kết thúc giao dịch. Các giao dịch lồng nhau nằm ngoài phạm vi của chủ đề này.

Các giao dịch ngầm định hơi khác so với các giao dịch rõ ràng. Giao dịch ngầm không yêu cầu xác định rõ ràng một giao dịch. Tuy nhiên, giống như các giao dịch rõ ràng, chúng yêu cầu COMMIT hoặc ROLLBACK tuyên bố sẽ được cung cấp.

Kết luận

Các giao dịch rõ ràng là giải pháp lý tưởng nhất - chúng yêu cầu một tuyên bố, COMMIT hoặc ROLLBACK , để hoàn tất giao dịch và những gì đang xảy ra được nêu rõ ràng để người khác đọc nếu có nhu cầu. Các giao dịch ngầm định là OK nếu làm việc tương tác với cơ sở dữ liệu, nhưng COMMIT tuyên bố chỉ nên được chỉ định sau khi kết quả đã được kiểm tra và xác định kỹ lưỡng là hợp lệ.

Điều đó có nghĩa là bạn nên sử dụng:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

... và chỉ sử dụng COMMIT; khi kết quả chính xác.

Điều đó nói rằng, các câu lệnh UPDATE và DELETE thường chỉ trả về số hàng bị ảnh hưởng chứ không phải chi tiết cụ thể. Chuyển đổi các câu lệnh như vậy thành câu lệnh SELECT và xem lại kết quả để đảm bảo tính đúng đắn trước đó để cố gắng thực hiện câu lệnh UPDATE / DELETE.

Phụ lục

Các câu lệnh DDL (Ngôn ngữ Định nghĩa Dữ liệu) được cam kết tự động - chúng không yêu cầu câu lệnh COMMIT. IE:Bảng, chỉ mục, thủ tục được lưu trữ, cơ sở dữ liệu và các câu lệnh tạo hoặc thay đổi chế độ xem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu cho nhận xét và trả lời

  2. tải xuống ảnh chụp nhanh RDS

  3. Lưu trữ dữ liệu được mã hóa base64 dưới dạng kiểu dữ liệu BLOB hoặc TEXT

  4. mysql:chọn tất cả các mục từ bảng A nếu không tồn tại trong bảng B

  5. ReplicationManager đã đưa ra một ngoại lệ khi mở một kết nối