Ghi chú
Vì phải đóng Firefox để thực hiện quy trình này, hãy đảm bảo mở trang này trong một trình duyệt web khác hoặc in ra trước khi tiếp tục.
Sau nhiều giờ làm việc để cố gắng khôi phục cơ sở dữ liệu Địa điểm, thậm chí đọc mã nguồn Firefox, tôi đã thành công. Đây là cách tôi đã làm:
- Tải xuống phiên bản mới nhất của SQLite shell và trích xuất nó vào thư mục hồ sơ của bạn. Trên Windows Vista và Windows 7, nó nằm trong
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
thư mục.
- Đóng Firefox nếu nó đang chạy.
- Cơ sở dữ liệu Địa điểm có trong
places.sqlite
tệp. Nếu tệp bị thay thế do tham nhũng, hãy sử dụng places.sqlite.corrupt
tệp để khôi phục. Tạo một bản sao lưu của tập tin, được đặt tên places.sqlite.bak
hoặc places.sqlite.corrupt.bak
.
- Sử dụng shell SQLite để mở tệp cơ sở dữ liệu (
sqlite3 places.sqlite
hoặc sqlite3 places.sqlite.corrupt
), sau đó nhập:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
Vì cơ sở dữ liệu bị hỏng, kết xuất cơ sở dữ liệu kết quả không hoàn thành và không phải tất cả dữ liệu có thể phục hồi đã được truy xuất. Để xác định lỗi xảy ra ở đâu, hãy tìm từ ERROR
(tất cả chữ hoa) trong một nhận xét SQL bên trong tệp kết xuất dump.sql
(tôi đã sử dụng Notepad ++ để làm điều này) và đọc lệnh SQL INSERT
phía trên nó để xác định bảng đang nghi vấn. Trong trường hợp của tôi, bảng bị hư hỏng là moz_places
. (Có thể tìm thấy mô tả về các bảng được tìm thấy trong cơ sở dữ liệu Địa điểm ở đây , bao gồm sơ đồ ER đã lỗi thời.) Tôi sẽ giải thích cách chỉ phục hồi dữ liệu từ bảng này; quy trình sau có thể không áp dụng được cho các bảng khác, vì vậy hãy bỏ qua các bước phụ này nếu một bảng khác không moz_places
liên quan.)
- Mỗi hàng trong
moz_places
bảng có một ID. Các hàng được kết xuất từ bảng theo thứ tự của ID này. 1 ID là giá trị đầu tiên sau dấu ngoặc đơn mở trong INSERT
câu lệnh. Khu vực nơi cơ sở dữ liệu bị hỏng có khả năng là một khối nhỏ các hàng trong bảng này; ý tưởng ở đây là bỏ qua khu vực bị hư hại này và phục hồi càng nhiều dữ liệu càng tốt. Khu vực bắt đầu của một khối như vậy được thể hiện trong bãi chứa dưới dạng hàng trước khi ERROR
bình luận xuất hiện. Sử dụng ID cho hàng này, chúng tôi có thể xác định nơi cơ sở dữ liệu bị hỏng. Chúng tôi làm như vậy bằng cách sử dụng các SELECT
câu lệnh với ID làm điều kiện; quá trình này mất một số thử nghiệm và lỗi. Ví dụ: nếu ID cuối cùng trước lỗi là 49999 và lỗi xảy ra, khối bị hỏng bắt đầu ở ID 50000. Sử dụng các câu lệnh như:
- ngăn chặn đầu ra không cần thiết
- lệnh sau dành cho các hệ thống Windows
- đối với Linux và các hệ thống tương tự Unix và Unix khác, hãy sử dụng .output / dev / null
.outout NUL
CHỌN id TỪ moz_places WHERE id> = 50100;
- Điều chỉnh giá trị theo sau
id >=
và lặp lại SELECT
lệnh trên cho đến khi bạn tìm thấy giá trị nhỏ nhất không khiến SQLite xuất ra lỗi. Đây là ID đề cập đến hàng bắt đầu từ đó chúng tôi có thể khôi phục dữ liệu bổ sung. Giả sử ID này là 50200. Để kết xuất dữ liệu này, hãy nhập:
.output dump2.sql
.mode chèn
CHỌN * TỪ moz_places WHERE id> = 50200;
- khôi phục hành vi đầu ra bình thường
đầu ra .output
danh sách .mode
- Lưu ý rằng các
INSERT
câu lệnh trong dump2.sql
tệp bắt đầu bằng INSERT INTO table VALUES
, vì vậy hãy sử dụng tính năng tìm và thay thế trong trình soạn thảo văn bản của bạn để thay thế tất cả các phiên bản của chuỗi này bằng INSERT INTO moz_places VALUES
.
- Sao chép toàn bộ nội dung của
dump2.sql
tệp và dán nó vào dump.sql
tệp nơi ERROR
nhận xét xuất hiện.
- Thay thế
ROLLBACK; -- due to errors
ở cuối tập tin bằng COMMIT;
.
- Thêm mã sau vào đầu
dump.sql
tệp. Thay thế <version>
bằng giá trị chính xác, được yêu cầu cho Firefox để xác định phiên bản lược đồ cơ sở dữ liệu dựa trên phiên bản Firefox, như sau (có thể tìm thấy tệp này trong tệp nguồn Firefox toolkit/components/places/Database.cpp
):
- Firefox 52: lược đồ phiên bản 35
- Firefox 53: lược đồ phiên bản 36
- Firefox 57: lược đồ phiên bản 39
- Firefox 58: lược đồ phiên bản 41
- Firefox 60: lược đồ phiên bản 43
- Firefox 61: lược đồ phiên bản 47
- Firefox 62: lược đồ phiên bản 52
- Firefox 69: lược đồ phiên bản 53
PRAGMA user_version = <phiên bản>;
Tạp chí PRAGMA_mode = cắt ngắn;
Trang PRAGMA_size = 32768;
MÁY HÚT BỤI;
Tạp chí PRAGMA_mode = wal;
- Thoát khỏi vỏ SQLite, xóa
places.sqlite
, sau đó khởi động vỏ SQLite tạo places.sqlite
cơ sở dữ liệu trống bằng cách sử dụng sqlite3 places.sqlite
. Nhập .read dump.sql
để tải kết xuất SQL vào cơ sở dữ liệu.
- Khởi động Firefox và xác nhận rằng lịch sử và thanh vị trí của bạn đang hoạt động như dự định. Khi bạn đã xác nhận rằng mọi thứ đều ổn, hãy xóa các tệp kết xuất cơ sở dữ liệu và SQLite shell thực thi khỏi thư mục hồ sơ.
Thông tin liên quan khác có thể được tìm thấy trên các trang sau:
Một thủ tục đơn giản được mô tả trong bài viết MDN này nhưng tôi chưa thử nghiệm nó. Tuy nhiên, tôi đã kết hợp PRAGMA
các lệnh cập nhật từ bài viết đó.
1 SQL thường không đảm bảo rằng đầu ra cơ sở dữ liệu sẽ được cung cấp theo bất kỳ thứ tự nào trừ khi bạn sử dụng ORDER BY
mệnh đề. Tuy nhiên, ORDER BY
có khả năng sẽ không tạo ra bất kỳ đầu ra nào trên cơ sở dữ liệu bị hỏng (vì SQLite sẽ cần phải đọc toàn bộ bảng trước khi có thể tạo ra bất kỳ đầu ra nào). Theo như tôi biết, Firefox luôn ghi moz_places
các mục trong bảng với ID tuần tự, vì vậy chúng tôi có thể giả định rằng tất cả đầu ra được sắp xếp theo ID.