2011-01-29 45 views
8

Cách hoàn tác việc thực thi truy vấn trong phpmyadmin.Cách hoàn tác thực thi truy vấn trong phpmyadmin

Có chức năng cuộn ngược nào không? bất kỳ cơ thể biết giải pháp vui lòng giúp tôi?

+3

Bạn có nghĩa là, dừng truy vấn đã bắt đầu hoặc hoàn tác các thay đổi mà tuyên bố đã hoàn thành (và cam kết) đã thực hiện? – GolezTrol

+0

có hoàn tác các thay đổi đã hoàn thành – learner

Trả lời

24

Nếu tuyên bố vẫn đang chạy, bạn có thể sử dụng KILL QUERY <thread_id>.

Nếu tuyên bố đã hoàn tất nhưng bạn chưa cam kết giao dịch, bạn có thể sử dụng ROLLBACK.

Nếu tuyên bố đã hoàn thành và giao dịch đã được cam kết (hoặc bạn đã không bắt đầu giao dịch) thì hãy khôi phục dữ liệu từ bản sao lưu gần đây nhất của bạn.


Ngoài ra đây là một số lời khuyên lời khuyên để ngăn chặn kiểu này tình hình xảy ra ở nơi đầu tiên:

  • Khi viết một DELETE hoặc UPDATE luôn viết mệnh đề WHERE đầu tiên để bạn don' quên nó đi.
  • Kiểm tra mệnh đề WHERE của bạn trong câu lệnh SELECT để đảm bảo bạn đang cập nhật các hàng chính xác.
  • Nếu bạn biết bạn chỉ nên cập nhật một hàng thì bạn có thể thêm LIMIT 1 vào câu lệnh UPDATE của mình. Sau đó, nếu sử dụng các kỹ thuật trên thì bạn vẫn gặp lỗi ít nhất một hàng sẽ bị ảnh hưởng, chứ không phải toàn bộ cơ sở dữ liệu.
+0

Nhưng điều này sẽ chỉ dừng thực hiện thêm, không hoàn tác truy vấn, phải không? Nhưng +1 cho KILLING – NikiC

+0

Xin chào, tôi đã thực hiện truy vấn. một trường được cập nhật hoàn toàn trong toàn bộ dữ liệu. tôi có thể lấy lại dữ liệu cũ theo cách nào không? – learner

+2

Tôi hy vọng bạn có một bản sao lưu ... –

2

Bạn có thể vào trang 'quá trình' và nhấn 'giết'

1

nếu bạn xóa một cái gì đó thì tôi không nghĩ rằng đi của nó để trở lại trừ khi bạn đã quyết backup.I biết trong sql bạn có thể thỉnh thoảng bỏ qua cuộc gọi ROLLBACK trước khi bạn cam kết một loạt các lệnh SQL nhưng chỉ trong các giao dịch và bạn phải bắt đầu chúng trước (mà phpMyAdmin không sử dụng).

0

Nếu bạn đã cam kết giao dịch, không có cách nào để "hoàn tác" giao dịch đó, tôi sợ. Đó là một trong những nguyên tắc cốt lõi của ACID. Nếu bạn chưa cam kết: chỉ cần thực hiện một số rollback và bạn vẫn ổn.

Bạn sẽ cần khôi phục dữ liệu từ bản sao lưu - hoặc nếu truy vấn đang chạy, hãy thử những gì Mark Byers đề xuất, sử dụng kill query.

1

Nếu bạn cần khả năng khôi phục dữ liệu trước đó trước bản cập nhật đã cam kết, bạn có thể cấu trúc lại cơ sở dữ liệu bằng cách cập nhật và xóa trình kích hoạt để lưu trữ dữ liệu cũ trong bảng lưu trữ với ngày/dấu thời gian hiện tại hoặc (tốt nhất) giá trị id giao dịch (và đảm bảo rằng chèn luôn lưu trữ ngày/dấu thời gian hoặc giá trị id giao dịch hiện tại) ... duy trì toàn bộ lịch sử của mọi thay đổi được thực hiện cho cơ sở dữ liệu của bạn. Hãy coi chừng, cơ sở dữ liệu của bạn sẽ phát triển với tốc độ đáng kinh ngạc ... đây thực sự là một giải pháp cho dữ liệu quan trọng trong lịch sử, nơi lịch sử là điều cần thiết, vì phải mất rất nhiều công sức để thực hiện, và rất nhiều không gian đĩa đắt tiền để duy trì. Thậm chí sau đó, nó có thể trở nên rất phức tạp nếu đã có các cập nhật tiếp theo cho dữ liệu bị ảnh hưởng; và bạn có thể cần phải "mất" những người đó khi hoàn nguyên về lịch sử trước đó.

Tôi chỉ có thể nghĩ đến một số ít hệ thống triển khai loại bảo trì lịch sử này ... ví dụ như Oracle Financials hoặc HR. Bên cạnh đó, có một số cơ sở dữ liệu (tôi đã từng làm việc với DEC RDBMS cũ) có thể duy trì RUJ (Run Unit Journals) mà sau đó có thể được sử dụng để khôi phục từ bản sao lưu và thời gian/giao dịch đã đặt.Tuy nhiên MySQL không thuộc loại này. Một lần nữa, nó đòi hỏi rất nhiều không gian đĩa, và chỉ thực tế khi bạn sao lưu thường xuyên dữ liệu của bạn, và quá trình phục hồi phức tạp hơn. MySQL (theo như tôi biết) không hỗ trợ tính năng này.

Đối với hầu hết mọi người, cách tiếp cận thực tế hơn là khôi phục đơn giản từ bản sao lưu, có thể theo sau là một số giải trí thủ công. Thật không may, hầu hết mọi người những ngày này thậm chí không thực hiện sao lưu.

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