So sánh hai cơ sở dữ liệu MySQL [đã đóng]


368

Tôi hiện đang phát triển một ứng dụng bằng cơ sở dữ liệu MySQL.

Cấu trúc cơ sở dữ liệu vẫn còn thay đổi và thay đổi trong quá trình phát triển (tôi thay đổi bản sao cục bộ của mình, để lại bản sao trên máy chủ thử nghiệm).

Có cách nào để so sánh hai phiên bản của cơ sở dữ liệu để xem liệu có bất kỳ thay đổi nào không?

Mặc dù hiện tại chỉ cần loại bỏ cơ sở dữ liệu máy chủ thử nghiệm trước đó là tốt, vì thử nghiệm bắt đầu nhập dữ liệu thử nghiệm, nó có thể có một chút khó khăn.
Mặc dù vậy, điều tương tự sẽ xảy ra sau đó trong sản xuất ...

Có một cách dễ dàng để tăng dần các thay đổi cho cơ sở dữ liệu sản xuất, tốt nhất là bằng cách tự động tạo một tập lệnh để sửa đổi nó?


Các công cụ được đề cập trong các câu trả lời:


4
Tôi tin rằng các công cụ của RedGate chỉ dành cho SQL Server.
Dave R.

4
Red Gate hiện cũng có phiên bản MySQL, hiện tại miễn phí vì nó được truy cập sớm: red-gate.com/products/MyQuery_Compare/index.htmlm
David Atkinson

2
Đó là một vấn đề thực sự. Tôi triển khai từ dev đến máy sản xuất và nó LUÔN phá vỡ một cái gì đó. Cảm ơn bạn cho bài viết thông tin này
Herr

1
Công cụ MySQL từ Redgate hiện có giá $ 70 / người dùng. Ngay cả ở mức giá đó tôi sẽ đánh giá và gửi bình luận ở đây.
Jeremy McGee

Cũng cần điều này ngay bây giờ, đã phải tăng kích thước của một lĩnh vực. Không muốn chỉ tăng nó và nghi ngờ mọi thứ đều ổn. @Jared đề xuất chính xác những gì tôi sử dụng.
Tass

Câu trả lời:


210

Nếu bạn đang làm việc với các cơ sở dữ liệu nhỏ, tôi thấy việc chạy mysqldump trên cả hai cơ sở dữ liệu với các tùy chọn --skip-comments--skip-extended-insertđể tạo tập lệnh SQL, thì việc chạy diff trên tập lệnh SQL hoạt động khá tốt.

Bằng cách bỏ qua các bình luận, bạn sẽ tránh được những khác biệt vô nghĩa như thời gian bạn chạy lệnh mysqldump. Bằng cách sử dụng --skip-extended-insertlệnh, bạn đảm bảo mỗi hàng được chèn bằng câu lệnh chèn riêng. Điều này giúp loại bỏ tình huống trong đó một bản ghi mới hoặc sửa đổi có thể gây ra phản ứng dây chuyền trong tất cả các câu lệnh chèn trong tương lai. Chạy với các tùy chọn này tạo ra các bãi lớn hơn mà không có ý kiến ​​vì vậy đây có thể không phải là điều bạn muốn làm trong sử dụng sản xuất nhưng để phát triển thì nó sẽ ổn. Tôi đã đưa ra các ví dụ về các lệnh tôi sử dụng dưới đây:

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql

12
Tăng gấp đôi cộng với cho biết chữ dòng lệnh !!!
dogenpunk

5
Để so sánh dữ liệu , sử dụng điều này thay thế; vẫn là một số nhận xét của MySQL4 + về các bộ ký tự, v.v.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d, --no-datacó thể được quan tâm đối với những người cần sử dụng sản xuất nhưng chỉ quan tâm đến lược đồ
Louis

