MySqlDump의 DISABLE KEYS는 가져 오기에 영향을 미치지 않습니다


10

Inno-Tables를 통한 가져 오기 속도에 관한 이전 질문 에 대한 후속 조치가 있습니다 (놀람!).

시나리오
적절한 시간 내에 로컬 dev 시스템에서 일부 큰 * 데이터베이스 덤프를 가져 오려고합니다. 우리는 KEY병목 현상으로 판명되었지만 라이브 시스템에 여전히 중요한 테이블에 많은 것을 첨부했습니다.

위의 질문을 한 후 내 접근 방식 KEY ...은 덤프에서 명령문 을 삭제 하고 키를 가져오고 다시 추가하는 것이 었습니다 .

그러나 종종 로컬에서 가져 오기 위해 현재 덤프를 편집하고이 재미있는 "설명"(- disable/enable keys라인)을 우연히 발견했습니다.

--
-- Dumping data for table `monster`
--

LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT  INSERT  INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;

그러나 실제로 이러한 "주석"은 조건부 MySql-Statements입니다.

출력 양식을 mysql --version보면 모든 것이 나에게 잘 어울리는 것을 감안할 때 그것은 뉴스이지만 괜찮 습니다. mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3

내가 생각
하는 것 테이블이 잠겨 있습니다 (좋아요, 개발자 mashine에 있습니다.). 그런 다음 테이블 스키마에 정의 된 키가 비활성화되고 데이터를 가져오고 키가 활성화됩니다.
따라서 "데이터 삽입"단계에서는 키에 시간을 낭비하지 말고 모든 데이터를 삽입 한 후에 검사해야합니다.

KEY 'foo' (foo)'덤프에서 모든 행을 삭제 하고 덤프를 가져온 ADD KEY 'foo' ...후 나중에 스크립트를 실행하는 것과 동일한 동작이라고 생각합니다 .

내가 관찰
이 것은 다음 조건에 의존 키, 가져 오기 및 다시 추가 키를 삭제 빠르게 수동에 방법입니다 DISABLE KEYS생성 문 제mysqldump

덤프 + mysql 가져 오기 수동 편집 + 키 추가 = 15 + 8 + 8 ≈ 30 분
일반 mysql 가져 오기 : 포기했습니다.

나는 도울 수 없지만 여기에 매우 근본적인 것이 빠져 있다고 생각합니다 (또는 데이터베이스가 나를 트롤링하고 있습니다).


2
단기 : mysqldump --innodb-optimize-keysPercona percona.com/doc/percona-server/5.5/management/… 에서 사용 장기 : mysqldump 사용을 중지하고 mydumper 또는 xtrabackup을 사용하십시오.
jynus

답변:


12

당신은에 의존 할 수 DISABLE KEYS;ENABLE KEYS;이노 위해이 이노 스토리지 엔진에 구현되어 있지 않으므로. 달리기 ALTER TABLE ... DISABLE KEYS;ALTER TABLE ... ENABLE KEYS;MyISAM을 위해 설계되었습니다. 에 대한 MySQL 설명서에ALTER TABLE 나와있는 것처럼 :

MyISAM 테이블에서 ALTER TABLE을 사용하는 경우 모든 고유하지 않은 인덱스는 별도의 배치로 작성됩니다 (REPAIR TABLE의 경우). 이렇게하면 많은 인덱스가있을 때 ALTER TABLE이 훨씬 빨라집니다.

MyISAM 테이블의 경우 키 업데이트를 명시 적으로 제어 할 수 있습니다. ALTER TABLE ... DISABLE KEYS를 사용하여 MySQL에 고유하지 않은 인덱스 업데이트를 중지하도록 지시하십시오. 그런 다음 ALTER TABLE ... ENABLE KEYS를 사용하여 누락 된 인덱스를 다시 만듭니다. MyISAM은 키를 하나씩 삽입하는 것보다 훨씬 빠른 특수 알고리즘으로이 작업을 수행하므로 대량 삽입 작업을 수행하기 전에 키를 비활성화하면 상당한 속도가 향상됩니다. ALTER TABLE ... DISABLE KEYS를 사용하려면 앞에서 언급 한 권한 외에 INDEX 권한이 필요합니다.

고유하지 않은 인덱스는 사용할 수 없지만 SELECT 및 EXPLAIN과 같은 명령문에서는 사용하지 않습니다.

InnoDB에 대한 언급은 없습니다. ALTER TABLE ... DISABLE/ENABLE KEYS;

ALTER TABLE ... DISABLE KEYS;InnoDB 테이블에 대해 실행하더라도 경고가 생성됩니다.

mysql> show create table mytimes\G
*************************** 1. row ***************************
       Table: mytimes
Create Table: CREATE TABLE `mytimes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `totalTime` int(11) NOT NULL,
  `totalTimeDesc` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> alter table mytimes disable keys;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytimes' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

이것이 영향이없는 이유입니다. @jynus가 글 머리 기호 7에서 그의 답변에서 같은 것을 언급했음을 기억하십시오 .

MyISAM은 데이터와 인덱스를 두 개의 별도 파일 (데이터의 경우 .MYD, 인덱스의 경우 .MYI)로 유지하므로 인덱스를 비활성화하고 활성화하는 것이 쉽지 않습니다. InnoDB는 PRIMARY KEY 및 행 데이터를 동일한 InnoDB 페이지 (클러스터형 인덱스를 통해)에 유지합니다. 보조 인덱스는 PRIMARY KEY를 모든 보조 인덱스 리프 항목에 대한 첨부 파일로 전달합니다 . 데이터와 인덱스가 클러스터 된 인덱스를 통해 얽혀 있기 때문에, 아무도, 아직로서 구현하는 시도하지 않았다 DISABLE KEYSENABLE KEYS이노있다.


1
"내가 너에게 말했어":-)
jynus

@jynus HA HA :-). InnoDB에 대한 mysqldump 의견 ( dba.stackexchange.com/questions/76565/… )을 답변으로 게시해야합니다 .
RolandoMySQLDBA

@yoshi 나는 당신의 원래 질문에 기초하여 기사를 쓰고 있습니다, 계속 지켜봐 주시기 바랍니다.
jynus

@yosi 약속대로 : dbahire.com/…
jynus

@RolandoMySQLDBA, InnoDB가 키를 활성화 / 비활성화 할 수 없다면 단순한 경고 대신 오류가 발생 하지 않습니까?
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.