Không, bạn không thể hoàn tác, quay lại hoặc đảo ngược một cam kết.
DỪNG CƠ SỞ DỮ LIỆU!
(Lưu ý:nếu bạn đã xóa thư mục dữ liệu khỏi hệ thống tệp, KHÔNG dừng cơ sở dữ liệu. Lời khuyên sau áp dụng cho một cam kết ngẫu nhiên của một DELETE
hoặc tương tự, không phải là rm -rf /data/directory
kịch bản).
Nếu dữ liệu này quan trọng, hãy DỪNG CƠ SỞ DỮ LIỆU CỦA BẠN NGAY BÂY GIỜ và không khởi động lại nó. Sử dụng pg_ctl stop -m immediate
để không có trạm kiểm soát nào được chạy khi tắt máy.
Bạn không thể quay trở lại một giao dịch khi nó đã được cam kết. Bạn sẽ cần khôi phục dữ liệu từ các bản sao lưu hoặc sử dụng tính năng khôi phục tại chỗ, phải được thiết lập trước đó tai nạn đã xảy ra.
Nếu bạn chưa thiết lập bất kỳ bản lưu trữ PITR / WAL nào và không có bản sao lưu, bạn thực sự đang gặp rắc rối.
Giảm thiểu khẩn cấp
Khi cơ sở dữ liệu của bạn bị dừng, bạn nên tạo một bản sao cấp hệ thống tệp của toàn bộ thư mục dữ liệu - thư mục chứa base
, pg_clog
, v.v. Sao chép tất cả đến một địa điểm mới. Đừng làm bất cứ điều gì với bản sao ở vị trí mới, đó là hy vọng duy nhất của bạn để khôi phục dữ liệu của mình nếu bạn không có bản sao lưu. Tạo một bản sao khác trên một số bộ nhớ di động nếu bạn có thể, sau đó rút bộ nhớ đó khỏi máy tính. Hãy nhớ rằng bạn cần hoàn toàn mọi bộ phận của thư mục dữ liệu, bao gồm pg_xlog
v.v ... Không có phần nào là không quan trọng.
Cách tạo bản sao chính xác phụ thuộc vào hệ điều hành bạn đang chạy. Vị trí của dữ liệu phụ thuộc vào hệ điều hành bạn đang chạy và cách bạn cài đặt PostgreSQL.
Cách một số dữ liệu có thể tồn tại
Nếu bạn dừng DB đủ nhanh, bạn có thể có hy vọng khôi phục một số dữ liệu từ các bảng. Đó là bởi vì PostgreSQL sử dụng điều khiển đồng thời nhiều phiên bản (MVCC) để quản lý quyền truy cập đồng thời vào bộ nhớ của nó. Đôi khi nó sẽ viết phiên bản mới của các hàng bạn cập nhật vào bảng, giữ nguyên các hàng cũ nhưng được đánh dấu là "đã xóa". Sau một thời gian, autovaccum xuất hiện và đánh dấu các hàng là không gian trống, vì vậy chúng có thể được ghi đè bởi INSERT
sau này hoặc UPDATE
. Do đó, các phiên bản cũ của UPDATE
d hàng có thể vẫn nằm xung quanh, hiện tại nhưng không thể truy cập được.
Ngoài ra, Pg viết trong hai giai đoạn. Dữ liệu đầu tiên được ghi vào nhật ký ghi trước (WAL). Chỉ một khi nó được ghi vào WAL và đánh đĩa, sau đó nó được sao chép vào "heap" (các bảng chính), có thể ghi đè lên dữ liệu cũ ở đó. Nội dung WAL được bgwriter
sao chép vào heap chính và bằng các trạm kiểm soát định kỳ. Theo mặc định, các trạm kiểm soát diễn ra 5 phút một lần. Nếu bạn quản lý để dừng cơ sở dữ liệu trước khi một điểm kiểm tra xảy ra và dừng nó bằng cách đóng cứng nó, kéo phích cắm trên máy hoặc sử dụng pg_ctl
trong immediate
chế độ bạn có thể đã thu thập dữ liệu từ trước khi điểm kiểm tra xảy ra, vì vậy, dữ liệu cũ của bạn có nhiều khả năng vẫn ở trong đống.
Bây giờ bạn đã tạo một bản sao cấp hệ thống tệp hoàn chỉnh của dir dữ liệu, bạn có thể bắt đầu sao lưu cơ sở dữ liệu của mình nếu bạn thực sự cần; dữ liệu sẽ vẫn biến mất, nhưng bạn đã làm những gì có thể để hy vọng khôi phục được dữ liệu. Với sự lựa chọn, tôi có lẽ sẽ giữ DB đóng cửa chỉ để an toàn.
Phục hồi
Bây giờ bạn có thể cần phải thuê một chuyên gia trong các phần bên trong của PostgreSQL để hỗ trợ bạn trong nỗ lực khôi phục dữ liệu. Hãy chuẩn bị để trả công cho một chuyên gia vì thời gian của họ, có thể là khá nhiều thời gian.
Tôi đã đăng về điều này trên danh sách gửi thư Pg và Виктор Егоров được liên kết với bài đăng của depesz trên pg_dirtyread, trông giống như những gì bạn muốn, mặc dù nó không khôi phục được TOAST
ed dữ liệu nên tiện ích hạn chế. Hãy thử, nếu bạn may mắn, nó có thể hoạt động.
Xem:pg_dirtyread trên GitHub.
Tôi đã xóa những gì tôi đã viết trong phần này vì nó bị che khuất bởi công cụ đó.
Xem thêm các nguyên tắc cơ bản về lưu trữ hàng PostgreSQL
Phòng ngừa
Xem mục blog của tôi Ngăn ngừa hỏng cơ sở dữ liệu PostgreSQL.
Một lưu ý nhỏ có liên quan, nếu bạn đang sử dụng cam kết hai giai đoạn, bạn có thể ROLLBACK PREPARED
cho một chuyển đổi đã được chuẩn bị cho cam kết nhưng không được cam kết hoàn toàn. Đó là khoảng thời gian gần nhất bạn có thể khôi phục lại một giao dịch đã được cam kết và không áp dụng cho trường hợp của bạn.