Mysqldump exporte-t-il les indices par défaut?

20

J'ai joué un peu avec mysqldump et je me demandais, si elle ne les indices d'exportation ( FULLTEXT, INDEX...) par défaut. Je l'ai lu et j'ai trouvé cette option :

--disable-keys, -K

ce qui suggère qu'il exporte effectivement les indices. Mais je ne veux pas me fier à mon interprétation et je veux m'assurer d'avoir bien compris (ou mal ;-)). Quelqu'un peut-il confirmer cela?

Aufwind
la source
Rafraichissez, s'il vous plait. J'ai mis à jour ma réponse avec des exemples d'extraits mysqldump.
RolandoMySQLDBA
Rafraichissez, s'il vous plait. J'ai mis à jour ma réponse avec une mise en garde supplémentaire sur DISABLE KEYS et ENABLE KEYS.
RolandoMySQLDBA
Rafraichissez, s'il vous plait. J'ai mis à jour ma réponse avec des mises en garde supplémentaires sur le contournement des touches DISABLE et le vidage des espaces de table.
RolandoMySQLDBA
Cette question mérite un +1 car je suis presque certain que beaucoup ont pensé à la même question mais avaient peur de la poser. Vous avez demandé, vous obtenez le +1 !!!
RolandoMySQLDBA
@RolandoMySQLDBA: Vous avez mis beaucoup d'efforts dans votre réponse. Merci beaucoup!!
Aufwind

Réponses:

16

Non, il n'exporte pas d'index. Les index sont reconstruits lors du chargement de mysqldump dans mysql. Les options que vous avez trouvées "--disable-keys" obligent le mysqldump à écrire quelque chose comme ça avant le chargement de la table via INSERT:

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 ...

La ligne après LOCK TABLES est

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

C'est ce que l'option --disable-keys intègre dans mysqldump.

En outre, cela est intégré une fois toutes les insertions terminées

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

CAVEAT # 1

Les touches DISABLE et ENABLE KEYS ont été implémentées pour désactiver le rechargement des index non uniques pendant le rechargement d'une table. Les clés primaires et les clés uniques ne sont pas désactivées. Ils sont chargés au même moment que les INSERT sont en cours. Une fois que vous avez activé les clés, les index non uniques sont reconstruits via le tri (ou en utilisant le cache de clés MyISAM, la mémoire disponible est insuffisante)

Malheureusement, DISABLE KEYS et ENABLE KEYS ne fonctionnent que pour les tables MyISAM, pas InnoDB.

CAVEAT # 2

Vous n'avez pas besoin de --disable-keys. Vous pouvez les désactiver (sans jeu de mots) avec --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.)

Cela pourrait entraîner une charge plus lente et un déséquilibre potentiel des pages d'index pour les index non uniques.

CAVEAT # 3

Vous pouvez vider les tablespaces InnoDB réels (MySQL 5.5.12)

  -Y, --all-tablespaces 
                      Dump all the tablespaces.
  -y, --no-tablespaces 
                      Do not dump any tablespace information.
RolandoMySQLDBA
la source
1
Veuillez noter que ceci est obsolète, MySQL 5.7 inclut des index.
Erica Kane