Không có lệnh hoặc công cụ kiểm tra tính nhất quán tích hợp trong PostgreSQL.
Quan điểm chung là không cần thiết, vì tham nhũng và không nhất quán không thể có trên một ngăn xếp phần cứng / phần mềm chất lượng. Nếu có vấn đề phát sinh, không có gì đảm bảo bất kỳ loại kiểm tra tính nhất quán nào sẽ tìm thấy chúng, vì vậy nó sẽ tạo ra cảm giác an toàn sai lầm. Tôi không đồng ý với tình cảm đó, nhưng đó là những gì dường như xuất hiện khi điều này được thảo luận định kỳ trên các tin tặc.
Như thường lệ, vấn đề cơ bản là không ai đặc biệt cần một công cụ kiểm tra tính nhất quán để đáp ứng nhu cầu tức thời của họ, vì vậy không ai dành thời gian để viết một cái để gãi ngứa và không ai tài trợ cho việc phát triển một hợp đồng thương mại hoặc nội bộ. Tình nguyện? : p
PostgreSQL (cho đến 9.3) không hỗ trợ tổng kiểm tra mức khối. Vì vậy, một trong những điều chính mà bạn sử dụng để xác minh đã không tồn tại và do đó không thể được xác minh. Một công cụ để quét tất cả các mối quan hệ và xác nhận tổng kiểm tra không tồn tại trong PostgreQuery 9.3, nhưng sẽ được thêm vào và có thể xuất hiện trong phiên bản tương lai. Trong thời gian đó, tất cả những gì bạn có thể làm là SELECT *
từ mỗi mối quan hệ riêng lẻ - nhưng do thực tế là PostgreQuery sử dụng bộ đệm bộ đệm của hệ điều hành để đọc nên không có người bảo đảm nào thực sự buộc phải đọc khối đĩa bên dưới. Một công cụ mới sẽ là cần thiết để làm điều này.
PostgreSQL có xu hướng tránh lưu trữ thông tin dư thừa nếu có thể, do đó thường không có gì để kiểm tra, chỉ là một nguồn có thẩm quyền duy nhất. Trình kiểm tra tính nhất quán không thể làm được gì nhiều trừ khi cùng một thông tin xuất hiện hoặc có thể được lấy từ nhiều nơi khác nhau.
Cũng rất khó để thực hiện bất kỳ loại kiểm tra hữu ích nào đồng thời, trên cơ sở dữ liệu vẫn còn bận rộn và hoạt động. Hầu hết các cài đặt sẽ không sẵn sàng khóa toàn bộ cơ sở dữ liệu, hoặc ít nhất một số mối quan hệ chính tại một thời điểm, để chạy một số loại kiểm tra tính nhất quán. Vì vậy, trình kiểm tra sẽ cần có khả năng hoạt động trên cơ sở dữ liệu chịu sự điều chỉnh đồng thời, khiến việc viết nó trở nên khó khăn hơn và có thể phát hiện ít vấn đề hơn một cách đáng tin cậy.
Vẫn còn nhiều công cụ xác thực có thể làm nếu một công cụ được viết, đặc biệt là nếu nó được phép thực hiện nhiều khóa độc quyền quan hệ:
Kiểm tra xem tất cả các không gian bảng tồn tại trên đĩa.
Kiểm tra xem mỗi pg_class
mục có tệp (s) tương ứng với mục relfilenode
trong không gian bảng chính xác.
Kiểm tra bản đồ khả năng hiển thị, bản đồ không gian trống, v.v., đảm bảo chúng có mặt khi chúng cần, có thể đọc được và có vẻ phù hợp với mối quan hệ mà chúng được liên kết.
Báo cáo các nút tập tin mồ côi trên đĩa. (Đây là những điều bình thường do DDL giao dịch và lười hủy liên kết, nhưng một người kiểm tra có thể buộc phải hủy liên kết và khóa tất cả các mối quan hệ trước khi chạy kiểm tra).
Đọc mọi khối của mỗi mối quan hệ và tìm kiếm các vấn đề rõ ràng. Đối với các mối quan hệ heap đó sẽ là những thứ như:
- một
xmin
lớn hơn xmax
(sau khi xem xét XID bọc xung quanh)
- Bộ dữ liệu được tạo bởi các giao dịch trong tương lai
- chuỗi HOT bị hỏng / chuỗi ctid bị hỏng
- cấu trúc bộ dữ liệu không khớp với các thuộc tính bảng
- bất kỳ Datum nào không chạy khứ hồi
_in
và các _out
chức năng không thay đổi hoặc gây ra lỗi
NULL
Các trường bitmap được đặt trên NOT NULL
các thuộc tính bảng
- Thực hiện lại các
CHECK
ràng buộc không thành công
Kiểm tra lại khóa ngoại và ràng buộc loại trừ sau khi khóa tất cả các bảng có liên quan
... và có lẽ nhiều hơn nữa tôi không biết đủ về can đảm của PG để tìm hiểu, chẳng hạn như cố gắng phát hiện các trang bị rách, xác thực cấu trúc cây b, kiểm tra chỉ số GIN và GiST, kiểm tra độ tỉnh táo pg_control
, và nhiều hơn nữa tôi sẽ không biết nơi để bắt đầu với.
Nếu bạn muốn có một công cụ như vậy, điều tốt nhất nên làm là học đủ để đưa ra một đề xuất cụ thể về cách thức hoạt động của nó - và dành thời gian để làm việc với nó, hoặc tài trợ cho người khác dành thời gian cho nó phát triển.
Cá nhân tôi thực sự rất vui khi có một cái gì đó có thể kiểm tra cụm cơ sở dữ liệu đã dừng bằng chế độ khởi động đặc biệt cho phần postgres
phụ trợ, vì vậy tôi có thể (phần nào) xác thực các bản sao cơ sở dữ liệu vật lý được thực hiện với pg_basebackup
, với pg_start_backup()
rsync và pg_stop_backup
, với cấp độ hệ thống tệp ảnh chụp nguyên tử, vv
Thay phiên, bạn có thể làm những gì hầu hết những người khác làm: Đảm bảo ngăn xếp phần cứng và phần mềm của bạn mạnh mẽ và được cấu hình đúng cách, giữ các bản sao lưu tốt và theo dõi nhật ký của bạn. Không có sự thay thế nào cho việc kiểm tra toàn bộ ngăn xếp trước khi đưa vào máy chủ - và để sao lưu tốt, cả vật lý (truyền phát / PITR) và logic (kết xuất). Thực hiện kiểm tra plug-pull trên cơ sở dữ liệu được tải - lặp đi lặp lại - trước khi đi vào hoạt động để đảm bảo hệ thống con I / O được cho là đáng tin cậy của bạn thực sự. Sử dụng nhiều hình thức sao lưu.