2010-06-27 31 views
5

Tôi đang cố gắng tìm ra chiến lược an toàn nhất để bảo vệ cơ sở dữ liệu SQLite (dựa trên tệp) của tôi khỏi bị hỏng (trong trường hợp này là tôi làm việc với Adobe Air) áp dụng cho bất kỳ trình duyệt webkit nào sử dụng SQLite, bao gồm cả Mobile Safari).Làm thế nào để bảo vệ cơ sở dữ liệu SQLite khỏi tham nhũng

Tôi đang nghĩ đến việc tạo kết nối cơ sở dữ liệu, giữ khoảng 5 hoặc 10 giây và sau đó đóng nó nếu nó chưa được sử dụng trong khoảng thời gian đó. Suy nghĩ của tôi là máy nên gặp sự cố hoặc ứng dụng thoát bất thường, rất có thể là tệp đã bị đóng và do đó ít có khả năng bị hỏng. Nhưng tôi biết rằng bạn càng thường xuyên mở và đóng một DB được truyền đi, bạn càng có nhiều khả năng bị lỗi nghiêm trọng.

Tôi chắc chắn tôi đang suy nghĩ quá mức, nhưng đối với ứng dụng của tôi, điều quan trọng là trong trường hợp xảy ra sự cố hệ thống, ứng dụng có thể khôi phục sạch sẽ và nhanh chóng và điều đó có nghĩa là tôi phải cố gắng bảo vệ DB nhiều nhất có thể.

Có ai biết chiến lược nào có thể an toàn hơn không?

+1

đây là cách bạn có thể an toàn cơ sở dữ liệu Sqlite của bạn từ tham nhũng: http://blog.systoolsgroup.com/sqlite-corruption-causes/ –

Trả lời

5

Vào cuối của tài liệu này

File Locking And Concurrency In SQLite Version 3

Có một phần tên "6.0 Làm thế nào để tham nhũng Cơ sở dữ liệu của bạn Files" mà thảo luận về tham nhũng curroptions hipotetical vấn đề trong SQLite. "Things that can can go wrong".

+1

Đó là một cách đọc rất thú vị, mặc dù nó không giúp tôi quyết định nên sử dụng phương pháp nào . Tôi đoán rằng ngay cả khi đóng một cơ sở dữ liệu, bạn không đảm bảo rằng dữ liệu đã được cam kết vào đĩa vì điều đó tùy thuộc vào hệ điều hành và phần cứng, không phải SQLite; vì vậy cùng một nguy cơ tham nhũng tồn tại ngay cả với một cơ sở dữ liệu đã đóng. Tuy nhiên, bằng cách đóng cơ sở dữ liệu, bạn cũng nên xóa sạch tập tin tạp chí. Vì vậy, có lẽ nó là phần nào an toàn hơn để đóng tập tin liên tục thay vì giữ nó mở liên tục. – Andrew

+1

Tôi đã suy nghĩ về nó ... và như bạn đã nói, "đó là tùy thuộc vào hệ điều hành và phần cứng" vì vậy ... có lẽ aproach tốt nhất trong một hệ điều hành không thể là aproach tốt nhất trong một khác. Ngoài ra, chúng tôi có thể có vấn đề về hiệu suất nếu chúng tôi mở và đóng (và xả) tệp mỗi vài giây (trong plataforms di động). Vì vậy ... Tôi không thể cung cấp cho bạn một câu trả lời: ( – Jonathan

+1

Chỉ cần theo dõi, vì điều kiện chủng tộc tôi không thể thoát khỏi, tôi đã phải từ bỏ cách tiếp cận mở và đóng liên tục và giữ DB Để giải quyết vấn đề tham nhũng, tôi đang tạo bản sao nóng của cơ sở dữ liệu, kỹ thuật này cũng khiến tôi lo lắng một chút (tạo bản sao của một tệp mở), nhưng vì SQLite sử dụng nhật ký và giao dịch, nên Liên kết của bạn đã giúp tôi hiểu được SQLite tốt hơn nhiều, vì vậy tôi đánh dấu câu trả lời này Cảm ơn bạn – Andrew

1

Đầu tiên KHÔNG sử dụng journal_mode=MEMORY hoặc =OFF.

Chúng ta có thể sử dụng các lệnh này để giảm xác suất của một tham nhũng:

  1. PRAGMA synchronous=FULL hoặc PRAGMA synchronous=EXTRA
  2. PRAGMA fullfsync=ON (chỉ hoạt động trên Mac OS X)

Nhưng họ đi kèm với một chi phí làm cho giao dịch chậm hơn. Và ngay cả với họ db có thể bị hỏng do causes khác như thất bại trong thiết bị lưu trữ hoặc trong bộ nhớ vì vậy chúng tôi phải chuẩn bị sẵn sàng cho vấn đề.

Chúng ta có thể làm thường xuyên backups, nhưng nó có 2 nhược điểm:

  1. Nó sao chép toàn bộ tập tin db trên mỗi backup
  2. Chúng tôi mất tất cả các giao dịch đã được thực hiện sau khi sao lưu cuối cùng

Tôi có một khách hàng đã được sử dụng để thực hiện sao lưu của mình trên một ổ đĩa bút và ổ đĩa bút luôn được cắm vào máy tính cho đến khi một tia sét đến và phá hủy máy tính, bao gồm cả ổ đĩa bút. Tất cả dữ liệu đã bị mất. Vì vậy, bản sao lưu phải được giữ riêng biệt với máy tính chính.

Một giải pháp thay thế tốt hơn là sử dụng bản sao. Với mỗi giao dịch được thực hiện trên db chính được sao chép vào các bản sao.

Đối với SQLite, chúng tôi có thể sử dụng litereplica. Nó hỗ trợ Point-in-Time Recovery và tôi đề nghị sử dụng nó với bản sao vì nếu một số dữ liệu vô tình bị xóa khỏi db chính nó sẽ được nhân rộng. Với PITR, chúng tôi có thể khôi phục lại db đến một điểm trước đó trong thời gian.

Một đề xuất quan trọng khác là giữ bản sao trong một thiết bị riêng biệt và cách nhau với nhau. Ít nhất không phải trong cùng một tòa nhà.

Chạy PRAGMA integrity_check lệnh một lần trong một thời gian là một thực tiễn tốt do thực tế là SQLite không tự động làm và nó tiếp tục ghi vào db trong một số loại tham nhũng.

Và nếu db của bạn sử dụng khóa ngoài, bạn có thể thực hiện tương tự với PRAGMA foreign_key_check.

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