Làm cách nào để sửa chữa cơ sở dữ liệu Firefox.s.site bị hỏng?


15

Tôi đã gặp một số vấn đề với RAM (màn hình blues nhiều lần, Windows XP) và bây giờ cơ sở dữ liệu Firefox của tôi bị hỏng. Firefox đang làm việc, nhưng lịch sử của tôi là ra đi và nó báo cáo một vài mâu thuẫn và sai sót khi thực hiện pragma integrity_checktrên places.sqlite:

hình ảnh đĩa cơ sở dữ liệu là không đúng

Bây giờ câu hỏi, làm thế nào để tôi sửa chữa cơ sở dữ liệu SQLite?


2
Để tham khảo trong tương lai, FEBE (Tiện ích mở rộng sao lưu môi trường Firefox) có thể hữu ích trong tương lai. Sao chép toàn bộ hồ sơ và gói nó thành một bản sao lưu duy nhất. Tôi biết nó không trả lời câu hỏi của bạn, nhưng có thể hữu ích để biết trong tương lai. bit.ly/aumThw
Urda

Chỉnh sửa để giúp nhân viên Google tìm câu hỏi này.
bwDraco - Phục hồi Monica

Câu trả lời:


22

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>.defaultthư mục.
  • Đóng Firefox nếu nó đang chạy.
  • Cơ sở dữ liệu Địa điểm có trong places.sqlitetệp. Nếu tệp bị thay thế do tham nhũng, hãy sử dụng places.sqlite.corrupttệ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.bakhoặc places.sqlite.corrupt.bak.
  • Sử dụng shell SQLite để mở tệp cơ sở dữ liệu ( sqlite3 places.sqlitehoặ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 INSERTphí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_placesliên quan.)

    • Mỗi hàng trong moz_placesbả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 INSERTcâ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 ERRORbì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 SELECTcâ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 SELECTlệ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 INSERTcâu lệnh trong dump2.sqltệ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.sqltệp và dán nó vào dump.sqltệp nơi ERRORnhậ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.sqltệ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.sqlitecơ 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 PRAGMAcá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 BYmệnh đề. Tuy nhiên, ORDER BYcó 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_placescá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.


3
Đây là sự tuyệt vời thuần túy. Đã giúp tôi phục hồi gần như tất cả lịch sử từ một địa điểm bị hỏng. Cảm ơn rất nhiều!!
Ashutosh Jindal

Nó đã giúp, với hai sửa đổi: 1) thêm dấu ";" trong dòng user_version; 2) vì một số lý do, tệp "bị hỏng" của tôi có phiên bản lược đồ "ít hơn một" so với dự kiến. Sau khi phương thức của bạn không hoạt động ban đầu, tôi đã thử nhập kết xuất vào cơ sở dữ liệu mới 10 MB và không thành công vì bảng cũ có ít hơn một cột. Nhìn vào liên kết mã nguồn làm tôi hiểu chuyện gì đang xảy ra. Bài đăng tuyệt vời !!!
Tilman Hausherr

@TilmanHausherr: Địa chỉ. Để tránh sự cố thay đổi cột, hãy đảm bảo làm theo các bước trong câu trả lời này ngay khi bạn nhận thấy tham nhũng và trước khi cập nhật Firefox, để lược đồ cơ sở dữ liệu không bị thay đổi. Bạn cũng có thể thử thiết lập một phiên bản lược đồ cũ hơn Firefox Firefox sẽ cập nhật nó lên phiên bản mới khi bạn khôi phục cơ sở dữ liệu.
bwDraco - Phục hồi Monica

Đặt phiên bản lược đồ trước là những gì tôi đã làm khi viết nhận xét đầu tiên của mình, tức là tôi đã thành công :-) Vâng, tôi nghi ngờ rằng tôi đã không nhận thấy tham nhũng ngay lập tức, tôi thường chỉ chú ý khi nhập các ký tự nên tạo một "URL cũ" xuất hiện và không có gì xảy ra.
Tilman Hausherr

Làm tốt lắm Vui mừng bạn đã cập nhật nó, trong đó đặt nó trở lại trong các câu hỏi hoạt động nơi tôi phát hiện ra nó.
fixer1234

4

Vâng, tùy thuộc vào mức độ hư hỏng của nó, sửa chữa có thể không thể. Đặt cược tốt nhất của bạn có lẽ là thử và kết xuất db bằng cách sử dụng sqlite, sau đó xem những gì bạn có thể cứu vãn.

