2011-09-08 43 views
20

Đây không phải là truy vấn. Một bản tóm tắt giải pháp của chúng tôi để giải quyết vấn đề tham nhũng trong các tệp cơ sở dữ liệu SQL Compact với thành công nhất định (gần như). SQLCE Tham nhũng là một vấn đề rất phổ biến. Chúng tôi đã nhận được sự trợ giúp to lớn từ các bài đăng trước đó trong StackOverflow và do đó, bài đăng này.giải quyết tham nhũng trong các tệp cơ sở dữ liệu SQL Server Compact Edition

Sản phẩm của chúng tôi là kiến ​​trúc 3 tầng với máy chủ đang chạy dưới dạng Dịch vụ Windows được kết nối với Rich Clients thông qua .Net Remoting. Sản phẩm của chúng tôi sử dụng SQLCE từ năm 2006. Chúng tôi đã chuyển từ v3.1 sang v3.5 và bây giờ là v4.0. Chúng tôi có một công cụ OR-Mapping tùy chỉnh cho một số yêu cầu rất cụ thể. Chúng tôi đã phải đối mặt với vấn đề giới hạn với v3.1, chúng tôi đã phải đối mặt nhiều hơn với v3.5 và v4.0.

Ban đầu với v3.5, chúng tôi đã triển khai SqlCeEngine.Repair. Nhưng nó chỉ làm giảm dữ liệu bị hỏng và cố gắng tạo lại một db ổn định. Chúng tôi nhận thấy rằng các khóa ngoại của các bảng bị ảnh hưởng bị mất. Chúng tôi phải làm điều này ngay lập tức. Chúng tôi bắt đầu thông báo cho người dùng về tham nhũng db và khôi phục bản sao lưu cuối cùng. Điều này chỉ cung cấp cứu trợ tạm thời; vấn đề tham nhũng vẫn đứng vững.

Năm nay, chúng tôi đã thông qua v4.0. Tuy nhiên, ứng dụng của chúng tôi cũng giới thiệu một số tính năng mới giúp tăng đáng kể số lượng cuộc gọi cơ sở dữ liệu. v4.0 bắt đầu tốt, nhưng bắt đầu đưa ra các vấn đề khi sử dụng phần mềm tăng lên. Tham nhũng xảy ra trong khi ứng dụng đang chạy không gây ra bởi Windows bị lỗi, tắt máy bất thường hoặc các vấn đề về đĩa. Cơ sở dữ liệu chỉ bị hỏng.

Các bài tiếp theo bao gồm các giải pháp mà chúng tôi đặt ra cho vấn đề này:

+0

Bạn có thể mô tả vấn đề chi tiết hơn, sau đó chuyển giải pháp xuống một câu trả lời? Cảm ơn. –

Trả lời

17

[Tách các truy vấn và giải pháp]

Ở đây đi làm sao chúng ta giải quyết vấn đề:

A) Bế mạc/Vứt bỏ Các đối tượng Connection/Command/Transaction: Chúng tôi đảm bảo rằng không có các đối tượng kết nối, giao dịch hoặc lệnh không được sử dụng, không được sử dụng. Công cụ ORM của chúng tôi được sử dụng để tạo các đối tượng mới sau khi gọi cam kết trên giao dịch, mà nằm nhàn rỗi trong một số trường hợp. Điều này khá nhiều làm giảm số lượng các tham nhũng bằng 50%.

B) Tắt thu hẹp tự động: Quy trình duy nhất xảy ra ở giữa một lần chạy ứng dụng, mà trên đó chúng tôi không kiểm soát được Tự động thu hẹp. Chúng tôi đã gọi SqlCeEngine.Compact khi ứng dụng bắt đầu. Chúng tôi quyết định loại bỏ cả Compacting và Auto-Shrinking. Và trước sự ngạc nhiên của chúng tôi, chúng tôi đã giảm thêm 48% sự tham nhũng. Đó là một phát bắn trong bóng tối, và chúng tôi không thể tin rằng Auto-Shrinking có thể đã gây ra những vấn đề như vậy. Chúng tôi đã giải quyết được vấn đề với bản cập nhật đó.

