Hedef Ortam Kontrolleri
Hedef ortam kontrolleri: Tablo yapısı, depolama motoru, şema uyumluluk kuralları ve tetikleyici denetimleri.
Bu kontroller, hiçbir veri kopyalamayan kalıcı silme (purge) görevlerinde atlanır.
DEST_TABLE_EXISTENCE_CHECK
Her görev tablosu hedef şemada aynı adla ve temel tablo (base table) olarak bulunmalıdır.
Çözüm: Hedef tabloları kaynaktaki tablo tanımlarından oluşturun. Hedefteki başvuru (lookup) tabloları boş olacaksa disable_foreign_key_checks ayarına bakın.
DEST_STORAGE_ENGINE_CHECK
Hedefteki her görev tablosu InnoDB olmalıdır: Kopyalama her yığını hedefte tek bir veritabanı işlemiyle (transaction) yazar ve bu işlemi yalnızca InnoDB geri alabilir. Depolama motoru NULL olarak bildirilen bir tablo <table>(<unknown>) olarak reddedilir.
Çözüm: Hedefte ALTER TABLE <table> ENGINE=InnoDB; komutunu çalıştırın.
DEST_KEY_IDENTITY_CHECK
Hedefteki PRIMARY KEY, kaynaktaki kolonlara aynı anahtar sırasıyla ve aynı tip, karakter seti ve karşılaştırma kuralıyla sahip olmalıdır: Farklı bir karşılaştırma kuralı, hangi anahtarların çakışacağını ve doğrulamanın satırları hangi sırayla okuyacağını değiştirir. Yalnızca şu genişletmeye izin verilir: utf8mb3 karakter setindeki bir anahtar kolonu, hedefte ikiz karşılaştırma kuralını kullanan bir utf8mb4 kolonuna kopyalanabilir. Örneğin utf8mb3_general_ci kuralından utf8mb4_general_ci kuralına geçilebilir.
Çözüm: Hedef tabloya kaynaktaki birincil anahtarı tanımlayın.
DEST_SCHEMA_COMPATIBILITY_CHECK
Bu kontrol, kaynak ve hedef kolonlarını büyük/küçük harf ayrımı gözetmeden ada göre eşleştirir ve ardından her çifti karşılaştırır. Hedef, kaynaktan daha esnek olabilir; ancak hiçbir zaman daha katı olamaz. Kopyalama her kolon için açık bir değer ekler ve hiçbir zaman hedefteki varsayılan değerlere veya indekslere dayanmaz. Bu nedenle bir esnetme zararsızdır; ek bir kısıtlama ise satırların reddedilmesine yol açar. Uyumsuz tabloların tamamı, her biri işlemin başlamasını durduran ilk engelleyici (fatal) farkıyla birlikte raporlanır.
İzin Verilenler: Hedef Daha Esnek Olabilir
| Fark | Neden Güvenlidir? |
|---|---|
| İkincil (secondary) indekslerin kaldırılması | Kopyalama bu indeksleri okumaz |
auto_increment, varsayılan değer veya ON UPDATE tanımlarının kaldırılması | Kopyalama tüm değerleri kendisi sağlar |
NOT NULL kısıtının kaldırılarak kolonun NULL değer alabilir hale gelmesi | Her durumda daha serbesttir |
| Kaynak kolonun üretilmiş (generated), hedef kolonun ise düz kolon olması | Okuma işlemi değeri somut olarak okur (materialise) |
Kolonun yalnızca bir tarafta INVISIBLE olması | Her okuma ve INSERT kolonları adıyla belirtir; bu nedenle kolon kopyalanır ve doğrulanır |
Tam sayı görüntüleme genişliği (bigint(20) ile bigint, tinyint(1) ile tinyint, bir zerofill genişliği) | Kozmetiktir: Kopyalama ve özet (hash), dolgulu metni değil değerin kendisini okur. unsigned ve zerofill özniteliklerinin kendisi ise eşleşmelidir |
year(4) ile year | Kozmetiktir |
| Kolon sırasının farklı olması | Bilgilendirme (advisory): Tablo başına bir tane yazdırılır ve yeri değişen her kolonu adıyla belirtir. Her okuma ve INSERT kolonları adıyla belirtir |
| Kolon adının yalnızca büyük/küçük harf açısından farklı olması | Bilgilendirme. Kopyalama kaynaktaki kolon adlarını kullandığı için satırlar normal şekilde kopyalanır ve doğrulanır |
Engelleyici Hata (Fatal): Hedef Veritabanı Daha Katı Kurallara Sahip Olamaz
| Fark | Sonucu |
|---|---|
| Kolonun yalnızca bir tarafta bulunması | Yanlış kolon eşleştirmesi |
| Kolon tipinin farklı olması (görüntüleme genişliği dışında) | Değer bozulması veya ekleme (insert) hatası |
Hedefte NOT NULL, kaynakta NULL değer alabilir kolon | NULL içeren satırlar kopyalamanın ortasında reddedilir |
| Hedef kolonun üretilmiş (generated) olması | Açıkça verilen değer reddedilir |
| Yalnızca hedefte bulunan benzersiz indeks | Kaynakta birbirinden farklı olan satırlar çakışır ve kopyalama başarısız olur |
| Birincil anahtarın farklı olması | DEST_KEY_IDENTITY_CHECK tarafından raporlanır |
CHECK kısıtlamaları ve yabancıl anahtarlar (foreign key) karşılaştırılmaz. Yalnızca hedefte bulunan böyle bir kısıtlama bir satırı reddederse o yığının kopyalanması başarısız olur ve yığın, herhangi bir silme yapılmadan önce geri alınır.
Hedefteki Benzersiz İndeksler
Benzersiz indeksler (unique index) adlarına göre değil, neyi benzersiz kıldıklarına göre karşılaştırılır: Aynı parça kümesine sahip iki benzersiz indeks eşdeğer kabul edilir. Her parça (column or expression, prefix length, collation) üçlüsünden, yani kolon veya ifade, önek uzunluğu ve karşılaştırma kuralından oluşur.
- Önek uzunluğu önemlidir:
UNIQUE(email(10)),UNIQUE(email)indeksinin kabul ettiği adresleri reddeder. - Karşılaştırma kuralı önemlidir: Büyük/küçük harf duyarsız bir hedef karşılaştırma kuralı, ikili (binary) bir kaynak karşılaştırma kuralının ayrı tuttuğu satırları çakıştırır.
utf8mb4ikizine kopyalanan birutf8mb3kolon ise kaynaktaki gibi karşılaştırılır. - Yok Sayılan Farklar: Şema karşılaştırmasında indeks adı, kolon adlarındaki büyük/küçük harf farkları, bileşik indeks parçalarının sırası ve
DESCyönü dikkate alınmaz. - Fonksiyonel benzersiz indeksler, yalnızca ifade kaynaktaki bir ifadeyle birebir eşleştiğinde ve hiçbir kolonun karakter seti veya karşılaştırma kuralı farklı olmadığında kontrolden geçer.
Çözüm: Hedefteki benzersiz indeksi kaldırın veya kaynağa eşdeğer bir indeks ekleyin.
Karakter Seti ve Karşılaştırma Kuralı
| Durum | Sonuç |
|---|---|
Anahtar dışı bir kolonda karakter seti farkı, verification: count veya none | Engelleyici |
Anahtar dışı bir kolonda karakter seti farkı, verification: sha256 | Uyarı |
| Hedefteki bir benzersiz indeksin kolonunda karşılaştırma kuralı farkı | Kolon bir utf8mb4 ikizi değilse engelleyici |
| Anahtar dışındaki diğer kolonlarda karşılaştırma kuralı farkı | Uyarı |
| Bir anahtar kolonunda karakter seti veya karşılaştırma kuralı farkı | DEST_KEY_IDENTITY_CHECK |
| Taraflardan birinin karakter setinin desteklenmemesi | Daha önce çalışan COLUMN_CHARSET_CHECK |
Karakter seti değişikliği metni sessizce başka karakterlere dönüştürebilir (transliteration) veya kısaltabilir. Sayım doğrulaması (count) hangi anahtarların hedefe ulaştığını kanıtlar, değerleri karşılaştırmaz; bu nedenle bu değişikliği göremez. sha256 ise değişikliği görür ve herhangi bir silme yapılmadan önce yığını başarısız sayar.
DEST_INSERT_TRIGGER_VISIBILITY_CHECK
Hedef hesabının bir görev tablosunun tetikleyicilerini (trigger) görebildiği kanıtlanamıyor. Bir tablo üzerinde TRIGGER yetkisi olmayan bir hesap boş bir tetikleyici listesi görür. Bu nedenle boş liste, tetikleyici olmadığı anlamına gelmez ve DEST_INSERT_TRIGGER_CHECK sonucuna güvenilemez. Mesaj her tabloyu durumuyla birlikte belirtir.
Çözüm: TRIGGER yetkisini hesaba şema veya tablo kapsamında doğrudan verin (Kullanıcı Yetkileri
). Bir rol üzerinden verilen TRIGGER yetkisi unconfirmed olarak kalır. --force-triggers bu kontrole uygulanmaz.
DEST_INSERT_TRIGGER_CHECK
Bir hedef tabloda INSERT tetikleyicisi var. Bu tetikleyici, kopyalanan satırları doğrulama onları okumadan önce değiştirir.
Çözüm: Hedefteki INSERT tetikleyicilerini kaldırın. --force-triggers bu kontrole uygulanmaz.
