INSERT ... ON DUPLICATE가있는 mysqldump


21

한 데이터베이스에서 다른 데이터베이스로 데이터를 병합하고 싶습니다. 따라서 with with dump를 작성한 mysqldump다음 동일한 테이블 구조를 가진 다른 데이터베이스로 가져옵니다. 이 경우 문제가 없습니다 (예 : 중복 항목 또는 다른 것).

그러나 테스트 목적으로 일부 병합을 수행하고 나중에 최종 병합을 수행합니다. 그래서 몇 번 병합 (데이터가 변경 될 수 있음)을 실행하고 싶습니다. 테이블의 행은 삭제되지 않으며 삽입 또는 업데이트 만 가능합니다.

ON DUPLICATE 옵션으로 mysqldump를 만들 수 있습니까? 아니면 새 데이터를 삽입하고 수정 된 데이터를 업데이트하는 덤프를 병합 할 수 있습니까?

물론 ON DUPLICATE덤프에 수동으로 삽입 할 수는 있지만 병합 프로세스를 자동화하고 싶습니다.

답변:


34

이에 도움이되는 옵션이 있습니다.

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

이 패러다임을 명심하십시오

  • DB1에서 DUMP1로 mysqldump
  • DUMP1을 DB3에로드
  • --replace (또는 --insert-ignore) 및 --no-create-info를 사용하여 DB2에서 모든 것을 mysqldump
  • DUMP2를 DB3에로드

1
잠시 기다리십시오. --replace를 사용하면 DB2 데이터가 DB1 데이터를 겹쳐 쓰게되고 --insert-ignore를 사용하면 DB1 데이터가 우선합니다. 질문 은 중복 키의 경우 UPDATE 를 수행하는 방법을 묻는 것 같습니다 . 어쨌든 알고 싶습니다.
Edward Newell

@EdwardNewell 모든 열 --replace에서 수행하는 것과 같습니다 ON DUPLICATE UPDATE. 불행히도 mysqldump는 mysqldump의 대량 로딩 및 덤프 특성으로 인해 특정 열을 업데이트하도록 설계되지 않았습니다. 내 대답은 단순히 mysqldump가 할 수있는 일을 보여줍니다. mysqldump와는 별도로 커스텀 코드를 작성해야한다 ON DUPLICATE UPDATE.
RolandoMySQLDBA

DB1과 2가 정확히 동일한 스키마를 갖는 한 맞습니다. 그러나 DB1에 추가 필드가 있다고 가정하십시오. 그런 다음 --replace를 사용하면 공유 필드를 업데이트하는 대신 추가 필드가 기본값 (또는 기본값이없는 경우 오류)으로 되돌아갑니다. 나는 OP의 상황이 같은 스키마에 두 개의 데이터베이스입니다 실현하지만, 그냥 거기에 있다는 지적 이다 차이, 어떤 경우에는 진정한 갱신 형 덤프가 유용 할 것 (지금은 하나를 마주하고있어!)를
에드워드 뉴웰

1
업데이트중인 레코드를 가리키는 외래 키가있는 경우 REPLACE INTO해당 관계를 끊어 레코드를 삭제할 수 없으므로 사용하지 못할 수 있습니다. 이있는 경우 ON DELETE CASCADE업데이트되는 테이블에 따라 해당 테이블을 비 웁니다. REPLACE INTO꽤 위험한 작업입니다.
Christopher Schultz

1
@RolandoMySQLDBA 합의. 이 답변을 읽는 사람이 이러한 옵션 (특히 REPLACE INTO)이 위험하고 "놀라운"영향을 줄 수 있음을 이해하고 싶었습니다 . 좋은 대답은 단지 경고를 추가하고 싶었습니다.
Christopher Schultz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.