MySqlDump'ın DISABLE KEYS'in içe aktarma üzerinde hiçbir etkisi yoktur


10

Inno-Tables (sürpriz!) İle ithalat hızı ile ilgili önceki sorumu takip ediyorum .

Senaryo
Yerel dev makineme makul bir zamanda bazı büyük * veritabanı dökümü almaya çalışıyorum. KEYBir darboğaz olduğu ortaya çıkan, ancak canlı sistemimiz için hala önemli olan tablolara bağlı çok fazla şey var.

Yukarıdaki soruyu sorduktan sonra yaklaşımım, KEY ...dökümleri, içe aktarma ve anahtarları yeniden ekleme ifadelerini silmekti .

Ancak sık sık kendimi yerel olarak içe aktarmak için mevcut bir dökümü düzenlerken buluyorum ve bu komik "yorumlara" rastladım ( disable/enable keysThelines)

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

Ama aslında bu "yorumlar" koşullu MySql-Deyimleridir

Bu benim için bir haberdi ama tamam, çıktı formu göz önüne alındığında mysql --versionher şey benim için iyi görünüyor: mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3

Varsayalım
Masa kilitli (güzel, dev makinede sadece benim). Daha sonra tablo şemasında tanımlanan tuşlar devre dışı bırakılır, veriler alınır, tuşlar etkinleştirilir.
Bu nedenle, "veri ekleme" sırasında, anahtarlarda zaman kaybı olmamalı, tüm veriler eklendikten sonra incelenmelidir.

Bu KEY 'foo' (foo)'dökümü tüm -lines silmek , dökümü almak ve ADD KEY 'foo' ...daha sonra ile bir komut dosyası çalıştırmak sanki aynı davranış olduğunu düşünüyorum .

Ne gözlemlemek
Anahtarları manuel olarak silmek, anahtarları almak ve yeniden eklemek, ardından DISABLE KEYSoluşturulan koşullu ifadelere dayanarakmysqldump

Döküm + mysql içe aktarma + anahtar ekleme = 15 + 8 + 8 ≈ 30dk
Düz mysql içe aktarma: vazgeçildi, (sadece günde 8 saat için ödeme alıyorum> :))

Ben yardım edemem ama burada çok temel bir şey eksik düşünüyorum (veya veritabanı beni trolling).


2
Kısa süreli: mysqldump --innodb-optimize-keysPercona'dan kullanın percona.com/doc/percona-server/5.5/management/… Uzun süreli: mysqldump kullanmayı bırakın ve mydumper veya xtrabackup kullanın.
jynus

Yanıtlar:


12

Sen güvenemez DISABLE KEYS;ve ENABLE KEYS;InnoDB için InnoDB'nin Depolama Motorunda uygulanmadı için. Koşu ALTER TABLE ... DISABLE KEYS;ve ALTER TABLE ... ENABLE KEYS;MyISAM için tasarlanmıştır. O dediği gibi için MySQL BelgeleriALTER TABLE :

Bir MyISAM tablosunda ALTER TABLE kullanırsanız, tüm benzersiz olmayan dizinler ayrı bir toplu iş olarak oluşturulur (ONARIM TABLOSU için olduğu gibi). Bu, birçok dizininiz olduğunda ALTER TABLE'ı daha hızlı hale getirmelidir.

MyISAM tabloları için, anahtar güncelleme açıkça kontrol edilebilir. Alter TABLE kullanın ... MySQL benzersiz olmayan dizinleri durdurmak durdurmak için anahtarları devre dışı bırakın. Sonra eksik dizinleri yeniden oluşturmak için ALTER TABLE ... ENABLE tuşlarını kullanın. MyISAM bunu anahtarları tek tek eklemekten çok daha hızlı olan özel bir algoritma ile yapar, bu nedenle toplu ekleme işlemlerini gerçekleştirmeden önce anahtarları devre dışı bırakmak önemli bir hızlanma sağlayacaktır. ALTER TABLE ... DISABLE KEYS, daha önce belirtilen ayrıcalıklara ek olarak INDEX ayrıcalığını da gerektirir.

Benzersiz olmayan dizinler devre dışı bırakılırken, SELECT ve EXPLAIN gibi bunları kullanacak ifadeler için yok sayılır.

Şu ana kadar InnoDB'den hiç bahsedilmiyor ALTER TABLE ... DISABLE/ENABLE KEYS;

ALTER TABLE ... DISABLE KEYS;InnoDB tablosuna karşı çalışsanız bile bir uyarı oluşturur:

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>

Bu yüzden hiçbir etkisi yoktur. @Jynus'un , madde 7'deki cevabında aynı şeyden bahsettiğini lütfen unutmayın .

Ayrıca, MyISAM'in verileri ve dizinleri iki ayrı dosyada (veriler için .MYD, dizinler için .MYI) sakladığını unutmayın, bu nedenle dizinleri devre dışı bırakıp etkinleştirmek önemsiz olacaktır. InnoDB, PRIMARY KEY ve satır verilerini aynı InnoDB sayfalarında (Kümelenmiş Dizin aracılığıyla) tutar. İkincil dizinler, her ikincil dizin yaprağı girişine ek olarak PRIMARY KEY öğesini taşır . Veriler ve indeksler Kümelenmiş Endeks ile iç içe geçtiği için, henüz kimse InnoDB'yi uygulamaya DISABLE KEYSve uygulamaya ENABLE KEYSçalışmamıştır.


1
"Sana söyledim" :-)
jynus

@jynus HA HA :-). InnoDB için mysqldump yorumunuzu ( dba.stackexchange.com/questions/76565/… ) yanıt olarak göndermelisiniz.
RolandoMySQLDBA

@yoshi Orijinal sorunuza dayalı bir makale yazıyorum, bizi izlemeye devam edin.
jynus

@yosi Söz verildiği gibi: dbahire.com/…
jynus

@RolandoMySQLDBA, InnoDB anahtarları etkinleştiremez / devre dışı bırakamazsa, yalnızca uyarı yerine hata vermez mi?
Pacerier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.