7
Một công cụ tốt hơn để sử dụng sẽ là tiện ích mysqldbcompare do chính MySQL phát triển mà bạn có thể sử dụng trên Windows, Linux hoặc Mac - nó cũng có thể xuất các câu lệnh SQL cho cả dữ liệu VÀ thay đổi lược đồ và thực hiện nhiều thử nghiệm hơn so với một dòng lệnh đơn giản khác mục đích.
Jasdeep Khalsa

4
Để có sự khác biệt tốt đẹp với màu sắc, hãy thửvimdiff
gitaarik 20/05/2015

99

Con cóc cho MySQL có các tính năng so sánh dữ liệu và lược đồ và tôi tin rằng nó thậm chí sẽ tạo ra một kịch bản đồng bộ hóa. Trên hết, đó là phần mềm miễn phí.


2
Tất cả các công cụ được đề cập nhìn tốt. Bây giờ tôi đang chọn Toad tùy ý cho đến khi tôi có thể tiến hành một số nghiên cứu thêm.
Vincent Ramdhanie

64
Tôi đã rất phấn khích về công cụ này cho đến khi tôi nhận ra rằng nó chạy trong windows chứ không phải linux. Quay lại tìm kiếm ...
jdias

2
Làm việc tuyệt vời cho tôi. Đã làm mọi thứ tôi cần nó để làm và các ô được tô sáng cho các bản ghi đã thay đổi giúp dễ dàng xem những gì đã thay đổi.
thames

4
mysqldbcompare với --run-all-tests --difftype sql --disable-binary-loggingcác tùy chọn có thể thực hiện gần như cùng một công việc (ngoại trừ đầu ra được trộn lẫn với nhận xét và các ký tự đặc biệt trong chuỗi không được thoát).
schemacs

4
@Anson Smith Bạn có thể cho tôi biết sự thay thế cho linux không?
Visruth

20

Tôi sử dụng một phần mềm có tên Navicat để:

  • Đồng bộ hóa cơ sở dữ liệu với cơ sở dữ liệu thử nghiệm của tôi.
  • Hiển thị sự khác biệt giữa hai cơ sở dữ liệu.

Nó tốn tiền, chỉ có windows và mac, và nó có một giao diện người dùng kỳ quặc, nhưng tôi thích nó.


Nó chạy trên Linux. Tôi có nó mở trên một máy tính để bàn khác tại thời điểm này. Tính năng đồng bộ hóa cấu trúc để đẩy các thay đổi lược đồ từ dev-> test-> live chỉ có giá trị giấy phép.
Đại tá Sponsz

2
Bắt tốt, tôi thậm chí không biết nó có những tính năng đó. Đó là điều tốt nhất trên mac cho đến nay.
Hendra Uzia

Dường như chỉ so sánh các cơ sở dữ liệu sống trên các máy chủ, không phải các tệp sql riêng
AlxVallejo

@seanyboy, tại sao bạn lại thích giao diện người dùng?
Pacerier

17

Có một Công cụ đồng bộ hóa lược đồ trong SQLyog (thương mại) tạo SQL để đồng bộ hóa hai cơ sở dữ liệu.

nhập mô tả hình ảnh ở đây


1
vâng, đây là giải pháp tốt nhất cho đến nay đối với tôi, cung cấp các truy vấn đồng bộ SQL tốt để bạn có thể cập nhật mọi lúc, mọi nơi ..
Anupam

quá tốn kém và nặng nề, không tốt cho các bản vá sau thực tế
zanlok

1
Rất chậm, và vì một số lý do, nó làm rơi và tạo lại rất nhiều khóa ngoại ngay cả khi không cần thiết. Không có cách nào để theo dõi tiến độ.
Artem Goutsoul

13

Từ danh sách so sánh tính năng ... MySQL Workbench cung cấp Schema Diff và Schema Syncization trong phiên bản cộng đồng của họ.


7
Hoạt động tuyệt vời! Và nó miễn phí, cảm ơn. Đối với những người không thể tìm thấy nó (Giống như tôi). Đây là: Cơ sở dữ liệu -> Kỹ sư đảo ngược -> Trong Mô hình MySQL hoặc Sơ đồ EER -> Cơ sở dữ liệu -> Đồng bộ hóa với bất kỳ nguồn nào
uốn cong

