Kaynak Yapısı ve Anahtar Kontrolleri
Kaynak şema ve anahtar denetimleri: Tablo varlığı, depolama motoru, karakter setleri ve birincil anahtar kısıtları.
TABLE_EXISTENCE_CHECK
Her görev tablosu kaynak şemada temel tablo (base table) olarak bulunmalıdır. Bir görünüm (view) veya başka bir nesne reddedilir ve türüyle birlikte belirtilir; örneğin orders(VIEW). Hesabın kaynak şema üzerinde hiçbir yetkisi yoksa şema bu hesaba görünmez. Bu durumda SOURCE_SELECT_PERMISSION_CHECK yerine bu kontrol başarısız olur.
Çözüm: Tablo adını düzeltin veya source.database ayarını doğru şemaya yönlendirin. Görünüm yerine görünümün dayandığı tabloyu arşivleyin. Tablo adlarını küçük harfle saklayan bir sunucuda görevin tablo adlarını da küçük harfle yazın.
STORAGE_ENGINE_CHECK
Kaynaktaki her görev tablosu InnoDB olmalıdır. Depolama motoru NULL olarak bildirilen bir temel tablo (genellikle bozulmuş veya motoru bilinmeyen bir tablo) <table>(<unknown>) olarak reddedilir.
Çözüm: ALTER TABLE <table> ENGINE=InnoDB;
COLUMN_CHARSET_CHECK
Çalıştırmanın metin olarak okuduğu veya yazdığı bir görev kolonu, utf8mb4 oturumundan birebir korunarak geçemeyen bir karakter seti kullanıyor. Böyle bir karakter setinde iki karakter tek karakter olarak okunabilir ya da bir karakter ? olarak okunur. Bu durumda iki anahtar birleşir ve metin değişmiş olarak geri yazılır; üstelik tüm doğrulamalar başarılı görünür. Kontrol, herhangi bir satır okunmadan önce çalışır:
COLUMN_CHARSET_CHECK: A job column uses a character set that GoArchive cannot read and write back
exactly through its utf8mb4 session, so keys could merge and text change without notice (tables:
[children.code(cp932) destination:notes.body(sjis)])
| Görev Türü | Kontrol Edilen Kolonlar |
|---|---|
archive, copy-only | Kaynaktaki her görev tablosunun tüm kolonları ve hedefteki aynı adlı her kolon |
purge | Kaynakta, her görev tablosunun birincil anahtar ve foreign_key kolonları |
ENUM ve SET kolonları kontrol edilir. Sayılar, zaman (temporal) tipleri, ikili (binary) metinler ve JSON bir karakter setine sahip olmadığı için kontrol edilmez. Kontrol, karşılaştırma kuralını (collation) değil karakter setini değerlendirir ve ön kontroller atlandığında da çalışır.
Çözüm: Kolonu her iki sunucuda da utf8mb4 karakter setine dönüştürün veya tabloyu görevin dışında bırakın. Desteklenen ve reddedilen karakter setleri Karakter Setleri
sayfasında listelenmiştir.
Birincil Anahtar Kontrolleri
GoArchive her tablonun birincil anahtarını (primary key) veritabanından okur ve tüm SQL sorgularını bu anahtardan oluşturur. Yapılandırmadaki primary_key ise anahtarı belgeler: Veritabanıyla karşılaştırılır, ancak hiçbir sorguya girmez.
PRIMARY_KEY_CHECK
Bir görev tablosunda PRIMARY KEY tanımlı değil; bu nedenle tablonun satırları tekil olarak adreslenemez.
Çözüm: Tabloya bir PRIMARY KEY ekleyin.
KEY_TYPE_UNSUPPORTED
Birincil anahtar kolonlarından biri, satırları tekil olarak tanımlayamayan bir tipte. İzin verilen anahtar tipleri:
- tam sayı (integer) tipleri ve
DECIMAL; - önek uzunluğu (prefix length) olmadan
CHAR,VARCHAR,BINARYveVARBINARY; DATE,DATETIME,TIMESTAMP,TIMEveYEAR.
FLOAT ve DOUBLE yaklaşık değer tutar, ENUM ve SET iç indekslerine göre sıralanır, BIT ise desteklenmez. Zaman tipindeki anahtar değerlerinin de geçerli olması gerekir (Sınırlar ve Kısıtlamalar
).
Çözüm: Başka bir kök tablo seçin veya tabloyu görevin dışında bırakın.
SQL sorguları anahtarlardan oluşturulduğu için PRIMARY_KEY_CHECK ve KEY_TYPE_UNSUPPORTED, ön kontroller atlandığında bile çalışır.
PK_COLUMN_CASE_CHECK
Yapılandırmadaki primary_key, anahtarın kolonlarını doğru adlandırıyor ancak büyük/küçük harf açısından farklı yazıyor; örneğin LOG_ID yerine log_id. Çözümü farklı olduğu için bu hata PK_COLUMN_CHECK kontrolünden önce bildirilir.
Çözüm: Her kolon adını veritabanındaki yazımıyla birebir aynı şekilde yazın.
PK_COLUMN_CHECK
Yapılandırmadaki primary_key, tablonun PRIMARY KEY tanımıyla eşleşmiyor: Bir kolon eksik, fazla veya anahtar sırasının dışında.
Çözüm: Tüm anahtar kolonlarını anahtar sırasıyla listeleyin. Bileşik anahtar (composite key) bir liste olarak yazılır: primary_key: [order_id, line_no].
RELATION_KEY_CHECK
Her foreign_key kolonu kendi tablosunda bulunmalı ve başvurduğu ebeveyn anahtar kolonuyla (references, konuma göre) uyumlu olmalıdır:
- işaretlilik (signedness) durumu aynı olan iki tam sayı tipi;
- iki
DECIMALtipi; - karakter seti ve karşılaştırma kuralı aynı olan iki karakter tipi;
BINARY(n)ileBINARY(n)veyaVARBINARYileVARBINARY;- kesirli hassasiyeti (fractional precision) aynı olan aynı zaman tipi.
NULL değer alabilen (nullable) bir foreign_key kolonuna izin verilir: Bu kolonda NULL bulunan bir alt kayıt hiçbir ebeveynle eşleşmez.
Çözüm: foreign_key veya references değerini düzeltin ya da kolon tiplerini uyumlu hale getirin.
