Kết xuất / khôi phục db một phần


8

Một phần cơ sở dữ liệu của tôi (PostgreQuery 9.3) dựa trên các bảng bổ sung (ví dụ: Quận, Thành phố, Thị trấn, ...). Tôi không quản lý các bảng này, chúng được cập nhật thường xuyên bởi bên thứ ba. Mỗi lần tôi nhận được một bãi chứa đầy đủ mới, nhưng tôi có một thời gian khó khăn để đẩy các thay đổi trở lại DB của mình.

Tôi đã chơi với pg_dump / restore và gặp một số vấn đề ràng buộc duplicate key value violates unique constrainthoặc cannot drop constraint ... because other objects depend on itthậm chí với --disable-triggershoặc --cleantùy chọn.

Có một lựa chọn tôi đã bỏ lỡ? Tôi đã tìm thấy một số cách để bật / tắt ràng buộc nhưng tôi không biết liệu đó có phải là cách tốt để giải quyết vấn đề này hay chỉ là một bản hack bẩn? (Tôi không phải là chuyên gia DBA.) Thành thật mà nói, tôi khá ngạc nhiên không có cách nào dễ dàng để đạt được điều này. Có lẽ tôi đã bỏ lỡ nó! Tôi ngây thơ nghĩ rằng tôi có thể chạy pg_restore như một giao dịch lớn và kiểm tra các ràng buộc ở cuối tập lệnh. Có thể không?

Câu trả lời:


2

Một UNIQUEràng buộc không phải là một kích hoạt. Nó được thực hiện bằng cách của một chỉ số duy nhất . Vì vậy, nó không thể được tắt với --disable-triggers.

"Các đối tượng khác" phụ thuộc vào một ràng buộc duy nhất thường là các ràng buộc khóa ngoài. Chúng không thể tồn tại mà không có ràng buộc (hoặc khóa chính) duy nhất trên (các) cột được tham chiếu. Để cho phép khôi phục, bạn có thể xóa tất cả các ràng buộc fk như vậy cùng với các ràng buộc duy nhất.

Tất nhiên, để khôi phục tính toàn vẹn tham chiếu, sau đó bạn sẽ phải loại bỏ các bản sao vi phạm và tạo lại tất cả các ràng buộc đã xóa. Nếu bạn không đủ khả năng để có trạng thái không nhất quán, thậm chí là tạm thời, hãy thực hiện tất cả trong một giao dịch (tự động chặn).

Nếu bạn không thể đủ khả năng khóa độc quyền trên các bảng có liên quan, tùy chọn duy nhất còn lại của bạn là sửa dữ liệu của bạn trước. Đây có lẽ là cách tốt nhất để hành động . Bạn có thể nhập dữ liệu của mình vào các bảng tạm thời với COPY, xóa các bản sao và sau đó INSERTvào các bảng mục tiêu.

Mặt khác, nếu bạn gặp phải các giá trị thiếu cho khóa ngoại, bạn có thể ứng biến với các NOT VALIDràng buộc fk:

Vấn đề của bạn không bao giờ nên xảy ra để bắt đầu với. Nếu bạn thực sự có một ràng buộc ĐỘC ĐÁO, bạn không thể có các giá trị trùng lặp trong cơ sở dữ liệu nguồn của mình - trừ khi nó bị hỏng nghiêm trọng. Nếu đó là trường hợp, hãy sửa db nguồn của bạn trước ...


3

Làm thế nào về việc cố gắng giải quyết vấn đề này với Point-In-Time-Recovery? Một bãi chứa có vấn đề là dù sao bạn cũng có một bộ dữ liệu cũ. Tôi đặc biệt khuyên bạn nên sử dụng phương pháp sao lưu cung cấp cho bạn các phiên bản dữ liệu gần đây hơn.

Bạn cũng có thể tự viết cho mình một trình kích hoạt nhật ký thay đổi đơn giản lưu trữ tất cả thông tin đã thay đổi trong một bảng đơn giản. Đây là cách nó hoạt động: http://www.cybertec.at/tracking-changes-in-postgresql/ Mã trong trang web sẽ cung cấp cho bạn một nguyên mẫu thô và giúp bạn sửa chữa mọi thứ.


Giới thiệu, cảm ơn thông tin. Thật không may, tôi không có bất kỳ sự kiểm soát nào về cách tạo ra một phần kết xuất. Tôi sẽ chỉnh sửa câu hỏi của tôi để làm cho nó rõ ràng hơn về điểm này.
ablm
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.