Kết xuất postgres chỉ các phần của bảng cho ảnh chụp nhanh của nhà phát triển


95

Khi sản xuất, cơ sở dữ liệu của chúng tôi có kích thước vài trăm gigabyte. Để phát triển và thử nghiệm, chúng tôi cần tạo ảnh chụp nhanh của cơ sở dữ liệu này tương đương về mặt chức năng, nhưng chỉ có kích thước 10 hoặc 20 hợp đồng biểu diễn.

Thách thức là dữ liệu cho các thực thể kinh doanh của chúng tôi nằm rải rác trên nhiều bảng. Chúng tôi muốn tạo một số loại ảnh chụp nhanh đã lọc để chỉ một số thực thể được đưa vào kết xuất. Bằng cách đó, chúng tôi có thể nhận được các ảnh chụp nhanh mới hàng tháng hoặc lâu hơn cho nhà phát triển và thử nghiệm.

Ví dụ: giả sử chúng ta có các thực thể có mối quan hệ nhiều-nhiều sau:

  • Công ty có N Phòng
  • Bộ phận có N nhân viên
  • Nhân viên có N Hồ sơ chuyên cần

Có thể có 1000 công ty, 2500 bộ phận, 175000 nhân viên và hàng chục triệu hồ sơ tham dự. Chúng tôi muốn một cách có thể nhân rộng để kéo, chẳng hạn như 100 công ty đầu tiên và tất cả các bộ phận cấu thành, nhân viên và hồ sơ tham dự .

Chúng tôi hiện đang sử dụng pg_dump cho lược đồ, sau đó chạy pg_dump với --disable-trigger và --data-only để lấy tất cả dữ liệu ra khỏi các bảng nhỏ hơn. Chúng tôi không muốn phải viết các tập lệnh tùy chỉnh để lấy ra một phần dữ liệu vì chúng tôi có chu kỳ phát triển nhanh và lo ngại rằng các tập lệnh tùy chỉnh sẽ mỏng manh và có khả năng bị lỗi thời.

Làm thế nào chúng ta có thể làm điều này? Có các công cụ của bên thứ ba có thể giúp lấy ra các phân vùng hợp lý từ cơ sở dữ liệu không? Những công cụ này được gọi là gì?

Bất kỳ lời khuyên chung cũng đánh giá cao!

Câu trả lời:


108

Trên các bảng lớn hơn, bạn có thể sử dụng lệnh COPY để lấy ra các tập hợp con ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

Bạn nên xem xét việc duy trì một tập hợp dữ liệu phát triển thay vì chỉ kéo một tập hợp con của quá trình sản xuất của bạn. Trong trường hợp bạn đang viết các bài kiểm tra đơn vị, bạn có thể sử dụng cùng một dữ liệu được yêu cầu cho các bài kiểm tra, cố gắng đáp ứng tất cả các trường hợp sử dụng có thể.


Tôi đã sử dụng kỹ thuật này rất thành công để làm điều tương tự như OP. Để chạy thử nghiệm, tôi đã tải dữ liệu bị ràng buộc COPY (SELECT ..) TO .. ​​vào cơ sở dữ liệu "mẫu" và sử dụng CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Tất nhiên, tôi đã mở rộng dữ liệu xuống mức tối thiểu để các hoạt động tạo db được tải nhanh và kiểm tra sản phẩm đủ nhanh để không trở thành trở ngại của nhóm.
Trey

5
Có cách nào để làm cho việc này hoạt động nếu bạn có nhiều bảng đã tham gia mà bạn muốn có ảnh chụp nhanh không? COPY FROM không hỗ trợ nhập nhiều bảng.
mlissner

1
Bạn là người đàn ông ... Điều này làm cho mọi thứ trở nên thật dễ dàng với tôi, nhưng cho một mục đích khác. Tôi đã sử dụng nó để di chuyển dữ liệu từ giản đồ công khai sang lược đồ người dùng cụ thể trong ứng dụng nhiều người thuê. Cảm ơn !
Jeremy F.

5
Lưu ý rằng phương pháp này không cập nhật các trình tự trên các bảng đã sao chép, do đó, việc chèn thêm có thể vi phạm các ràng buộc về khóa chính.
user2859458 14/02/18

1
Tôi cũng phải sử dụng \copythay vì COPYcả, vì cái sau chỉ dành cho siêu người dùng. May mắn thay, mọi thứ khác hoạt động hoàn hảo mà không có thay đổi nào khác trong 9.1.
PJSCopeland

8

Tôi không biết về bất kỳ phần mềm nào đã làm được điều này, nhưng tôi có thể nghĩ ra 3 giải pháp thay thế. Thật không may, tất cả chúng đều yêu cầu một số mã hóa tùy chỉnh.

  1. Tạo lại tất cả các bảng trong một lược đồ riêng biệt, sau đó sao chép vào các bảng đó chỉ tập hợp con dữ liệu bạn muốn kết xuất, sử dụng INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...và kết xuất dữ liệu đó.

  2. Viết tập lệnh của riêng bạn để kết xuất dữ liệu dưới dạng câu lệnh SQL. Tôi đã sử dụng phương pháp này trong quá khứ và nó chỉ mất khoảng 20-30 dòng PHP.

  3. Sửa đổi pg_dump để nó chấp nhận một điều kiện cùng với công tắc -t khi kết xuất một bảng.


6

http://jailer.sourceforge.net/ thực hiện điều này.


12
Mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
talonmies

3
Điều đó không thực sự có ý nghĩa ở đây. OP đã hỏi cụ thể về tên của các công cụ của bên thứ ba thực hiện điều này. Do đó, bản chất của câu trả lời chỉ là, "Có một công cụ của bên thứ ba được gọi là 'Jailer' thực hiện việc này, tại URL này." Bản thân liên kết đó cung cấp tất cả thông tin cần thiết đó; không có gì khác để thêm. Nếu liên kết đó ngừng hoạt động, nó có thể dễ dàng được suy ra từ URL rằng "chương trình được gọi là Jailer", vì vậy sẽ là thừa nếu thêm nó.
Paul Legato

2
Tất nhiên liên kết bây giờ đã bị hỏng, và google sẽ không có sự thay thế nào.
owensmartin

1
Liên kết hiện hoạt động đối với tôi và Googling cho "jailer postgres" cũng xuất hiện github.com/Wisser/Jailer .
Paul Legato

8
Có lẽ nếu bạn thêm một mô tả hữu ích của howbạn sử dụng công cụ này, chúng ta có thể hiểu nó như thế nào đạt được mục tiêu
Bryan Ash
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.