2012-07-02 3 views
0

상황에 따라 웹 응용 프로그램에 기계에 로그인하려는 데이터가 삽입되는 둘 이상의 "삽입"머신이 있습니다. 로드 밸런서 뒤에서 모두). 몇 시간마다 하나씩 컴퓨터가로드 밸런서와의 연결이 끊어지고 "마스터"데이터베이스 시스템에 정보를 업로드하면 수집하는 모든 데이터의 상대적으로 최신 버전이 있어야합니다.MySQL 서버간에 데이터를 이동할 때 자동 증분 ID 충돌 방지

원래는 mysqldump를 사용하려고했지만, 기본 키의 충돌로 이어질 auto_increment id 열을 가져 오지 않도록 명령을 지정할 수 없다는 것을 알았습니다. 임시 테이블을 사용하여 데이터를 넣은 다음 열을 삭제하도록 권장하는 다른 게시물을 보았습니다. 그러나 "삽입"머신의 사양은 매우 낮았으며 데이터 양은 5 만 행 정도로 매우 중요했습니다. 프로그래밍 방식으로 x 행을 한 번에 가져 와서 원격 "마스터"데이터베이스에 삽입하는 것 외에는 더 쉬운 방법이 있습니까? 현재 나는 PHP를 "삽입"머신에 설치했습니다.

입력 해 주셔서 감사합니다.

+2

슬레이브 데이터베이스와 같은 각 레코드에 대해 마스터 데이터베이스 레코드가 동일한 기본 키를 가지기를 원하지 않습니까? 그렇지 않으면 쿼리가 어떤 머신을 기반으로 다른 결과를 생성하는지 문제가 발생할 수 있습니다. 보다 나은 솔루션은 고유성을 보장 할 수있는 기본 키를 사용하는 것이므로 충돌이 발생하지 않습니다. 예를 들어, unix 시간 (마이크로 초)을 각 서버마다 다른 식별자로 연결할 수 있습니다. – octern

+0

열쇠는 의미가 없으며 기본적으로 카운터입니다. 고유 한 것 외에는 사용에 대한 정보가 없으며 일반적으로 레코드가 "마스터"데이터베이스에 삽입 된시기와 관련됩니다. – thatidiotguy

+0

아, 그리고 내가 슬레이브 머신에서 내보내는 테이블에서 읽은 적이 없습니다. 요점은 삽입물 만 다루면된다는 것입니다. – thatidiotguy

답변

1

마스터 데이터베이스 레코드가 슬레이브 데이터베이스와 같은 각 레코드에 대해 동일한 기본 키를 가지기를 원하지 않습니까? 그렇지 않으면 쿼리가 어떤 머신을 기반으로 다른 결과를 생성하는지 문제가 발생할 수 있습니다.

충돌을 피할 수있는 임의의 기본 키를 원한다면 자동 증가 ID를 제거하고 각 서버의 모든 레코드에 대해 고유 한 ID를 구성하는 것이 좋습니다. 예를 들어, unix 시간 (마이크로 초)을 각 서버마다 다른 식별자로 연결할 수 있습니다. 약간 lazier 솔루션은 시간 + 임의의 10 자리 숫자 또는 무언가를 연결하는 것입니다. PHP의 uniqid() 함수는 이와 같이 자동으로 수행합니다.

ID를 사용하지 않으려면 테이블에서 ID를 제거하십시오. 모든 테이블에 기본 키가 있어야한다는 규칙은 없습니다. 그것을 사용하지 않지만 각 레코드가 삽입 된시기에 대한 정보를 인코딩하려면 타임 스탬프 열을 대신 추가하십시오 (키로 사용하지 마십시오).

+0

흠, 이것이 사실이라고 생각해. 나는 항상 테이블에 기본 키가 있어야한다고 생각했습니다. 모든 테이블이 기본 키를 필요로하지 않는다는 의견이 있습니까? 아니면 사람들이 동의 할 필요가없는 것이 모든 경우입니까? – thatidiotguy

+0

모든 데이터베이스에 기본 키가 필요한 이유가 표시되지 않지만 특정 참조가 없습니다. 각 레코드를 항상 고유하게 지정할 수 있는지 확인하려면 다른 기본 키 (여러 필드의 조합 일 수 있음)를 할당하는 것이 좋습니다. – octern

+0

답변 해 주셔서 감사합니다. 기본 키 필드에서 벗어났습니다. – thatidiotguy