Nó hoạt động tốt. Tuy nhiên, bạn chỉ có thể so sánh các cơ sở dữ liệu cùng tên. Tôi có nhiều cơ sở dữ liệu (nhiều khách hàng thuê) mà tôi muốn đồng bộ hóa từ phiên bản "chính" trên cùng một máy chủ. Vì vậy, tôi phải đổi tên chủ để khớp với từng db máy khách trước khi đồng bộ hóa. Nếu không thì tốt đẹp!
scipilot

Thông tin bổ sung về điều này có thể được tìm thấy trên liên kết
Steven Ryssaert

13

Có nhiều cách chắc chắn, nhưng trong trường hợp của tôi, tôi thích lệnh dump và diff. Vì vậy, đây là một kịch bản dựa trên nhận xét của Jared:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Phản hồi được chào đón :)


12

dbSolo, nó được trả tiền nhưng tính năng này có thể là ứng dụng bạn đang tìm kiếm http://www.dbsolo.com/help/compare.html

Nó hoạt động với Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 và MySQL văn bản thay thế


đây là chính xác những gì tôi đang tìm kiếm! Tuyệt vời!
Josh Nankin

11

Nếu bạn chỉ cần so sánh các lược đồ (không phải dữ liệu) và có quyền truy cập vào Perl, mysqldiff có thể hoạt động. Tôi đã sử dụng nó vì nó cho phép bạn so sánh cơ sở dữ liệu cục bộ với cơ sở dữ liệu từ xa (thông qua SSH), vì vậy bạn không cần bận tâm đến việc bỏ bất kỳ dữ liệu nào.

http://adamspiers.org/computing/mysqldiff/

Nó sẽ cố gắng tạo các truy vấn SQL để đồng bộ hóa hai cơ sở dữ liệu, nhưng thực tế tôi không tin tưởng nó (hoặc bất kỳ công cụ nào). Theo tôi biết, không có cách nào đáng tin cậy 100% để thiết kế ngược các thay đổi cần thiết để chuyển đổi một lược đồ cơ sở dữ liệu sang một lược đồ cơ sở dữ liệu khác, đặc biệt là khi nhiều thay đổi đã được thực hiện.

Ví dụ: nếu bạn chỉ thay đổi loại cột, một công cụ tự động có thể dễ dàng đoán cách tạo lại cột đó. Nhưng nếu bạn cũng di chuyển cột, đổi tên nó và thêm hoặc xóa các cột khác, điều tốt nhất mà bất kỳ gói phần mềm nào có thể làm là đoán xem điều gì có thể xảy ra. Và bạn có thể sẽ mất dữ liệu.

Tôi khuyên bạn nên theo dõi bất kỳ thay đổi lược đồ nào bạn thực hiện cho máy chủ phát triển, sau đó chạy các câu lệnh đó bằng tay trên máy chủ trực tiếp (hoặc chuyển chúng thành tập lệnh nâng cấp hoặc di chuyển). Nó tẻ nhạt hơn, nhưng nó sẽ giữ dữ liệu của bạn an toàn. Và khi bạn bắt đầu cho phép người dùng cuối truy cập vào trang web của mình, bạn có thực sự sẽ thay đổi cơ sở dữ liệu nặng liên tục không?


Đừng quên cung cấp cả hai --hostN--userNnó sẽ thất bại trong âm thầm.
Znarkus

Tôi gặp rắc rối với các công cụ mysqldbcompare của Oracle tạo ra lỗi trên các chỉ mục và thay đổi các trường tương đương. Công cụ mysqldiff hoạt động hoàn hảo và tiết kiệm được một chút thời gian.
Robert K


6

kiểm tra: http://schemasync.org/ công cụ schemasync hoạt động với tôi, nó là một công cụ dòng lệnh hoạt động dễ dàng trong dòng lệnh linux


