두 개의 MySQL 데이터베이스 비교 [닫기]


368

현재 MySQL 데이터베이스를 사용하여 응용 프로그램을 개발 중입니다.

데이터베이스 구조는 여전히 유동적이며 개발이 진행되는 동안 변경됩니다 (로컬 사본을 변경하여 테스트 서버에만 남겨 둡니다).

데이터베이스의 두 인스턴스를 비교하여 변경 사항이 있는지 확인하는 방법이 있습니까?

현재 이전 테스트 서버 데이터베이스를 버리는 것은 좋지만 테스트가 테스트 데이터에 들어가기 시작하면 약간 까다로울 수 있습니다.
나중에 더 생산에서 나중에 다시 일어날 것입니다 ...

데이터베이스를 수정하기 위해 자동으로 스크립트를 작성하여 프로덕션 데이터베이스를 점진적으로 변경하는 쉬운 방법이 있습니까?


답변에 언급 된 도구 :


4
RedGate의 도구는 SQL Server 전용이라고 생각합니다.
Dave R.

4
Red Gate는 이제 MySQL 버전도 가지고 있으며, 현재 초기 액세스가 확장되어 있으므로 무료입니다 : red-gate.com/products/MySQL_Compare/index.htm
David Atkinson

2
진짜 문제입니다. 개발자에서 프로덕션 시스템으로 배포하면 항상 문제가 발생합니다. 이 유익한 게시물에 감사드립니다
Herr

1
Redgate의 MySQL 도구는 이제 사용자 당 $ 70입니다. 그 가격으로도 여기에 의견을 평가하고 게시 할 것입니다.
Jeremy McGee

또한 지금 당장 필요했고, 필드의 크기를 늘려야했습니다. 그냥 늘리고 싶지 않았고 모든 것이 괜찮다고 생각했습니다. @Jared는 내가 사용한 것을 정확하게 제안했습니다.
Tass

답변:


210

작은 데이터베이스로 작업하는 경우 SQL 스크립트를 생성 하는 --skip-comments--skip-extended-insert옵션을 사용하여 두 데이터베이스 모두에서 mysqldump 를 실행하면 SQL 스크립트에서 diff를 실행하는 것이 좋습니다.

주석을 건너 뛰면 mysqldump 명령을 실행 한 시간과 같은 의미없는 차이를 피할 수 있습니다. 이 --skip-extended-insert명령을 사용하면 각 행이 고유 한 insert 문으로 삽입됩니다. 이렇게하면 하나의 새로운 레코드 또는 수정 된 레코드가 향후 모든 삽입 문에서 연쇄 반응을 일으킬 수있는 상황을 제거합니다. 이러한 옵션으로 실행하면 주석없이 더 큰 덤프가 생성되므로 프로덕션 용도로는 수행하지 않으려는 것이지만 개발을 위해서는 괜찮을 것입니다. 아래에 사용하는 명령의 예를 넣었습니다.

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
커맨드 라인 문해력을위한 이중 플러스 공감대 !!!
dogenpunk 2019 년

5
데이터 를 비교하려면 이것을 대신 사용하십시오. 문자 집합 등에 대한 일부 MySQL4 + 주석입니다.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d, --no-data프로덕션 사용이 필요한 사람들에게는 관심이있을 수 있지만 스키마에만 관심이 있습니다.
Louis

7
사용하기에 더 좋은 도구 는 Windows, Linux 또는 Mac에서 사용할 수있는 MySQL 자체에서 개발 한 mysqldbcompare 유틸리티입니다. 또한 데이터와 스키마 변경 모두에 대해 SQL 문을 출력 할 수 있으며 간단한 명령 줄 diff보다 훨씬 많은 테스트를 수행 할 수 있습니다 결정.
Jasdeep Khalsa

4
색깔을 가진 좋은 diff를 시도하십시오vimdiff
gitaarik

99

Toad for MySQL 에는 데이터 및 스키마 비교 기능이 있으며 동기화 스크립트를 만들 수도 있다고 생각합니다. 무엇보다도, 프리웨어입니다.


2
언급 된 모든 도구가 좋아 보입니다. 더 연구 할 때까지 지금은 Toad를 임의로 선택하고 있습니다.
Vincent Ramdhanie

