Làm thế nào để so sánh dữ liệu giữa hai cơ sở dữ liệu trong PostgreSQL?


93

Có thể so sánh hai cơ sở dữ liệu có cấu trúc giống hệt nhau không? Giả sử tôi có hai cơ sở dữ liệu DB1 và ​​DB2 và tôi muốn kiểm tra xem có sự khác biệt về dữ liệu giữa chúng hay không.



dbForge Data Compare cho PostgreSQL giải quyết các vấn đề như vậy.
Devart

Câu trả lời:


85

Có một số công cụ hiện có:

(lưu ý rằng hầu hết các công cụ này chỉ có thể so sánh cấu trúc chứ không thể so sánh dữ liệu)

Những người miễn phí:

Thương mại:


17
Chỉ có liquibase.org và Aqua Data Studio dường như so sánh dữ liệu, còn lại chỉ so sánh lược đồ.
Amir Ali Akbari

@AmirAliAkbari Liquibase không hỗ trợ diffs schema
a_horse_with_no_name

2
Có vẻ như apgdiffnó không hỗ trợ tốt các bảng kế thừa và ngoại lệ ném ngay lập tức khi tôi cố gắng sử dụng nó. WbSchemaDiffhoạt động rất tốt, bất ngờ!
smartwjw

1
@AmirAliAkbari liquibase dường như không so sánh dữ liệu khi các bảng tồn tại và có cùng cấu trúc.
aditsu thoát vì SE là EVIL

14
-1. OP đã hỏi về việc so sánh dữ liệu (bản ghi / hàng) và bạn hầu hết đã liệt kê các công cụ so sánh cấu trúc , mà OP đã tuyên bố rõ ràng là giống hệt nhau giữa các cơ sở dữ liệu mục tiêu, không có lý do gì để so sánh chúng. Vui lòng làm rõ những cái nào thực sự làm điều được yêu cầu.
Hiếm khi 'Where's Monica' Needy

39

Hãy thử sử dụng pg_dumptrên cả hai cơ sở dữ liệu và khác biệt các tệp.


23
+1 cho đơn giản và trực tiếp. Nhưng chúng ta có biết chắc chắn rằng pg_dump sẽ kết xuất dữ liệu từ các cơ sở dữ liệu giống hệt nhau theo cùng một thứ tự nếu, giả sử, các bảng được tạo theo các thứ tự khác nhau không? (Tôi muốn hy vọng trật tự dựa trên phụ thuộc ràng buộc, không phải ở tất cả các chăm sóc về thời điểm tạo ra, nhưng hy vọng không quy mô tốt.)
Mike Sherrill 'Cát Nhớ lại'

10
bạn có thể sử dụng -a -d và | sắp xếp. Nhưng dữ liệu này có thể không thể nhập được, tuy nhiên việc kiểm tra cơ bản sẽ ổn.
Cem Güler

Thành thật mà nói, điều này sẽ cao hơn trong kết quả. Người ta không cần phải dựa vào một khác biệt để tiết kiệm thời gian, vì vậy các giải pháp dựa trên java đầy đủ, nặng nề này có vẻ như quá mức cần thiết. Tuy nhiên, bạn nên kiểm tra lại quá trình di chuyển của mình một cách hợp lý và pg_dumptốt cho điều đó. Nếu bạn thấy có sự khác biệt đáng kể, có thể pg_dumpbạn đang cố gắng so sánh những thứ không thể so sánh được. Ít nhất là để so sánh PG dbs.
sas

1
Đáng buồn là điều này chỉ hoạt động trên cơ sở dữ liệu nhỏ hơn, vì diff không thể xử lý một số kết xuất lớn mà tôi có. Nếu không, nó (vẫn còn!) Thực sự là giải pháp khả thi duy nhất mà tôi tìm thấy. Mặc dù tôi đang sử dụng psql -c '\x' -c 'SELECT... ORDER BY...'thay vì pg_dump.
nyov

11

Một ứng dụng miễn phí khác ( chỉ có thể so sánh cấu trúc chứ không thể so sánh dữ liệu ):

DBeaver - bạn có thể chọn cơ sở dữ liệu, bảng, v.v. để so sánh với nhau


1
Bạn vui lòng giải thích rõ hơn cách so sánh dữ liệu từ 2 cơ sở dữ liệu với DBeaver?
nicola

1
Theo như tôi biết thì DBeaver chỉ cho phép so sánh siêu dữ liệu chứ không phải so sánh dữ liệu.
nicola

Công cụ rất hay. Đúng là lúc đầu nó không trực quan lắm. Trước tiên, bạn phải chọn 2 hoặc nhiều đối tượng để có thể thấy tùy chọn này.
ihebiheb

8

Tôi đã đánh giá rất nhiều công cụ và tìm thấy giải pháp sau:

So sánh giản đồ :

Thú vị nhất là Liquibase, Persyas và PgCodeKeeper:

( Vấn đề ) Liquebase cải:

 SET DEFAULT nextval('myschema.name_id_seq'::regclass)

thành

BIGSERIAL

Vì vậy, nó đã bị từ chối sử dụng

( Vấn đề ) Persyas làm việc tốt cho đến khi tôi đã thêm một số đồ bổ sung và nó bắt đầu ném sau:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Vì vậy, tôi đã tìm thấy PgCodeKeeper nó hoạt động hoàn hảo và nó còn sống (bạn có thể kiểm tra các bản phát hành). Tôi sử dụng lệnh sau:

