두 데이터베이스의 구조를 비교하시겠습니까?
두 개의 거대한 데이터베이스의 완전한 데이터베이스 구조를 비교하는 것이 가능한지 묻고 싶었습니다.우리는 두 개의 데이터베이스를 가지고 있는데 하나는 개발 데이터베이스이고 다른 하나는 생산 데이터베이스입니다.코드 일부를 공개하기 전에 프로덕션 데이터베이스를 변경하는 것을 가끔 잊어버렸는데, 이로 인해 프로덕션 데이터베이스의 구조가 동일하지 않기 때문에 릴리스할 경우 오류가 발생했습니다.이 둘을 비교하거나 동기화할 수 있는 방법이 있습니까?
MySQL 데이터베이스의 경우 다음 쿼리를 사용하여 보기 및 테이블(열 이름 및 열 유형)을 비교할 수 있습니다.
SET @firstDatabaseName = '[first database name]';
SET @secondDatabaseName = '[second database name]';
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
LEFT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t2.tableRowType IS NULL
UNION
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
RIGHT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t1.tableRowType IS NULL;
UI와 함께 도구를 사용하는 것을 선호하는 경우 테이블, 보기, 키 등을 비교할 수 있는 이 스크립트 https://github.com/dlevsha/compalex 를 사용할 수도 있습니다.
Compalex는 두 데이터베이스 스키마를 비교하기 위한 경량 스크립트입니다.MySQL, MS SQL Server 및 Postgre를 지원합니다.SQL 입니다.
스크린샷(비교표)
명령줄을 사용할 수 있습니다.
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql
diff file1.sql file2.sql
파일을 --no-data와 함께 덤프하고 파일을 비교할 수 있습니다.
운영 데이터베이스에서 --lock- tables=0 옵션을 사용하여 전체적으로 큰 문제가 발생하지 않도록 하십시오.
동일한 mysqldump 버전을 사용하는 경우(개발 및 운영 시스템에 동일한 소프트웨어가 있어야 한다는 것이 맞습니까?), 동일한 파일을 더 많이 또는 더 적게 배포할 것으로 예상됩니다.표들은 알파 순서로 정렬될 것이므로 간단한 차이는 쉽게 차이를 보일 것입니다.
현재 이런 질문에 답하기 위해 다음을 사용하는 스크립트를 만들었습니다.information_schema
열, 데이터 유형 및 표를 비교할 내용
SET @database_current = '<production>';
SET @database_dev = '<development>';
-- column and datatype comparison
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH,
b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH
FROM information_schema.COLUMNS a
LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME
AND b.TABLE_NAME = a.TABLE_NAME
AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
AND (
b.COLUMN_NAME IS NULL
OR b.COLUMN_NAME != a.COLUMN_NAME
OR b.DATA_TYPE != a.DATA_TYPE
OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH
);
-- table comparison
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME
FROM information_schema.TABLES a
LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME
AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
AND (
b.TABLE_NAME IS NULL
OR b.TABLE_NAME != a.TABLE_NAME
);
이 스크립트가 응용 프로그램이 아닌 스크립트 사용 방법을 찾는 사람들에게도 도움이 되기를 바랍니다.건배.
sqldiff를 시도했지만 성공하지 못했기 때문에 mysqlworkbench의 compare 기능에 주목하여 미래의 독자들을 풍부하게 만들고 싶습니다.http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030
모델 탭을 열고 데이터베이스 메뉴를 선택하면 두 개의 다른 서버에 있는 두 개의 다른 스키마를 비교하거나, 같은 서버에 있는 두 개의 스키마를 비교하거나, 스키마와 모델 또는 아직 시도하지 않은 많은 다른 옵션을 비교할 때 사용할 수 있는 스키마 비교 옵션이 나타납니다.
리눅스의 mysql의 경우, phphmyadmin을 통해 'data' 없이 구조로만 데이터베이스를 내보낼 수 있습니다.
전체 데이터베이스의 내보내기 옵션을 스크롤하면서 'data'를 선택 취소하고 출력을 텍스트로 설정하면 됩니다.비교할 데이터베이스를 모두 내보냅니다.
그런 다음 선호하는 프로그램/사이트의 파일 비교에서 데이터베이스의 두 텍스트 파일 출력을 비교합니다.이 솔루션에서 동기화는 여전히 수동이지만 구조적 차이를 비교하고 찾는 데 효과적입니다.
데이터베이스에 따라 사용 가능한 도구가 달라집니다.
엠바카데로의 ER/Studio를 이용합니다.비교 및 병합 기능이 있습니다.
MySQL용 Toad와 같은 비교 대상도 많습니다.또한 Red-Gate 제안에 동의하지만 MySQL에 사용한 적은 없습니다.
Gemini Delta - SQL Difference Manager for를 확인합니다.NET. 무료 베타 버전을 다운로드할 수 있지만 정식 버전은 공개가 며칠 남지 않았습니다.
행 수준의 데이터 차이를 비교하는 것이 아니라 테이블, 함수, 스프록 등을 비교합니다.그리고 번개처럼 빠릅니다. (새로운 버전인 1.4는 1k의 Sprocs를 4초 이내에 로드하고 비교하는데, 이는 제가 테스트했던 다른 도구들과 비교했을 때 10초 이상 걸렸던 것과 비교됩니다.
하지만 모두가 옳습니다. 레드게이트는 훌륭한 도구입니다.
언급URL : https://stackoverflow.com/questions/2389468/compare-structures-of-two-databases
'programing' 카테고리의 다른 글
PowerShell의 가변 범위 지정 (0) | 2023.09.25 |
---|---|
modf()를 사용하지 않고 플로트의 분수 부분 가져오기 (0) | 2023.09.25 |
Python 프로젝트에서 Google API를 사용하도록 GOOGLE_APPLICATION_CREEDENCALES 설정 (0) | 2023.09.20 |
"내부/modules/cj/loader.js:582 throw err" (0) | 2023.09.20 |
브라우저의 스크롤 바 크기를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.20 |