64
Linux가 아닌 Windows에서 실행된다는 것을 깨달을 때 까지이 도구에 대해 모두 흥분했습니다. 다시 검색으로 돌아 가기
jdias

2
나를 위해 환상적으로 일했습니다. 내가해야 할 모든 작업과 변경된 레코드에 대한 강조 표시된 셀을 통해 변경된 내용을 쉽게 확인할 수있었습니다.
thames

4
--run-all-tests --difftype sql --disable-binary-logging옵션이있는 mysqldbcompare 는 거의 동일한 작업을 수행 할 수 있습니다 (출력이 주석과 혼합되고 문자열의 특수 문자가 이스케이프되지 않는 경우 제외).
schemacs

4
@Anson Smith 리눅스의 대안을 말해 줄 수 있습니까?
Visruth

20

Navicat 이라는 소프트웨어를 사용 하여 다음을 수행합니다.

  • 라이브 데이터베이스를 테스트 데이터베이스와 동기화하십시오.
  • 두 데이터베이스의 차이점을 보여줍니다.

돈이 들고 창과 맥만 있고 엉뚱한 UI가 있지만 마음에 듭니다.


Linux에서 실행됩니다. 현재 다른 데스크톱에서 열었습니다. dev-> test-> live에서 스키마 변경을 푸시하는 구조 동기화 기능은 라이센스 비용만으로도 가치가 있습니다.
폰즈 대령

2
캐치, 그 기능이 있다는 것도 몰랐습니다. 지금까지 맥에서 가장 좋습니다.
Hendra Uzia

기본 SQL 파일이 아닌 서버에있는 데이터베이스 만 비교하는 것 같습니다
AlxVallejo

@seanyboy, 왜 엉뚱한 UI를 좋아합니까?
Pacerier

17

SQLyog (상업용)에는 두 데이터베이스 동기화를위한 SQL을 생성 하는 스키마 동기화 도구가 있습니다.

여기에 이미지 설명을 입력하십시오


1
그러나 이것은 지금까지 나에게 가장 적합한 솔루션이며, 언제 어디서나 업데이트 할 수 있도록 훌륭한 SQL 동기화 쿼리를 제공합니다.
Anupam

비용이 많이 들고, 무겁고, 실제 패치에 적합하지 않음
zanlok

1
매우 느리며 어떤 이유로 든 필요하지 않은 경우에도 많은 외래 키를 삭제하고 다시 만듭니다. 진행 상황을 따를 방법이 없습니다.
Artem Goutsoul

13

기능 비교 목록에서 ... MySQL Workbench 는 커뮤니티 에디션에서 Schema Diff 및 Schema Synchronization을 제공합니다.


7
잘 작동합니다! 그리고 무료입니다. 감사합니다. 그것을 찾을 수없는 사람들을 위해 (나처럼). 현재 위치 : 데이터베이스-> 리버스 엔지니어-> MySQL 모델 또는 EER 다이어그램-> 데이터베이스-> 모든 소스와 동기화
bentzy

잘 작동합니다. 그러나 동일한 이름의 데이터베이스 만 비교할 수 있습니다. 동일한 호스트의 "마스터"버전에서 동기화하려는 다중 (다중 테넌트 클라이언트) 데이터베이스가 있습니다. 따라서 동기화하기 전에 각 클라이언트 데이터베이스와 일치하도록 마스터 이름을 바꿔야합니다. 그렇지 않으면 좋습니다!
scipilot

이에 대한 추가 정보는이 링크
Steven Ryssaert

13

확실히 많은 방법이 있지만 제 경우에는 dump and diff 명령을 선호합니다. 자레드의 의견을 바탕으로 한 스크립트는 다음과 같습니다.

#!/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

피드백은 환영합니다 :)



11

데이터가 아닌 스키마 만 비교하고 Perl에 액세스해야하는 경우 mysqldiff가 작동 할 수 있습니다. 로컬 데이터베이스를 SSH를 통해 원격 데이터베이스와 비교할 수 있기 때문에 사용했기 때문에 데이터 덤프를 신경 쓰지 않아도됩니다.

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

