O mysqldump exporta índices, por padrão?

20

Eu brinquei um pouco com mysqldump e eu queria saber, se isso acontecer índices de exportação ( FULLTEXT, INDEX...) por padrão. Eu li e encontrei esta opção :

--disable-keys, -K

o que sugere que ele realmente exporta os índices. Mas não quero confiar na minha interpretação e quero ter certeza de que estou certo (ou errado ;-)). Alguém pode confirmar isso?

Aufwind
fonte
Por favor atualize. Atualizei minha resposta com exemplos de trechos do mysqldump.
RolandoMySQLDBA
Por favor atualize. Atualizei minha resposta com uma ressalva adicional sobre as teclas DESABILITAR e ATIVAR CHAVES.
RolandoMySQLDBA
Por favor atualize. Atualizei minha resposta com algumas advertências adicionais sobre como ignorar as teclas de desativação e despejar os espaços de tabela.
RolandoMySQLDBA
Esta pergunta merece um +1, porque tenho quase certeza de que muitos tiveram a mesma pergunta em mente, mas tinham medo de perguntar. Você pediu, você recebe o +1 !!!
RolandoMySQLDBA
@RolandoMySQLDBA: Você se esforça muito em sua resposta. Muito obrigado!!
Aufwind

Respostas:

16

Não, não exporta índices. Os índices são reconstruídos após o carregamento do mysqldump no mysql. As opções que você encontrou "--disable-keys" fazem com que o mysqldump escreva algo parecido com isto antes do carregamento da tabela via INSERTs:

DROP TABLE IF EXISTS `tblAccountLinks`;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `tblAccountLinks` (
  `ID` int(11) NOT NULL auto_increment,
  `FirmNo` varchar(10) NOT NULL,
  `CustomerNo` varchar(20) NOT NULL,
  `AccountNo` varchar(20) NOT NULL,
  `LinkType` smallint(6) NOT NULL,
  `AccessLevel` smallint(6) NOT NULL,
  `Status` smallint(6) NOT NULL,
  `CreatedOn` datetime NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=27023 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;

--
-- Dumping data for table `tblAccountLinks`
--

LOCK TABLES `tblAccountLinks` WRITE;
/*!40000 ALTER TABLE `tblAccountLinks` DISABLE KEYS */;
INSERT INTO `tblAccountLinks` VALUES (1,'F0001','C001','T00000001',1,2,1,'2008-06-30 07:55:43'),(2,'
F0001','C001','T00000002',2,2,1,'2008-06-30 07:55:43'),(3,'F0001','C002','27601012',1,2,1,'2008-06-3 ...

A linha após LOCK TABLES é

/*!40000 ALTER TABLE `tblAccountLinks` DISABLE KEYS */;

Isto é o que a opção --disable-keys incorpora no mysqldump.

Além disso, isso é incorporado após a conclusão de todos os INSERTs

/*!40000 ALTER TABLE `tblAccountLinks` ENABLE KEYS */;
UNLOCK TABLES;

CAVEAT # 1

TECLAS DESABILITAR e TECLAS ENABLE foram implementadas para desativar o recarregamento de índices não únicos enquanto uma tabela está sendo recarregada. Chaves primárias e chaves exclusivas não estão desativadas. Eles são carregados no mesmo momento em que os INSERTs estão sendo. Depois de ATIVAR CHAVES, os índices não únicos são reconstruídos por meio de classificação (ou usando o cache de chaves MyISAM, não há memória disponível suficiente)

Infelizmente, DISABLE KEYS e ENABLE KEYS funcionam apenas para tabelas MyISAM, não para o InnoDB.

CAVEAT # 2

Você não precisa --disable-keys. Você pode desabilitar as teclas DISABLE KEYS (sem trocadilhos) com --skip-disable-keys:

  -K, --disable-keys  '/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and
                      '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put
                      in the output.
                      (Defaults to on; use --skip-disable-keys to disable.)

Isso pode resultar em uma carga mais lenta e um potencial desequilíbrio das páginas de índice para índices não exclusivos.

CAVEAT # 3

Você pode despejar os espaços de tabela reais do InnoDB (MySQL 5.5.12)

  -Y, --all-tablespaces 
                      Dump all the tablespaces.
  -y, --no-tablespaces 
                      Do not dump any tablespace information.
RolandoMySQLDBA
fonte
1
Observe que isso está desatualizado, o MySQL 5.7 inclui índices.
Erica Kane