1
Nếu bạn gặp khó khăn khi cài đặt cái này trên máy mac, tôi chỉ có thể cài đặt mysql và python bằng homebrew, với macports không có tác dụng.
Trouvaille


3

Có một công cụ hữu ích được viết bằng cách sử dụng perl được gọi là Maatkit . Nó có một số công cụ so sánh và đồng bộ hóa cơ sở dữ liệu trong số những thứ khác.


Tôi không biết về dự án này! Cảm ơn, có vẻ như nó có khá nhiều công cụ sẽ cực kỳ hữu ích.
Vincent Ramdhanie

2
Tôi chưa tìm thấy các công cụ so sánh lược đồ trong Maatkit.
stepancheg

Tôi cũng vậy - chúng ta có thể tìm thấy thứ này ở đâu?
Shabbycoat

Tôi không nghĩ có sự so sánh lược đồ trong đó. Tôi đã đề cập đến so sánh dữ liệu và đồng bộ hóa bằng cách sử dụng mk-table-checksum và mk-table-sync
Jarod Elliott


3

So sánh SQL bởi RedGate http://www.red-gate.com/products/SQL_Compare/index.htm

DBDeploy để giúp quản lý thay đổi cơ sở dữ liệu theo cách tự động http://dbdeploy.com/


1
Các công cụ Red Gate dường như không hỗ trợ bất cứ thứ gì ngoài SQL Server.
Rytmis

2
Red Gate cũng có phiên bản MySQL, miễn phí khi truy cập sớm: red-gate.com/products/MySQL_Compare/index.htmlm
David Atkinson

Không khả dụng cho OSX
AlxVallejo

3

Đối với bản thân tôi, tôi bắt đầu với việc bỏ cả cơ sở dữ liệu và phân tán các bãi chứa, nhưng nếu bạn muốn tự động tạo các tập lệnh hợp nhất, bạn sẽ muốn có một công cụ thực sự.

Một tìm kiếm đơn giản của Google đã bật lên các công cụ sau:


3

Hãy xem so sánh dữ liệu dbForge cho MySQL . Đây là một phần mềm chia sẻ với thời gian dùng thử miễn phí 30 ngày. Đây là một công cụ GUI MySQL nhanh để so sánh và đồng bộ hóa dữ liệu, quản lý sự khác biệt dữ liệu và đồng bộ hóa tùy chỉnh.

So sánh dữ liệu dbForge cho MySQL


3

Sau nhiều giờ tìm kiếm trên web cho công cụ đơn giản, tôi nhận ra tôi đã không tìm kiếm trong Trung tâm phần mềm Ubuntu. Đây là một giải pháp miễn phí tôi tìm thấy: http://torasql.com/ Họ tuyên bố cũng có phiên bản cho Windows, nhưng tôi chỉ sử dụng nó trong Ubuntu.

Chỉnh sửa: 2015-Feb-05 Nếu bạn cần công cụ Windows, TOAD hoàn hảo và miễn phí: http://software.dell.com/products/toad-for-mysql/


2
Việc phát triển công cụ này đã dừng lại và hiện được bao gồm trong Percona: percona.com/software/percona-toolkit
mrmuggles

2

Thư viện các thành phần apache zeta là một thư viện mục đích chung gồm các thành phần được ghép lỏng lẻo để phát triển các ứng dụng dựa trên PHP 5.

Thành phần eZ - DatabaseSchema cho phép bạn:

   .Create / Lưu định nghĩa lược đồ cơ sở dữ liệu;
   .Compare lược đồ cơ sở dữ liệu;
   .Tổng hợp các truy vấn đồng bộ hóa;

Bạn có thể kiểm tra hướng dẫn tại đây: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html


2

Công cụ so sánh và đồng bộ hóa rất dễ sử dụng: Bộ so sánh
cơ sở dữ liệu http://www.clevercomponents.com/products/dbcomparer/index.asp

