2010-06-23 4 views
0

두 개의 서버가 있습니다. 그 중 하나가 고객입니다. 고객은 자신의 CMS에서 고객 정보의 XML/JSON 내보내기 URL을 제공하고 있으며 우리가 개발중인 webapp에 데이터를 가져 오기위한 일부 가져 오기 스크립트를 작성합니다.원격 영구 동기화

INSERT INTO customers (name,address) VALUES ('John Doe', 'NY') ON DUPLICATE KEY UPDATE name='John Doe', address='NY' 

이 솔루션은 지금까지 내가 아는 한, permormace의 방법으로 최고입니다 ...

그러나이 솔루션은 해결되지 않습니다 :

난 항상 이런 식으로 그 일을 했어요 레코드를 삭제하는 문제. 일부 클라이언트가 데이터베이스에서 삭제되어 현재 내보내기 작업을하지 않은 경우에는 어떻게해야합니까? 어떻게해야합니까?

샤 우드 나는 전체 테이블을 우선 TRUNCATE 한 다음 다시 채 웁니다. 아니면 모든 레코드가있는 PHP 배열을 채운 다음 다시 XML/JSON이 아닌 레코드를 삭제해야합니까?

더 나은 해결책이 있어야한다고 생각합니다. 우리는 시간이 많이 걸릴 수 있습니다 기록과 전체 가져 오기 프로세스의 수천을 가져올 수있는 원인

나는 '의 performace의 방법으로 최적의 솔루션에 관심이 있어요.

그것은 고객의 CMS의 수출은 항상 자신의 현재 고객 데이터가 모두 포함 사실인가요 :

답변

1

내가의 performace의 방법으로 최적의 솔루션에 관심

하면 클라이언트를 사용 MySQL의 복제에서의 mysql을 - 마스터와 같은 클라이언트 당신의 노예로 끝내라. 직접 피드 (VPN을 통해이를 실행하고 싶을 수도 있음) 또는 연결이 끊긴 모드 (롤 포워드를 위해 bin 로그를 사용자에게 전송)를 사용할 수 있습니다.당신이 솔루션에 맞게 만들려고 노력하는 것처럼 및 소리 -

우리의 고객은 자신의 CMS이 정말 바보 같은 생각이다

에서 우리에게 자신의 클라이언트 정보의 XML/JSON 수출의 URL을 제공하고있다 문제 (그것은 그렇지 않다). HTTP는 인터넷을 통해 대용량 데이터 파일을 전송하는 매체가 아닙니다. 또한 원격 서버는 데이터를 사용할 수 있도록하기 위해 오히려 많은 작업을해야한다는 것을 의미합니다 (복제 된 데이터를 식별 할 수 있다고 가정하고 삭제 된 레코드에 대해서는 현재 작동하지 않습니다). 후자의 점은 네트워크 프로토콜에 관계없이 적용됩니다.

로컬 미러가 거의 항상 일관성이 없기 때문에 스택의 하위 수준에서 데이터베이스 (예 : rsync를 사용하여 데이터 파일을 복제하려고 시도하는 경우)에 직접 큰 데이터를 복사 할 수는 없습니다. 고객이 CSV 파일로 데이터를 내보낼 수 있습니다 경우 C.

0

당신은 MySQL은, 내가 아는 유일한 SQL을 사용하는 가정? 그렇다면 '고객'테이블을 삭제하거나 자르는 것이 가장 좋습니다. 즉, 어제의 고객 테이블을 버리고 처음부터 오늘 다시 구성하십시오.

'삽입'을 사용할 수 없습니다. 수천 개의 고객 행을 삽입하는 데 ~ 28 시간이 걸립니다. 그래서 '삽입'을 잊어 버려라.

대신 'load data local infile'을 사용하여 'customers'에 행을 추가하십시오. 먼저 쉼표로 분리 된 열 데이터를 사용하여 모든 고객 데이터의 임시 디스크 파일 'cust_data.txt'를 작성한 다음

load data local infile 'cust_data.txt' replace into table customers fields terminated by ',' lines terminated by '\n';

이 먼저 'cust_data.txt'로 그것을 준비하지 않고, 직접 고객의 출력 파일을 사용할 수 있도록 쿼리를 구성 할 수 : 뭔가 같은 말? 그것은 처녀의기도에 대한 해답이 될 것입니다.

충분히 빠르지 만 놀랍습니다.

심판 : http://dev.mysql.com/doc/refman/5.0/en/load-data.html

+0

하지만 TRUNCATE 직후 webapp에 몇 분 동안 완료되지 않은 데이터가있을 수 있습니다 ... ( 그리고 SQL 쿼리를 가져 오는 일반적인 SQL 쿼리를 대체하면 시간을 많이 절약 할 수 있습니다 ... 아니면 프로세스 자체는 가능하지만 많은 URL을 호출하여 XML/JSON을 가져와야하는데 실제로 많은 시간이 필요합니다. 내 우선 순위는 데이터의 무결성과 완전성입니다. –

+0

매번 테이블을 자르면 데이터 손실의 위험이 있습니다. 백업을 목적으로하고 싶다면 무엇을하고 싶지는 않습니다. – symcbean

+0

위험 요소가있는 데이터가 손실 될 때마다 테이블을 자르는 방법은 무엇입니까? 고객 정보의 "현재"상태가 항상 어딘가에 있다고 생각합니다. , Radek의 고객에게 그대로 유지되며, 따라서 언제든지 '고객'테이블을 재구성 할 수 있습니다. 무엇이 누락 되었습니까? 감사! –

관련 문제