./pgcodekeeper-cli.sh -E -I ./ignore.txt \
-s "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-t "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-o /result/schema-diff-$(date +'%m%d%y_%H%M%S').sql

So sánh dữ liệu: Tôi đã thử sử dụng Liquebase và nó không hoạt động, bạn có thể xem các bước tôi đã thử trong câu hỏi chưa được trả lời của tôi về sự khác biệt dữ liệu của hai cơ sở dữ liệu với Liquebase

Vì vậy, tôi đã tìm thấy một dự án khác SQL Workbench / J Nó hoạt động rất tốt và tạo ra sự khác biệt lớn trong sql. Tôi sử dụng lệnh sau:

  java -jar /sqlworkbench.jar -command="'WbDataDiff -excludeTables=$EXCLUDE_TABLES \
-referenceConnection=$REFERENCE_CONNECTION \ 
-targetConnection=$TARGET_CONNECTION -referenceSchema=$1 \
-targetSchema=$1  -file=$DIFF_RESULT_FILE -singleFile=true \
-includeDelete=true -ignoreMissingTarget=true ;'"

Cả hai công cụ đều hỗ trợ lọc đối tượng. Nó thực sự là tiện lợi.

Di cư

Và cuối cùng tôi sử dụng Liquebase chỉ để theo dõi di chuyển / phiên bản.


6

Tôi đang làm việc trên một công cụ so sánh toàn diện cho Postgres. Nó sẽ miễn phí trong khi ở phiên bản beta.

PostgresCompare

Ban đầu đây chỉ là so sánh lược đồ (DDL) nhưng chúng tôi có thể sẽ mở rộng sang dữ liệu. Tôi tin rằng đây là một công cụ mà rất nhiều cửa hàng yêu cầu để chuyển từ RDBMS hiện tại của họ mà không cần phải thay đổi cách hoạt động của môi trường phát triển, hoạt động, v.v. của họ.


1
Dữ liệu cũng rất quan trọng. Chỉ lược đồ là không đủ.
Houman

1
Chào bạn @Houman. Xin lỗi vì hồi âm muộn. Bạn đã đúng, dữ liệu sẽ là bước tiếp theo. Điều tuyệt vời về việc xây dựng công cụ so sánh lược đồ trước tiên là tất cả mã để khám phá các bảng, v.v. có thể được chia sẻ giữa chúng.
Neil Anderson

Tôi bắt gặp câu trả lời này trong khi tự mình xây dựng một công cụ so sánh giản đồ đơn giản. Tôi đã xem qua trang web của bạn và công cụ này trông rất hứa hẹn. Không thể chờ đợi để thử phiên bản beta
Avantika Saini

Bản alpha hiện có sẵn tại @AvantikaSaini và nếu bạn dùng thử, vui lòng cho tôi biết nó diễn ra như thế nào để tôi có thể cải thiện nó cho mọi người.
Neil Anderson

Bạn nên tạo một phiên bản giáo dục của giấy phép. Giá quá cao cho mục đích giáo dục.
reinaldoluckman

2

Công cụ tốt nhất mà tôi từng thấy https://pythonhosted.org/Pyrseas/

  1. Nhận kết xuất từ ​​cơ sở dữ liệu A dbtoyaml ...

  2. Tạo di chuyển từ A => B yamltodb ... [tệp được tạo ở bước 1]


Đây dường như là công cụ duy nhất tạo ra các tập lệnh khác nhau so sánh một cơ sở dữ liệu và một tệp kết xuất. Thông thường các công cụ khác sẽ so sánh hai cơ sở dữ liệu. Nhờ tính năng này, các nhà phát triển có thể làm việc với cơ sở dữ liệu dành cho nhà phát triển cục bộ, sau đó cam kết và phân phối các sửa đổi của họ bằng vcs mà không cần tạo tập lệnh di chuyển, chỉ cần thực thi dbtoyaml. Các nhà phát triển nhóm Oher có thể cập nhật cơ sở dữ liệu cục bộ của họ bằng một lệnh duy nhất (yamltodb). Dòng công việc này hoạt động giống như dự án cơ sở dữ liệu studio trực quan.
andreav

0

Tôi cũng đang tìm kiếm một công cụ để so sánh dữ liệu trong cơ sở dữ liệu (đặc biệt là tôi quan tâm đến việc so sánh Redshift DB). Cho đến nay, tốt nhất mà tôi tìm thấy là https://www.dbbest.com/products/database-compare-suite/#close . Thật không may, bản dùng thử miễn phí sẽ hết hạn sau một ngày.


0

Tôi đã tạo một công cụ để so sánh 2 cơ sở dữ liệu PostgreSQL trực tiếp (không phải kết xuất), dữ liệu bảng và chuỗi. Những ngày đầu nhưng đã đạt được những gì mình muốn, có lẽ nó cũng có thể giúp ích cho bạn.

https://github.com/dmarkey/pgdatadiff


0

Theo ý kiến ​​của tôi, Dbforge là công cụ mạnh nhất để kết hợp dữ liệu trong postgresql. Đây là sản phẩm của Devart company. Bạn có thể tải xuống tại đây .

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.