2017-03-15 18 views
0

매일 MySQL을 디버깅하는 동안 데이터베이스에 테이블 유형이 혼합되어 있음을 발견했습니다.하나의 MySQL DB에 테이블 형식이 혼합되어있는 것이 정상입니까?

이것은 이상한 것 같지만 어떻게 일어 났는지 또는 문제를 일으킬 지 알 수 없습니다. 문제를 해결해야합니까? 당신은 당신이 각 테이블에 대해 무엇을 원하는 테이블 엔진을 선택할 수 있기 때문에

enter image description here

답변

1

음, 이것은 정확히 오류가 아닙니다. 그러나이 조합을 사용하면 심각한 문제가 발생할 수 있습니다. InnoDB는 트랜잭션을 지원하지만 MyISAM은 트랜잭션을 지원하지 않습니다!

어떤 트랜잭션이 사용되는지 알 수없는 경우 :
트랜잭션은 쿼리 그룹의 모든 쿼리가 성공적으로 실행되었는지 또는 아무 것도 수행되지 않았 음을 확인합니다. 전형적인 예는 클라이언트가 무언가를 주문하고 그에 따라 잔액이 조정된다는 것입니다. 그래서 당신은 데이터베이스에서이 같은 일을 할 거라고 :

START TRANSACTION; 
INSERT INTO orders (item, client, price) VALUES ('whatever', 1, 100.00); 
UPDATE clients_credit SET balance = balance - 100.00 WHERE client = 1; 
COMMIT; 

을 (거래 종료)를 START TRANSACTION;COMMIT; 안에 두 쿼리를 퍼팅의 INSERTUPDATE가 실패 취소되어 있는지 확인합니다.

그러나 테이블 중 하나가 MyISAM 유형 인 경우이 테이블의 변경 사항은 실행 취소되지 않으며 결국 데이터베이스가 일관성없는 상태가됩니다.

내 제안은 모든 MyISAM 테이블을 InnoDB로 변경한다는 것입니다.

ALTER TABLE table_name ENGINE=InnoDB; 

위의 문제 외에도 MyISAM은 서서히 죽어 가고 있습니다. Performancewise 거기 요즘에는별로 차이가 없으며 심지어 행 수준의 잠금 대신 테이블 잠금과 같은 특정 단점이 있습니다. 이 온라인에서 많은 정보를 찾을 수 있습니다.

당신의 혼합물에 대한 이유는 일부 테이블 제작자

CREATE TABLE (
... 
) ENGINE=whatever; 

으로 테이블 작성에 엔진을 지정하고 다른 사람들이하지 않았다거나 잊어 버린 것을 가능성이 높습니다. 엔진이 지정되지 않은 경우

당신은 그러나 이노 디비로 생성됩니다

SET GLOBAL default_storage_engine = InnoDB; 

그런 다음 새 테이블에 기본 엔진을 조정할 수 있습니다. (이 옵션을 my.cnf에 넣을 수도 있습니다.)

테스트 할 때 SESSION 변수가 있음을 유의하십시오. 그것도 조정하거나 새로운 세션을 시작하십시오.

+0

재미 있습니다. 정말 고마워요! 나는이 세 테이블이 어떻게 MyISAM이 된 것인지 궁금합니다. 어떤 이유가있을 수 있습니까? –

+1

이에 대한 추가 정보를 포함하도록 답변을 편집했습니다. – fancyPants

+1

감사합니다. 나는 '사용 된 테이블 형식이 FULLTEXT 인덱스를 지원하지 않습니다.'라는 메시지를 한 테이블을 제외한 모든 테이블을 업데이트했습니다. 마치 mysql을 변환하기 위해 MySQL 버전을 업데이트해야하는 것처럼 보입니다. –