Làm cách nào tôi có thể xuất một tập hợp con của tabledata từ cơ sở dữ liệu sản xuất vào cơ sở dữ liệu thử nghiệm cục bộ của mình?


10

Chúng tôi có một postgres sản xuất tương đối lớn dựa trên db: ~ 20GB. Cơ sở dữ liệu PostgreSQL được lưu trữ trên heroku.

Tôi muốn sao chép một tập hợp con nhỏ của dữ liệu bảng vào cơ sở dữ liệu cục bộ của tôi để tôi có thể chạy một số thử nghiệm trên chúng mà không phải làm việc trên sản xuất.

Tôi không muốn tự tạo dữ liệu mẫu mà chỉ sử dụng dữ liệu đã tồn tại trong môi trường sản xuất.

~ 100 hàng từ mỗi bảng trong cơ sở dữ liệu là đủ. Có một cách dễ dàng để thực hiện điều này?


1
Vì tò mò, tại sao 20GB lại có quá nhiều dung lượng đĩa? Tôi có 100GB được phân bổ trên đĩa thử nghiệm trên máy ảo của mình chỉ cho không gian cào DB.
jcolebrand

Vì đôi khi tôi không mang theo hd bên ngoài, ssd của tôi đơn giản là không cung cấp đủ dung lượng. Thêm vào đó, tôi thực sự chỉ cần dữ liệu mẫu từ db của mình chứ không phải toàn bộ db.
jottr

1
Đủ công bằng, nhưng tôi khuyến khích bạn dù sao để có được sáng tạo. Hãy xem xét thẻ SD để vừa với khe SD, vì tôi chưa bao giờ gặp vấn đề với việc có nhiều dữ liệu hơn :-) nhưng điều đó thật tệ: - \ máy tính xách tay cá nhân của tôi giảm xuống còn 10GB miễn phí.
jcolebrand

Câu trả lời:



1

Jailer có thể giúp đỡ trong tình huống này. Tôi đang làm việc trên cùng một bảng với bạn (cố gắng lấy ~ 100 bản ghi của mỗi bảng) và đây là các bước tôi đã làm: - Tìm thực thể gốc (liên kết với hầu hết các bảng) và nhận tập hợp con của các bản ghi của một hàng gốc (ví dụ: root là người, sau đó tôi sẽ tìm tất cả các bản ghi liên quan đến people.id = 1 ...) - Sau khi hoàn thành bước 1, hãy bắt đầu lại với một bảng khác (bảng mà bạn muốn có 100 bản ghi ) và nhận tập hợp con của nó từ kết quả trên.


1

Một lựa chọn khác là thứ mà tôi mới bắt gặp gần đây (được cho phép, tôi vẫn chưa sử dụng nó, nhưng dự định sẽ sớm ra mắt) : rdbms-subsetter.

Nó đơn giản và nhẹ hơn một chút so với Jailer, với một vài tính năng / đặc quyền tốt đẹp:

  • CLI rất dễ dàng kết nối với dụng cụ hiện có
  • Mã nguồn mở
  • Sẽ theo các khóa ngoại để lấy một tập hợp con dữ liệu mạch lạc
    • Nếu bạn không có khóa ngoại được xác định rõ, các mối quan hệ có thể được cung cấp qua tệp cấu hình JSON. Trong trường hợp của tôi, tôi dự định tạo cấu hình này từ siêu dữ liệu lược đồ được lưu trữ ở nơi khác (cảm ơn, Rails: \)
  • Bạn có thể nhắm mục tiêu một hàng cụ thể và nhận tất cả các hồ sơ liên quan (ví dụ: một khách hàng cụ thể đang gặp sự cố, vì vậy bạn có thể kéo xuống mọi thứ để dữ liệu công việc của tài khoản của họ có thể truy cập cục bộ)
  • Nó có thể lấy số lượng bản ghi không đổi trên mỗi bảng hoặc lấy logarit để lấy thêm dữ liệu từ các bảng lớn hơn mà không cần quá tải.

Đáng để đề cập đến một tùy chọn khác cho cơ sở dữ liệu Heroku cụ thể, mà tôi đã sử dụng rất nhiều (như tôi đã từng làm việc ở đó).

Heroku thực sự khá nhanh trong việc đưa ra một DB bị bẻ khóa mới khi nó kéo các bản ghi viết trước để chuẩn bị, sau đó kết nối với DB chính để bắt kịp, sau đó dừng theo dõi nó. Bạn có thể tạo các "nhánh" này trên các ứng dụng để tránh ảnh hưởng đến sản xuất quá nhiều:

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

Sau đó, bạn có thể khởi động ứng dụng của mình cục bộ chỉ vào ảnh chụp nhanh đó. Tôi sử dụng điều này thường xuyên để thực hiện một quá trình di chuyển dữ liệu hoặc lược đồ hoặc gỡ lỗi các vấn đề của khách hàng.

Trong lệnh trên, nếu bạn có một DB truy cập với DATABASE_URLtrên your-production-app, bạn sẽ kết thúc với một DB truy cập với PRODUCTION_SNAPSHOT_URL(nếu bạn đã xác định --as) trên một ứng dụng khác nhau được đặt tên some-other-app-to-own-forked-database.


0

Để có được một bộ hàng ngẫu nhiên, bạn có thể sử dụng GIỚI HẠN như thế này:

SELECT * FROM my_table LIMIT 100

Đây là cách dễ nhất và sẽ chỉ chọn 100 hàng đầu tiên mà PostreSQL đi qua. Nó có thể là 100 cuối cùng được chèn hoặc có thể là 100 đầu tiên. Nếu bạn cần một cái gì đó thực sự ngẫu nhiên, hãy xem câu trả lời Stackoverflow này .


Cảm ơn bạn đã cố gắng giúp đỡ, nhưng điều này không trả lời câu hỏi của tôi.
jottr

Tôi biết làm thế nào để hạn chế lựa chọn của tôi. Vấn đề của tôi là, tôi cần một số cách để sao chép db từ heroku với một tập hợp con dữ liệu của nó; Việc bỏ toàn bộ db như được mô tả trong hướng dẫn sử dụng herokus không phải là một lựa chọn.
jottr

1
@elementz - Có lý do gì bạn không thể lặp qua các bảng và SAO CHÉP (CHỌN ... GIỚI HẠN 100) ĐẾN 'tên tệp' ...? Bạn có thể không SAO CHÉP trong Heroku không?
rfusca

@rfusca - Tôi không biết SAO CHÉP tồn tại. Tôi sẽ thử và báo cáo lại.
jottr

3
@rfusca: sử dụng đơn giản LIMITsẽ không thỏa thuận với các tham chiếu FK. Ví dụ: 100 hàng từ bảng đơn hàng có thể chứa các khách hàng không có mặt khi xuất 100 hàng từ bảng khách hàng.
a_horse_with_no_name
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.