Loading...
MySQL 9.5 Reference Manual 9.5의 18.7.2 MERGE Table Problems의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
다음은 MERGE 테이블에 대해 알려진 문제들입니다:
MERGE child 테이블은 parent 테이블을 통해 잠금이 적용됩니다. parent가 임시 테이블이면 잠금되지 않고, 따라서 child 테이블들도 잠금되지 않습니다. 이는 기본이 되는 MyISAM 테이블을 병렬로 사용할 경우 해당 테이블들이 손상됨을 의미합니다.
ALTER TABLE을 사용하여 MERGE 테이블을 다른 스토리지 엔진으로 변경하면, 기본 테이블에 대한 매핑이 손실됩니다. 대신, 기본 MyISAM 테이블의 행이 변경된 테이블로 복사되고, 그 후 이 테이블은 지정된 스토리지 엔진을 사용합니다.
MERGE 테이블에 대한 INSERT_METHOD 테이블 옵션은 MERGE 테이블로 insert를 수행할 때 어떤 기본 MyISAM 테이블을 사용할지를 나타냅니다. 그러나 해당 MyISAM 테이블에 대해 AUTO_INCREMENT 테이블 옵션을 사용하더라도, MyISAM 테이블에 최소한 한 개의 행이 직접 insert되기 전까지는 MERGE 테이블에 대한 insert에는 아무 영향이 없습니다.
MERGE 테이블은 전체 테이블에 걸친 유니크 제약을 유지할 수 없습니다. INSERT를 수행할 때, 데이터는 INSERT_METHOD 옵션에 의해 결정되는 첫 번째 또는 마지막 MyISAM 테이블로 들어갑니다. MySQL은 해당 MyISAM 테이블 내에서만 유니크 키 값이 유일하게 유지되도록 보장하며, 집합에 포함된 모든 기본 테이블 전체에 대해서는 보장하지 않습니다.
MERGE 엔진은 기본 테이블 집합에 대해 유니크를 강제할 수 없으므로, REPLACE는 예상한 대로 동작하지 않습니다. 여기에는 두 가지 핵심 사실이 있습니다:
유사한 고려 사항이 INSERT ... ON DUPLICATE KEY UPDATE에 대해서도 적용됩니다.
MERGE 테이블은 파티셔닝을 지원하지 않습니다. 즉, MERGE 테이블을 파티션할 수 없으며, MERGE 테이블의 기본 MyISAM 테이블들 또한 파티션할 수 없습니다.
열려 있는 MERGE 테이블에 매핑된 어떤 테이블에 대해서도, ANALYZE TABLE, REPAIR TABLE, OPTIMIZE TABLE, ALTER TABLE, DROP TABLE, WHERE 절 없는 DELETE, 또는 TRUNCATE TABLE을 사용해서는 안 됩니다. 그렇게 하면, MERGE 테이블이 여전히 원래 테이블을 참조하고 있어 예기치 않은 결과를 초래할 수 있습니다. 이 문제를 회피하기 위해, 언급된 작업을 수행하기 전에 FLUSH TABLES 구문을 실행하여 어떤 MERGE 테이블도 열려 있지 않도록 하십시오.
예기치 않은 결과 중에는 MERGE 테이블에 대한 작업이 테이블 손상을 보고할 가능성이 포함됩니다. 이 상황이 기본 MyISAM 테이블 중 하나에 대해 언급된 작업을 수행한 이후에 발생한다면, 이 손상 메시지는 허위입니다. 이를 처리하려면, MyISAM 테이블을 수정한 후 FLUSH TABLES 구문을 실행하십시오.
MERGE 테이블이 사용 중인 테이블에 대해 DROP TABLE을 수행하는 것은 Windows에서는 동작하지 않습니다. 이는 MERGE 스토리지 엔진의 테이블 매핑이 MySQL 상위 레이어에서 숨겨져 있기 때문입니다. Windows에서는 열린 파일을 삭제할 수 없으므로, 먼저 모든 MERGE 테이블을 flush(FLUSH TABLES 사용)하거나, 해당 테이블을 drop하기 전에 MERGE 테이블을 drop해야 합니다.
MyISAM 테이블과 MERGE 테이블의 정의는 테이블에 접근할 때(예: SELECT 또는 INSERT 구문의 일부로) 검사됩니다. 이 검사는 컬럼 순서, 타입, 크기 및 관련 인덱스를 비교하여 테이블 정의와 parent MERGE 테이블 정의가 일치하는지 확인합니다. 테이블 간에 차이가 있으면 에러가 반환되고 구문은 실패합니다. 이 검사는 테이블이 열릴 때 수행되므로, 컬럼 변경, 컬럼 순서 변경, 엔진 변경을 포함하여 단일 테이블 정의에 대한 어떤 변경도 구문 실패를 야기합니다.
MERGE 테이블과 그 기본 테이블에서 인덱스의 순서는 동일해야 합니다. MERGE 테이블에서 사용되는 테이블에 ALTER TABLE을 사용하여 UNIQUE 인덱스를 추가한 다음, MERGE 테이블에 대해 ALTER TABLE을 사용하여 비유니크 인덱스를 추가하면, 기본 테이블에 이미 비유니크 인덱스가 있었던 경우 테이블 간의 인덱스 순서가 달라집니다. (이는 ALTER TABLE이 중복 키를 빠르게 탐지하기 위해 UNIQUE 인덱스를 비유니크 인덱스보다 앞에 배치하기 때문입니다.) 결과적으로, 이러한 인덱스를 가진 테이블에 대한 쿼리는 예기치 않은 결과를 반환할 수 있습니다.
ERROR 1017 (HY000): Can't find file: ' tbl_name.MRG' (errno: 2)와 유사한 에러 메시지가 발생하는 경우, 일반적으로 일부 기본 테이블이 MyISAM 스토리지 엔진을 사용하지 않음을 나타냅니다. 모든 해당 테이블이 MyISAM인지 확인하십시오.
MERGE 테이블의 최대 행 수는 2^64(약 1.844E+19; MyISAM 테이블과 동일)입니다. 이보다 많은 행을 가진 단일 MERGE 테이블로 여러 MyISAM 테이블을 merge하는 것은 불가능합니다.
parent MERGE 테이블과 기본이 되는 MyISAM 테이블의 행 포맷이 서로 다른 경우, 현재 알려진 바에 따르면 실패합니다. Bug #32364를 참조하십시오.
비임시 MERGE 테이블에 대해 LOCK TABLES가 적용 중일 때 union 리스트를 변경할 수 없습니다. 다음과 같은 예는 동작하지 않습니다:
1CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...; 2LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; 3ALTER TABLE m1 ... UNION=(t1,t2) ...;
그러나 임시 MERGE 테이블에 대해서는 이를 수행할 수 있습니다.
CREATE ... SELECT를 사용하여 MERGE 테이블을 생성할 수 없습니다. 이는 임시 MERGE 테이블과 비임시 MERGE 테이블 모두에 해당합니다. 예를 들어:1CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
이러한 시도는 tbl_name is not BASE TABLE라는 에러를 발생시킵니다.
MERGE 테이블과 기본 테이블 간에 상이한 PACK_KEYS 테이블 옵션 값이 사용되고, 기본 테이블에 CHAR 또는 BINARY 컬럼이 포함되어 있으면 예기치 않은 결과가 발생합니다. 해결책으로, 관련된 모든 테이블이 동일한 PACK_KEYS 값을 갖도록 ALTER TABLE을 사용하십시오. (Bug #50646)18.7.1 MERGE Table Advantages and Disadvantages
18.8 The FEDERATED Storage Engine