두 데이터베이스를 동기화하기 위해 SQL 쿼리를 생성하려고 시도하지만 신뢰할 수는 없습니다 (또는 실제로는 도구는 아닙니다). 내가 아는 한, 특히 여러 번 변경 한 경우 한 데이터베이스 스키마를 다른 데이터베이스 스키마로 변환하는 데 필요한 변경 사항을 리버스 엔지니어링 할 수있는 100 % 신뢰할 수있는 방법은 없습니다.

예를 들어, 열 유형 만 변경하면 자동화 된 도구가이를 다시 작성하는 방법을 쉽게 추측 할 수 있습니다. 그러나 열을 이동하고 이름을 바꾸고 다른 열을 추가하거나 제거하는 경우 소프트웨어 패키지가 수행 할 수있는 최선의 방법은 아마도 무슨 일이 있었는지 추측하는 것입니다. 데이터가 손실 될 수 있습니다.

개발 서버에 대한 스키마 변경 사항을 추적 한 다음 라이브 서버에서 수동으로 해당 문을 실행하거나 업그레이드 스크립트 또는 마이그레이션으로 롤링하는 것이 좋습니다. 더 지루하지만 데이터를 안전하게 유지합니다. 그리고 최종 사용자가 귀하의 사이트에 액세스 할 수있게되면서 데이터베이스를 지속적으로 많이 변경하게됩니까?


모두를 제공하는 것을 잊지 마세요 --hostN--userN않거나 자동으로 실패합니다.
Znarkus

오라클의 mysqldbcompare 툴이 인덱스에서 버그를 생성하고 동등한 필드를 변경하는 데 문제가있었습니다. mysqldiff 도구는 완벽하게 작동하여 시간을 크게 절약했습니다.
Robert K


6

확인 : http://schemasync.org/ schemasync 도구가 나를 위해 작동합니다 .Linux 명령 줄에서 쉽게 작동하는 명령 줄 도구입니다


1
Mac에 이것을 설치하는 데 문제가 있다면, homebrew를 사용하여 mysql과 python을 설치할 수 있었고 macports는 소용이 없습니다.
Bijou Trouvaille


3

Maatkit 이라는 perl을 사용하여 작성된 유용한 도구가 있습니다. 여러 데이터베이스 비교 및 ​​동기화 도구가 있습니다.


나는이 프로젝트에 대해 몰랐다! 감사합니다. 매우 유용한 도구가 많이있는 것 같습니다.
Vincent Ramdhanie

2
Maatkit에서 스키마 비교 도구를 찾지 못했습니다.
stepancheg

나도-도구 어디에서 이것을 찾을 수 있습니까?
Shabbyrobe

나는 거기에 스키마 비교가 없다고 생각합니다. mk-table-checksum 및 mk-table-sync를 사용한 데이터 비교 및 ​​동기화를 언급했습니다.
Jarod Elliott


3

RedGate에 의한 SQL 비교 http://www.red-gate.com/products/SQL_Compare/index.htm

자동화 된 방식으로 데이터베이스 변경 관리를 도와주는 DBDeploy http://dbdeploy.com/


1
Red Gate 도구는 SQL Server 이외의 다른 기능을 지원하지 않는 것 같습니다.
Rytmis 2009

2
레드 게이트는뿐만 아니라 초기 액세스 무료 동안 MySQL 버전이 있습니다 red-gate.com/products/MySQL_Compare/index.htm을
데이빗 앳킨슨에게

OSX에서는 사용할 수 없음
AlxVallejo



3

몇 시간 동안 웹에서 간단한 도구를 검색 한 후 우분투 소프트웨어 센터를 보지 못했다는 것을 깨달았습니다. 여기에 내가 찾은 무료 솔루션이 있습니다 : http://torasql.com/ 그들은 Windows 용 버전도 있다고 주장하지만 우분투에서만 사용하고 있습니다.

편집 : 2015-Feb-05 Windows 도구가 필요한 경우 TOAD는 완벽하고 무료입니다. http://software.dell.com/products/toad-for-mysql/


2
이 도구의 개발이 중단되었으며 이제 Percona에 포함됩니다 : percona.com/software/percona-toolkit
mrmuggles

