Mysql

預設情況下,mysqldump 是否導出索引?

  • September 6, 2017

我用 mysqldump 玩了一下,我想知道它是否預設導出索引(FULLTEXT,,INDEX…)。我閱讀了它,發現了這個選項

--disable-keys, -K

這表明它實際上確實導出了索引。但我不想相信我的解釋,我想確保我做對了(或錯了;-))。誰能證實這一點?

不,它不導出索引。將 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 的內容。

此外,這是在所有 INSERT 完成後嵌入的

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

警告 #1

實現 DISABLE KEYS 和 ENABLE KEYS 以在重新載入表時禁用非唯一索引的重新載入。主鍵和唯一鍵未禁用。它們在插入的同時載入。一旦你啟用鍵,非唯一索引將通過排序重建(或使用 MyISAM 鍵記憶體是沒有足夠的可用記憶體)

不幸的是,DISABLE KEYS 和 ENABLE KEYS 僅適用於 MyISAM 表,不適用於 InnoDB。

注意事項 #2

您不必 –disable-keys。您可以使用 –skip-disable-keys 禁用 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.

引用自:https://dba.stackexchange.com/questions/3069