Mysqldump экспортирует индексы по умолчанию?

20

Я играл немного с туздЫшпр и мне было интересно, если это делает показатели экспорта ( FULLTEXT, INDEX, ...) по умолчанию. Я прочитал об этом, и я нашел эту опцию :

--disable-keys, -K

что говорит о том, что он действительно экспортирует индексы. Но я не хочу доверять своей интерпретации, и я хочу убедиться, что я понял это правильно (или неправильно ;-)). Кто-нибудь может это подтвердить?

Aufwind
источник
Пожалуйста, обновите. Я обновил свой ответ примерами mysqldump.
RolandoMySQLDBA
Пожалуйста, обновите. Я обновил свой ответ дополнительным предупреждением о ОТКЛЮЧЕННЫХ КЛЮЧАХ и ВКЛЮЧЕННЫХ КЛЮЧАХ.
RolandoMySQLDBA
Пожалуйста, обновите. Я обновил свой ответ дополнительными предостережениями об обходе DISABLE KEYS и сбросе табличных пространств.
RolandoMySQLDBA
Этот вопрос заслуживает +1, потому что я почти уверен, что многие имели в виду этот же вопрос, но боялись его задать. Вы спросили, вы получите +1 !!!
RolandoMySQLDBA
@RolandoMySQLDBA: Вы приложили много усилий в своем ответе. Большое спасибо!!
Aufwind

Ответы:

16

Нет, он не экспортирует индексы. Индексы перестраиваются при загрузке mysqldump обратно в mysql. Параметры, которые вы нашли "--disable-keys", приводят к тому, что mysqldump пишет что-то вроде этого перед загрузкой таблицы через 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 ...

Строка после LOCK TABLES

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

Это то, что опция --disable-keys встраивает в mysqldump.

Кроме того, это встроено после того, как все вставки сделаны

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

ПЕРЕДАЧА № 1

DISABLE KEYS и ENABLE KEYS были реализованы для отключения перезагрузки неуникальных индексов во время перезагрузки таблицы. Первичные и уникальные ключи не отключены. Они загружаются в тот момент, когда вставляются. После того, как вы ВКЛЮЧАЕТЕ КЛЮЧИ, неуникальные индексы перестраиваются с помощью сортировки (или при использовании кеша ключей MyISAM недостаточно свободной памяти)

К сожалению, DISABLE KEYS и ENABLE KEYS работают только для таблиц MyISAM, но не для InnoDB.

ПЕРЕДАЧА № 2

Вам не нужно --disable-keys. Вы можете отключить DISABLE KEYS (без каламбура) с помощью --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.)

Это может привести к более медленной загрузке и потенциальному перекосу страниц индекса для неуникальных индексов.

ПЕРЕДАЧА № 3

Вы можете сбросить фактические табличные пространства InnoDB (MySQL 5.5.12)

  -Y, --all-tablespaces 
                      Dump all the tablespaces.
  -y, --no-tablespaces 
                      Do not dump any tablespace information.
RolandoMySQLDBA
источник
1
Обратите внимание, что это устарело, MySQL 5.7 включает индексы.
Эрика Кейн