2

아파치 제타 컴포넌트 라이브러리는 PHP 5 기반의 애플리케이션 개발을 위해 느슨하게 결합 된 컴포넌트의 범용 라이브러리입니다.

eZ 구성 요소-DatabaseSchema를 사용하면 다음을 수행 할 수 있습니다.

   데이터베이스 스키마 정의 생성 / 저장;
   데이터베이스 스키마 비교
   동기화 쿼리 생성

여기에서 자습서를 확인할 수 있습니다 : http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html


2

사용하기 쉬운 비교 및 ​​동기화 도구 :
데이터베이스 비교기 http://www.clevercomponents.com/products/dbcomparer/index.asp

장점 :

  • 빠른
  • 사용하기 쉬운
  • 적용 할 변경 사항을 쉽게 선택

단점 :

  • 길이를 작은 정수로 동기화하지 않습니다
  • 인덱스 이름을 올바르게 동기화하지 않습니다
  • 주석을 동기화하지 않습니다

사실, 그들은 5 년 안에 약간의 작은 변화로 표면적으로 업데이트했습니다. 그러나 적극적으로 개발되고 있지 않습니다.
Artem Goutsoul

1

이 경우 Navicat for MySQL 이 도움이 될 것이라고 생각 합니다. MySQL은 데이터 및 구조 동기화를 지원합니다. 여기에 이미지 설명을 입력하십시오


0

질문의 첫 부분에서, 나는 단지 둘 다 덤프를하고 diff합니다. mysql에 대해서는 잘 모르지만 postgres pg_dump에는 테이블 내용없이 스키마를 덤프하는 명령이 있으므로 스키마를 변경했는지 확인할 수 있습니다.


MySQL에는 비슷한 명령 mysql_dump가 있습니다. 배포 프로세스에 통합 할 수있는 솔루션 일 수 있습니다. 감사.
Vincent Ramdhanie

또한보다 사용자에게 친숙한 환경을 위해 MySQL 사용자를위한 진정한 살인자 인 phpMyAdmin을 사용하여 동일한 결과를 얻을 수 있습니다!
schonarth

동일한 스키마는 다른 스키마 덤프를 쉽게 생성 할 수 있습니다. 다른 버전의 mysql 클라이언트는 약간 다른 덤프를 생성 할 수 있으며 (두 개의 다른 컴퓨터에서 스키마를 비교하는 경우 문제가 됨) 외래 키 및 제약 조건과 같은 항목이 다른 순서로 덤프 될 수 있습니다.
Mark E. Haase

0

저는 Nob Hill의 마케팅 팀과 함께 일하고 있습니다. 궁금한 점이나 제안 사항이 있으면 언제든지 연락해주십시오.

우리는 처음에는 도구를 처음부터 새로 만들기로 결정했습니다. 시장에 다른 제품이 있지만 그 중 어느 것도 제대로 작동하지 않기 때문입니다. 데이터베이스의 차이점을 쉽게 보여줄 수 있습니다. 실제로 하나의 데이터베이스를 다른 데이터베이스와 동일하게 만드는 것은 다른 방법입니다. 스키마와 데이터의 원활한 마이그레이션은 항상 어려운 과제였습니다. 글쎄, 우리는 여기서 그것을 달성했습니다.
생성 된 마이그레이션 스크립트를 읽을 수 없거나 제대로 작동하지 않고 업무 일 기준 5 일 이내에 해결할 수없는 경우보다 원활한 마이그레이션을 제공 할 수 있다고 확신합니다. 당신은 당신의 자신의 무료 사본을 얻을 것이다!

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


그게 약속인가요? 나는 그것을 시도하고 기능을 마이그레이션 할 때 원래 데이터베이스와 동일한 소유자를 사용하려고 시도하지 적어도 것을 공정한 몇 가지 오류와 함께 넘어졌다
Cruachan

예, 약속입니다. 대부분의 사람들에게 도구는 잘 작동합니다. 발견 된 모든 버그에 대해 평생 라이센스를 약속하며 영업일 기준 5 일 이내에 수정할 수 없습니다. 지원팀에 문의하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.