Ưu điểm:

  • Nhanh
  • dễ sử dụng
  • dễ dàng chọn thay đổi để áp dụng

Nhược điểm:

  • không đồng bộ chiều dài với ints nhỏ
  • không đồng bộ tên chỉ mục đúng
  • không đồng bộ hóa ý kiến

Đúng vậy, họ đã thực hiện một bản cập nhật hời hợt với một vài thay đổi nhỏ trong 5 năm. Nhưng nó không được tích cực phát triển.
Artem Goutsoul

1

Tôi nghĩ Navicat cho MySQL sẽ hữu ích cho trường hợp này. Nó hỗ trợ đồng bộ hóa dữ liệu và cấu trúc cho MySQL. nhập mô tả hình ảnh ở đây


0

Đối với phần đầu tiên của câu hỏi, tôi chỉ cần thực hiện một kết xuất của cả hai và tìm chúng. Không chắc chắn về mysql, nhưng postgres pg_dump có một lệnh chỉ kết xuất lược đồ mà không có nội dung bảng, vì vậy bạn có thể xem bạn đã thay đổi lược đồ nào chưa.


MySQL có một lệnh tương tự mysql_dump. Đây có thể là một giải pháp nếu tôi có thể tích hợp nó trong một quy trình triển khai. Cảm ơn.
Vincent Ramdhanie

Ngoài ra, để có trải nghiệm thân thiện hơn với người dùng, bạn có thể nhận được điều tương tự bằng cách sử dụng phpMyAdmin - một kẻ giết người thực sự cho người dùng MySQL!
schonarth

Các lược đồ giống hệt nhau có thể dễ dàng dẫn đến các kết xuất lược đồ khác nhau. Các phiên bản khác nhau của máy khách mysql có thể tạo ra các bãi chứa hơi khác nhau (một vấn đề nếu bạn so sánh các lược đồ từ hai máy khác nhau) và những thứ như khóa ngoại và ràng buộc có thể được đổ theo thứ tự khác.
Đánh dấu E. Haase

0

Tôi đang làm việc với nhóm Marketing của Nob Hill, tôi muốn nói với bạn rằng tôi sẽ rất vui khi nghe câu hỏi, đề nghị của bạn hoặc bất cứ điều gì khác, xin vui lòng liên hệ với tôi.

Ban đầu chúng tôi quyết định tạo ra công cụ của mình từ đầu bởi vì trong khi có những sản phẩm khác như vậy trên thị trường, không ai trong số họ làm đúng. Nó khá dễ dàng để cho bạn thấy sự khác biệt giữa các cơ sở dữ liệu. Nó thực sự là một cơ sở dữ liệu khác. Di chuyển trơn tru, cả lược đồ và dữ liệu, luôn luôn là một thách thức. Vâng, chúng tôi đã đạt được nó ở đây.
Chúng tôi rất tự tin rằng nó có thể cung cấp cho bạn một sự di chuyển suôn sẻ, hơn là nếu nó không - nếu các tập lệnh di chuyển mà nó tạo ra không đủ để đọc hoặc sẽ không hoạt động cho bạn và chúng tôi không thể sửa nó trong năm ngày làm việc - bạn sẽ nhận được bản sao miễn phí của riêng bạn!

http://www.nobhillsoft.com/NHDBCompare.aspx


đó là một lời hứa? Tôi đã thử nó và nó đã bị lỗi với một vài lỗi, nhất là khi di chuyển một chức năng, nó cố gắng sử dụng cùng một chủ sở hữu như cơ sở dữ liệu ban đầu
Cruachan

Vâng, đó là một lời hứa. Đối với hầu hết mọi người, công cụ này đang hoạt động tốt. Chúng tôi hứa sẽ cấp giấy phép trọn đời cho bất kỳ lỗi nào bạn tìm thấy và chúng tôi không thể sửa trong vòng 5 ngày làm việc. Vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.
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.