Nếu thất bại, có lẽ bạn sẽ phải khôi phục từ bản sao lưu.

Để kết xuất và tạo lại cơ sở dữ liệu, hãy sử dụng lệnh .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
Cảm ơn bạn. Bài viết SO không hữu ích vì nó không hoạt động, nhưng giải pháp được tham chiếu trong liên kết đã hoạt động d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Tất cả các favicon đã biến mất, nhưng tôi đang xây dựng lại khi tôi truy cập các trang web. Cảm ơn một lần nữa!
Bobby

stackoverflow.com/questions/2255305/ liên kết trong câu hỏi trên, đã bị tác giả của nó tự nguyện xóa. Câu trả lời dưới đây có thể giúp đỡ.
user66001

@ user66001: Có, OP đã xóa câu hỏi của họ. Tôi đã sao chép các lệnh liên quan.
sleske

Điều này đã không làm việc cho tôi, và tôi đã kết thúc với một places.sqlite.corrupttập tin. Tôi đã đăng một câu trả lời khác với một giải pháp hiệu quả cho tôi.
Daniel

2

Như mọi khi với việc thực hiện sửa chữa như thế này, tôi khuyên bạn trước tiên nên tạo ít nhất một bản sao lưu của tệp tin.s.site trong thư mục hồ sơ của bạn. Có một bản sao lưu cho phép bạn thử nhiều thứ khác nhau để sửa chữa những vấn đề như vậy trong khi biết rằng nếu việc sửa chữa đã làm cho mọi thứ trở nên tồi tệ hơn, bạn luôn có thể tạo một bản sao khác của bản sao lưu để thử lại.

Tùy thuộc vào những gì bị hỏng và mức độ hỏng của nó, có thể khắc phục các sự cố với tiện ích mở rộng Địa điểm bảo trì . Tôi đã kết thúc với một tệp tin.s.site bị hỏng trong một vài lần. Bảo trì Địa điểm đã có thể khắc phục sự cố mỗi lần bằng cách chạy nhiều kiểm tra / sửa lỗi mà nó cung cấp dưới dạng các thao tác trong hộp thoại tùy chọn của nó. Các kiểm tra và / hoặc báo cáo khác nhau sẽ chỉ mất vài phút đến vài phút.

Nếu điều này không hiệu quả, thì việc đi theo cách tự sửa nó theo cách tương tự như những gì DragonLord mô tả ở trên có thể là điều cần thiết.


1

Quá trình này được mô tả trên MDN đã giúp tôi giải quyết vấn đề trong đó các trang mới tôi truy cập không được ghi lại trong lịch sử trình duyệt. Tôi không có places.sqlite.corrupt(hoặcplaces.sqlite-corrupt tệp ), nhưng kiểm tra tính toàn vẹn của places.sqlitetệp của tôi cho thấy hình ảnh đĩa cơ sở dữ liệu bị lỗi.

Thoát khỏi Firefox và tạo một bản sao lưu hồ sơ Firefox của bạn trước khi bạn đi xa hơn ở đây.

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/
$ cp places.sqlite places.sqlite.bak  # for safety

$ sqlite3 places.sqlite
sqlite> PRAGMA integrity_check;
*** in database main ***
On tree page 2 cell 131: Rowid 20884 out of order
...
Error: database disk image is malformed
sqlite> .clone places-clone.sqlite
moz_places... done
moz_historyvisits... done
... more output like above plus a few errors (which I ignored) like
sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence
SQL: [CREATE TABLE sqlite_sequence(name,seq)]
done
...
sqlite> PRAGMA user_version;
43  <----- TAKE NOTE OF THIS VALUE it may be different for you
sqlite> .exit

$ sqlite3 places-clone.sqlite
sqlite> PRAGMA integrity_check;
ok
sqlite> PRAGMA user_version = 43;  -- use the number you got from PRAGMA user_version; above
sqlite> PRAGMA journal_mode = truncate;
truncate
sqlite> PRAGMA page_size = 32768;
sqlite> VACUUM;
sqlite> PRAGMA journal_mode = wal;
wal
sqlite> .exit

$ mv places-clone.sqlite places.sqlite

Bắt đầu Firefox. Lịch sử nên được làm việc lại.

Tôi đang dùng Mac với Firefox 60.0.1. Bạn có thể cần điều chỉnh các lệnh cho nền tảng của bạn.


Cảm ơn Daniel, luôn hữu ích để xem quy trình lệnh thực tế
not2qubit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.