2011-07-09 2 views
2

요청에 따라 로컬 데이터베이스가있는 라이브 mysql 데이터베이스간에 테이블을 동기화 할 수있는 솔루션을 찾고 있습니다. 특정 솔루션이 없다면 로컬 데이터베이스와 라이브 데이터베이스를 동기화하는 좋은 솔루션은 무엇입니까?(부분) mysql을 이용한 데이터베이스 동기화

+0

이 작업을 명확히하기 위해 liveDB의 테이블에서 localDB의 테이블로 새 데이터를 복사 하시겠습니까? localDB의 스키마를 변경 하시겠습니까? –

+0

@ Cshift3iLike 아이디어는 주로 테이블 중 하나를 선택하여 데이터베이스 중 하나에 추가 된 데이터를 동기화하는 것입니다. – Argoron

답변

0

항상 선택한 테이블을 내보내고 다시 가져올 수있는 phpmyadmin이 있습니다.

개발 시스템으로 작업해야하는 라이브 DB가있는 경우 실용적인 솔루션입니다. 당신은 데이터베이스의 복사본을 가져 와서 작업 할 수 있습니다. 고객 테이블을 만든 다음 오프라인으로 라이브를 가져 와서 백업하고 고객 테이블을 제외한 모든 데이터를 삭제하고 업데이트 된 데이터베이스를 가져옵니다.

phpmyadmin의 장점은 쿼리를 보여 주므로 다음 스크립트를 함께 사용하여 다음에 업데이트 할 때 사용할 수 있다는 것입니다.

+0

@ ʍǝɥʇɐɯ Mathew, 내가 찾고 있었던 것은 더 자동화 된 또는 자동화 가능한 (테이블을 선택하여 필요에 따라 동기화하거나 x 일마다 자동으로 동기화하는) 것입니다. 필자는 기술 수준의 초급 단계에 머물러 있지만 phpmyadmin을 알고 있으며 필자가 아직까지 가지고 있지 않은 몇 가지 기능이 없다면 필자가 얻을 수있는 가장 매뉴얼 인 것처럼 보인다. – Argoron

+0

... 그렇지만 안정적으로 사용할 수있는 SQL 문은 없어집니다. 이것들은 텍스트 파일에 넣을 수 있고 mysql -u user -pPASSWORD database

0

다음과 같은 조건이있는 경우

  • 필요한 모든 테이블은 InnoDB에있는
  • 라이브 DB는 공용 IP에 액세스 할 수 있습니다

당신은 개별 테이블

의 mysqldump를 수행 할 수 있습니다 다음은 쉘 스크립트를 사용하여 로컬 시스템에서 실행할 때이를 수행하는 방법입니다.

LIVEDB_IP=192.168.1.10 
MYSQL_SRCUSER=whateverusername 
MYSQL_SRCPASS=whateverpassword 
MYSQL_SRCCONN="-h${LIVEDB_IP} -u${MYSQL_SRCUSER} -p${MYSQL_SRCPASS}" 
SOURCE_DB=mydb_source 

MYSQL_TGTUSER=whateverusername2 
MYSQL_TGTPASS=whateverpassword2 
MYSQL_TGTCONN="-h127.0.0.1 -u${MYSQL_TGTUSER} -p${MYSQL_TGTPASS}" 
TARGET_DB=mydb_target 

TBLLIST="tb1 tb2 tb3" 
for TB in `echo "${TBLLIST}"` 
do 
    mysqldump ${MYSQL_SRCCONN} --single-transaction ${SOURCE_DB} ${TB} | mysql ${MYSQL_TGTCONN} -A -D${TARGET_DB} & 
done 
wait 

--single-transaction 옵션을 사용하면 원본 데이터베이스에서 INSERT, UPDATE 및 DELETE를 계속 허용하면서 테이블의 특정 시점 스냅 샷을 생성합니다.

테이블이 너무 큰 경우 시간 초과 문제가 발생할 수 있습니다. 다음 스크립트를 대신 사용해보십시오.

LIVEDB_IP=192.168.1.10 
MYSQL_SRCUSER=whateverusername 
MYSQL_SRCPASS=whateverpassword 
MYSQL_SRCCONN="-h${LIVEDB_IP} -u${MYSQL_SRCUSER} -p${MYSQL_SRCPASS}" 
SOURCE_DB=mydb_source 

MYSQL_TGTUSER=whateverusername2 
MYSQL_TGTPASS=whateverpassword2 
MYSQL_TGTCONN="-h127.0.0.1 -u${MYSQL_TGTUSER} -p${MYSQL_TGTPASS}" 
TARGET_DB=mydb_target 

TBLLIST="tb1 tb2 tb3" 
for TB in `echo "${TBLLIST}"` 
do 
    mysqldump ${MYSQL_SRCCONN} --single-transaction ${SOURCE_DB} ${TB} | gzip > ${TB}.sql.gz & 
done 
wait 

for TB in `echo "${TBLLIST}"` 
do 
    gzip -d < ${TB}.sql.gz | mysql ${MYSQL_TGTCONN} -A -D${TARGET_DB} & 
done 
wait 

사용해보세요! 필요한 테이블의 MyISAM 인 경우

주의

그냥 mysqldump는에서 --single-transaction를 제거합니다. 이로 인해 쿼리가 필요로하는 테이블로 mysqldump가 완료 될 때까지 원본 데이터베이스의 쿼리가 멈출 수 있습니다. 이 경우 적은 트래픽 시간에만이 스크립트를 수행하십시오.

0

데스크톱 db 관리자 SQLYog에는 이와 같은 설정을위한 "Job Scheduler"도구가 있습니다. 전문 또는 엔터프라이즈 라이센스가 필요합니다 (소리보다 쌉니다). 30 일 평가판은 처음에 체크 아웃하려는 경우 완전한 기능을 제공합니다.

관련 문제