Evet, belirtebileceğiniz durumlar vardır COPY
, ancak performanstan başka nedenlerle olabilir.
MySQL'in yeni bir özellik getirdiğini anlamak önemlidir - 5.6 sürümünde Çevrimiçi DLL işleme. Çevrimdışı işleme kaldırılmadı. Bu nedenle, bu 2 mod arasında ayrım yapmaya ihtiyaç vardır:
Bazı işlemler yalnızca Çevrimdışı modda çalışır. Yerinde gerçekleştirilebilen veya gerçekleştirilemeyen DDL işlemlerinin listesi için bkz. Tablo 15.10, “ DDL İşlemleri için Çevrimiçi Durumun Özeti ”.
Çevrimiçi ve Çevrimdışı modlardaki işlemler biraz farklı davranışlara sahiptir, bu nedenle uyumluluk nedeniyle "eski" olanı seçebilirsiniz.
Bazı örnekler (lütfen daha fazla önerin):
MySQL 5.6 önce oluşturulmuş InnoDB tablolar desteklemeyen ALTER TABLE ... ALGORITHM=INPLACE
zamansal sütunları (dahil tablolar için DATE
, DATETIME
ya da TIMESTAMP
) kullanarak yeniden edilmemiştir ALTER TABLE ... ALGORITHM=COPY
. Bu durumda, bir ALTER TABLE ... ALGORITHM=INPLACE
işlem hata döndürür.
ADD PRIMARY KEY
cümlesi COPY mode
sessizce NULL
o veri türü için varsayılan değerlere (INT için 0, varchar için boş dize) dönüştürürken IN_PLACE
bunu yapmaz.
ALGORITHM = COPY yan tümcesinde, birincil anahtar sütunlarında NULL değerlerinin bulunmasına rağmen işlem başarılı olur; veriler sessizce değiştirilir, bu da sorunlara neden olabilir.
Tercih etmek için başka bir neden COPY
:
Özel senaryolarda tam geriye dönük uyumluluk için gerekirse tablo kopyalama davranışını zorlamak üzere ALGORITHM = COPY veya old_alter_table = 1 belirttiğiniz işlemler.
MySQL kılavuzu gerçek senaryolar hakkında konuşmasa da, bazılarını hayal edebilirsiniz. Örneğin, geliştirici ALTER INDEX
çalışma sırasında tablonun kilitlenmesine güveniyordu, bu nedenle tablonun salt okunur veya tamamen kilitli olması ve dizin yeniden oluşturma sırasında statik tabloyu okuyan bir işlem var.