2011-04-05 1 views
2

우리는 대규모 스키마 마이그레이션을 실행해야하며 사이트가 오래 동안 사용되는 것을 원하지 않기 때문에 관련 테이블을 읽기 잠금없이 즉시 수행하려고합니다. 관련된 테이블은 특정 시간대에만 쓰여지므로 우리는 쓰기 잠금 기능을 가질 수있는 창을 가지고 있습니다. 그러나 많은 mysql 문서들이 ALTER TABLE은 단지 락 테이블을 작성해야한다고 주장하지만, 우리의 경험 에선 인덱스를 추가하는 것과 같은 독창적 인 것은 아무것도 읽지 않는다.아무것도 잠그지 않고 mysql 외래 키가 참조하는 테이블을 변경할 수 있습니까?

그래서 우리는 수동으로 마이그레이션을 수행해야했습니다. new_mytable

  • mysql mydb < mytable.sql의 정확한 컬럼에 삽입 할

    1. CREATE TABLE new_mytable LIKE mytable;
    2. mytable.sql을 변경 나오지 new_mytable
    3. mysqldump -t mydb mytable > mytable.sql
    4. 사용하여 마이그레이션을 적용 : 우리는 다음과 같은 절차에 약간의 성공을 했어
    5. 외래 키를 mytable에 드롭 -에 의해 복사되지 않음
    6. 때문에, 약간 정신이 내가 말하는대로
    7. DROP TABLE old_mytable

    이 테이블에만 하루 중 특정 시간에 기록받을 포함했다 확인 new_mytable

  • RENAME TABLE mytable TO old_mytable, new_mytable TO mytable
  • 실행에 외래 키를 추가 우리는 데이터가 일관성을 유지하는지 확신합니다. 그렇지 않으면 우리는 그런 것을 시도하지 않을 것입니다. 그렇더라도, 우리는 문제를 쳤다. 지금까지 우리는 FK가 바깥을 가리키는 테이블에서만 시도했습니다. 오늘 나는 여러 다른 테이블에 의해 참조 된 테이블에서 그것을 시도했다. 이전 테이블을 삭제했을 때, 외래 키 제약 조건이 실패했다는 말을 듣고 참조 테이블이 이전 테이블을 참조하는 것을보고 놀라움을 금치 못했습니다.

    이제 우리는 FK를 삭제하고 새 FK에 다시 추가 할 수 있지만 프로세스는 그대로 약해집니다. 이 테이블을 가리키는 테이블이 많이 있습니다. 키를 다시 추가하면 우리에게 읽기 잠금이 생길 수 있습니다. 우리는 확실한 것입니다 - 특정 - 새 테이블에 첫 번째 데이터와 동일한 데이터가 모두 포함되어 있으므로, FK를 삭제하고 추가하지 않고 해당 FK의 참조를 변경하는 것이 좋습니다. 기존 FK가 새 테이블을 참조하도록 변경되도록 DB를 조작 할 수있는 방법이 있습니까?

  • 답변

    1

    테이블 자체를 변경하는 방법을 알고 있다면 알려주십시오.

    SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
    
    ...Alter the tables and change the keys 
    
    SET [email protected]_FOREIGN_KEY_CHECKS;