문제

내 프로젝트 중 하나는 MySQL에서 MyISAM 엔진을 사용하지만 여기저기서 트랜잭션 지원이 필요하므로 InnoDB로 변경하는 것을 고려하고 있습니다.

  • 이 작업을 수행하기 전에 무엇을 보거나 고려해야합니까?
  • 엔진 만 변경할 수 있습니까? 아니면 데이터를 준비해야합니까?
도움이 되었습니까?

해결책

예, 절대적으로 많은 것들이 있습니다. 응용 프로그램을 매우 철저히 테스트해야합니다.

  • 거래는 교착 상태가 될 수 있으며 반복해야합니다. 이 경우에도 한 행만 삽입하는 자동 커미션 트랜잭션이있는 경우에도 (경우에도) 경우입니다.
  • 디스크 사용은 거의 확실하게 증가 할 것입니다
  • 쓰기 중 I/O로드는 거의 확실하게 증가합니다.
  • IndoDB가 클러스터 된 인덱스를 사용하기 때문에 인덱싱 동작이 변경됩니다. 경우에 따라 유익한 효과가 될 수 있습니다.
  • 백업 전략에 영향을 미칩니다. 이것을 신중하게 고려하십시오.

마이그레이션 프로세스 자체는 많은 데이터가 있으면 오랜 시간이 걸리므로 (데이터가 준비 적으로 또는 완전히 이용할 수 없을 것입니다 - 확인하십시오!)

다른 팁

큰 경고가 하나 있습니다. 쓰기 중에 모든 종류의 하드웨어 고장 (또는 이와 유사한)을 얻는 경우 InnoDB는 테이블을 손상시킵니다.

Myisam도 할 것입니다. 그러나 MysqlCheck-AUTO-Repair가 수리 할 것입니다. InnoDB 테이블로 이것을 시도하면 실패합니다. 예, 이것은 경험에서 나온 것입니다.

이는 InnoDB를 사용하려면 정기적 인 데이터 백업 계획이 필요하다는 것을 의미합니다.

다른 메모 :

innodb는 테이블/데이터베이스를 삭제하거나 레코드를 삭제 한 후 파일 시스템에서 여유 공간을 재 할당하지 않습니다. "덤프 및 가져 오기"또는 설정으로 해결할 수 있습니다. innodb_file_per_table=1 my.cnf에서.

대형 InnoDB 테이블에 인덱스를 추가/제거하는 것은 현재 테이블을 잠그고 변경된 인덱스가있는 임시 테이블을 생성하고 데이터를 행으로 삽입하는 임시 테이블을 생성하기 때문에 상당히 고통 스러울 수 있습니다. 이있다 Innobase의 플러그인, 그러나 그것은 MySQL 5.1에서만 작동합니다

Innodb는 또한 훨씬 더 많은 메모리 강렬합니다. innodb_buffer_pool_size 서버 메모리가 허용하는 변수 (70-80%는 안전한 베팅이어야합니다). 서버가 Unix/Linux 인 경우 SYSCTL 변수 감소를 고려하십시오. vm.swappiness 0으로 사용합니다 innodb_flush_method=O_DIRECT 이중 버퍼링을 피하기 위해. 해당 값을 전환 할 때 스왑을 누르면 항상 테스트합니다. 언제든지 더 많이 읽을 수 있습니다. 퍼코 나 블로그, 그것은 훌륭합니다.

또한, 당신은 달릴 수 있습니다 mysqlbackup ~와 함께 --single-transaction --skip-lock-tables 백업이 시작되는 동안 테이블 잠금 장치가 없습니다.

어쨌든, innodb는 위대합니다. 약간의 함정이 당신을 낙담시키지 마십시오.

테이블을 변경하고 엔진을 설정하는 것이 좋습니다.

  • 조심해야 할 큰 사람 중 하나는 select count(*) from MyTable ~이다 많이 Myisam보다 Innodb에서 느리게.
  • Auto_Increment 값은 서버가 다시 시작된 후 표 +1에서 가장 높은 값으로 재설정됩니다. 이는 일부 삭제가있는 지저분한 DB가 있으면 재미있는 문제가 발생할 수 있습니다.
  • 최적의 서버 설정은 주로 Myisam DB와 다릅니다.
  • InnoDB 파일의 크기가 모든 데이터를 유지할 수있을 정도로 크거나 테이블 엔진을 변경할 때 지속적인 재 할당으로 십자가에 못 박히실 수 있습니다.

동시 쿼리를 얻는 방법으로 innodb를 사용하려는 경우 innodb_file_trx_commit=1 그래서 당신은 약간의 성능을 얻습니다. OTOH, 당신이 당신의 응용 프로그램을 거래 인식으로 다시 코고로 코딩하고 싶다면,이 설정을 결정하는 것은 InnoDB 설정에 필요한 일반 성과 검토의 일부가 될 것입니다.

조심해야 할 또 다른 주요 사항은 InnoDB가 FullText 지수를 지원하지 않거나 지연된 삽입을하지 않는다는 것입니다. 그러나 Myisam은 참조 무결성을 지원하지 않습니다. :-)

그러나 거래 인식이 필요한 테이블 만 이동할 수 있습니다. 나는 이것을했다. 작은 테이블 (최대 수천 개의 행)은 종종 즉시, 우연히 변경 될 수 있습니다.

성능 특성은 다를 수 있으므로 부하를 주시해야 할 수도 있습니다.

데이터는 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top