C) Giao dịch cơ sở dữ liệu được đồng bộ hóa: Một số lỗi cơ sở dữ liệu vẫn xảy ra. Không có lý do rõ ràng nào được phát hiện, chúng tôi đã quyết định đồng bộ hóa các giao dịch cơ sở dữ liệu! Tôi biết rằng rất nhiều người cơ sở dữ liệu sẽ không thích điều này. Tôi cũng không thích. Chúng tôi đã giới thiệu các khóa ở tầng giữa của chúng tôi để đảm bảo rằng chỉ có một cuộc gọi đang sửa đổi cơ sở dữ liệu tại một thời điểm. Triển khai lớn nhất của chúng tôi là 55 khách hàng đồng thời sử dụng hệ thống của chúng tôi. Việc đồng bộ hóa các cuộc gọi cơ sở dữ liệu hầu như không dẫn đến bất kỳ sự chậm trễ hiệu suất rõ ràng nào. Thay vào đó, Đồng bộ hóa cho phép chúng tôi thực hiện một cuộc gọi định giờ theo định hướng tới SqlCeEngine.Compact ở các khoảng thời gian đều đặn. Chúng tôi biết rằng Compact không phải là thủ phạm, và chúng tôi cảm thấy rằng Compaction là một cuộc gọi cần thiết vì nó reindexes db (giải pháp của chúng tôi làm rất nhiều chèn và xóa). Tuy nhiên, nó cần phải hoạt động độc quyền; không có cuộc gọi cơ sở dữ liệu khi bạn gọi Compact. Đồng bộ hóa cho phép chúng tôi kiểm soát điều đó trong khi chạy ứng dụng. Kể từ khi chúng tôi đã làm điều đó, chúng tôi đã không nhận được một vấn đề cơ sở dữ liệu tham nhũng duy nhất. Đã hơn một tháng rồi. Từ gần 5 khách hàng trong một tuần, đến 0 trong một tháng.

Lý do cơ bản dẫn chúng ta đến ý tưởng B và C là SQLCE là một cơ sở dữ liệu nhúng. Tham nhũng là phổ biến đối với mọi giải pháp cơ sở dữ liệu nhúng. Các giải pháp cơ sở dữ liệu toàn diện hoạt động độc lập được hỗ trợ bởi các kết nối quản lý máy chủ db7 và các nhiệm vụ khác. Một hệ thống cơ sở dữ liệu nhúng không có một hệ thống hỗ trợ như vậy. Giai đoạn duy nhất khi nó còn sống là khi một kết nối được mở ra.

Một số gợi ý khác: 1) Chúng tôi thực hiện cam kết với CommitMode.Immediate, làm cho thuộc tính Flush-Interval thừa. 2) AutoShrink được đặt thành 100, vô hiệu hóa quy trình hoàn toàn 3) Tôi đã tăng thời gian chờ kết nối để cho phép các cuộc gọi cơ sở dữ liệu được đồng bộ hóa hoạt động trơn tru. 4) Compact được gọi khi ứng dụng khởi động. Trong trường hợp khách hàng không tắt máy, chúng tôi đã thực hiện bộ hẹn giờ để gọi Compact mỗi 24 giờ.

Hy vọng bài đăng này giúp giải quyết sự cố.

+0

Cảm ơn bài đăng chi tiết này. Tôi đang ở trong một tình huống tương tự. Việc triển khai SQL CE đầu tiên của tôi đã làm việc tốt trong phát triển, nhưng đã bị rơi vào sáng nay trong sản xuất. Đang thử đề xuất của bạn. –

+0

@desaiw: JFYI, tất cả các hỏng hóc đưa đến thông báo của chúng tôi sau khi điều này là do sự cố máy chủ, máy chủ treo, v.v. nhưng không có gì không được giải quyết hoặc không xác định. –

+0

Sau khi theo dõi bài đăng của bạn, tôi có thể nói rằng tôi đồng ý một cách an toàn. Cơ sở dữ liệu của chúng tôi hiện đang chạy tốt. Cảm ơn bạn một lần nữa. –

5

Nếu sử dụng SQL Server CE 4.0, có một sự cố đã biết có thể ngăn dữ liệu bị xóa thành đĩa (AT ALL). https://support.microsoft.com/en-us/kb/2979868 và hotfix https://support.microsoft.com/en-us/kb/2960153

Nói cách riêng của họ:

Giả sử rằng bạn đã xác định khoảng thời gian tuôn ra trong số lượng tối đa giây trong chuỗi kết nối trước khi giao dịch cam kết đang đỏ mặt vào đĩa trong Microsoft SQL Server Compact 4.0 . Trong tình huống này, các giao dịch được cam kết có thể mất nhiều thời gian hơn khoảng thời gian xả để được xả vào đĩa hoặc thậm chí không được xả vào đĩa. Ngoài ra, mất dữ liệu xảy ra nếu có một chương trình chấm dứt bất thường.

Các hotfix mà giải quyết vấn đề này được bao gồm trong một hotfix gói cập nhật theo yêu cầu cho SQL Server Compact 4.0 Service Pack 1.

Cách giải quyết cung cấp là sử dụng transaction.Commit(CommitMode.Immediate) xung quanh khối bạn muốn chắc chắn bị tuôn ra

+0

Bạn có thể phác thảo giải pháp từ liên kết trong câu trả lời không? Đây là bảo hiểm chống lại thối liên kết. –

+0

cảm ơn @JamesJones Ive đã cập nhật nó. – hsorbo

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