Bunu düzeltmenin iki yolu vardır:
MySQL konsolunda aşağıdakileri yürütün:
SET GLOBAL log_bin_trust_function_creators = 1;
Aşağıdakileri mysql.ini yapılandırma dosyasına ekleyin:
log_bin_trust_function_creators = 1;
Ayar, deterministik olmayan fonksiyonların kontrolünü rahatlatır. Belirleyici olmayan işlevler, verileri değiştiren işlevlerdir (örn. Güncelleme, ekleme veya silme ifadeleri). Daha fazla bilgi için buraya bakın .
İkili günlük kaydı ETKİN DEĞİLSE, bu ayarın geçerli olmadığını lütfen unutmayın.
Depolanan Programların İkili Günlüğü
İkili günlük kaydı etkinleştirilmezse, log_bin_trust_function_creators uygulanmaz.
log_bin_trust_function_creators
Bu değişken, ikili günlük kaydı etkinleştirildiğinde geçerlidir.
En iyi yaklaşım, depolanan işlevler için deterministik bildirimlerin daha iyi anlaşılması ve kullanılmasıdır. Bu bildirimler MySQL tarafından çoğaltmayı optimize etmek için kullanılır ve sağlıklı bir çoğaltmaya sahip olmak için bunları dikkatlice seçmek iyi bir şeydir.
BELİRLEYİCİ
Bir rutin, aynı girdi parametreleri için her zaman aynı sonucu üretiyorsa ve aksi takdirde BELİRLİ DEĞİLSE "deterministik" olarak kabul edilir. Bu çoğunlukla dizi veya matematik işlemede kullanılır, ancak bununla sınırlı değildir.
BELİRLEYİCİ DEĞİL
"BELİRLEYİCİ" nin Tersi " Rutin tanımda ne DETERMINISTIC ne de DETERMINISTIC belirtilmemişse, varsayılan BELİRLEYİCİ DEĞİLDİR. Bir fonksiyonun deterministik olduğunu bildirmek için, BELİRLEYİCİ'yi açıkça belirtmelisiniz. " Öyle görünüyor ki, herhangi bir açıklama yapılmazsa, MySQl işlevi "BELİRLEYİCİ DEĞİL" olarak değerlendirecektir. Kılavuzdaki bu ifade, kılavuzun başka bir alanındaki diğer ifadelerle çelişmektedir ve şunu söyler: "Depolanan bir işlev oluşturduğunuzda, bunun deterministik olduğunu veya verileri değiştirmediğini beyan etmeniz gerekir. Aksi takdirde, veri kurtarma veya çoğaltma için güvenli olmayabilir. Varsayılan olarak, bir CREATE FUNCTION ifadesinin kabul edilmesi için, DETERMINISTIC, NO SQL veya READS SQL DATA'dan en az birinin açıkça belirtilmesi gerekir. Aksi takdirde bir hata oluşur "
Herhangi bir bildirim yoksa kişisel olarak MySQL 5.5'te hata aldım, bu yüzden sahip olabileceğim diğer bildirimler ne olursa olsun her zaman en az bir "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" veya "READS SQL DATA" bildirimi koyarım.
SQL VERİLERİNİ OKUYOR
Bu, MySQL'e fonksiyonun YALNIZCA veritabanlarından veri okuyacağını, dolayısıyla verileri değiştiren komutlar içermediğini, ancak verileri okuyan SQL komutlarını (eq SELECT) içerdiğini açıkça söyler.
MODIFIES SQL DATA
Bu, rutinin veri yazabilen ifadeler içerdiğini gösterir (örneğin, UPDATE, INSERT, DELETE veya ALTER komutları içerir).
NO SQL
Bu, rutinin hiçbir SQL ifadesi içermediğini gösterir.
CONTAINS SQL
Bu, rutinin SQL komutları içerdiğini ancak veri okuyan veya yazan ifadeler içermediğini gösterir. Bu özelliklerden hiçbiri açıkça belirtilmemişse bu varsayılandır. Bu tür ifadelere örnek olarak SELECT NOW (), SELECT 10 + @ b, SET @x = 1 veya DO RELEASE_LOCK ('abc') verilebilir, bunlar çalıştırılır, ancak ne veri okunur ne de yazılır.
Farklı makinelerde farklı sonuçlar üretmesi muhtemel olan NOW (), UUID (), vb. Gibi deterministik güvenli olmayan MySQL fonksiyonları vardır, bu nedenle bu tür talimatları içeren bir kullanıcı fonksiyonunun BELİRLİ DEĞİL olarak bildirilmesi gerekir. . Ayrıca, kopyalanmamış bir şemadan veri okuyan bir işlev açıkça BELİRSİZDİR. *
Bir rutinin doğasının değerlendirilmesi, yaratıcının "dürüstlüğüne" dayanır: MySQL, ilan edilmiş bir DETERMINISTIC rutininin belirleyici olmayan sonuçlar üreten ifadelerden muaf olup olmadığını kontrol etmez. Ancak, bir rutinin yanlış beyan edilmesi sonuçları etkileyebilir veya performansı etkileyebilir. Belirsiz bir rutinin BELİRLEYİCİ olarak bildirilmesi, optimize edicinin yanlış yürütme planı seçimleri yapmasına neden olarak beklenmedik sonuçlara yol açabilir. Belirleyici bir rutini NONDETERMINISTIC olarak ilan etmek, mevcut optimizasyonların kullanılmamasına neden olarak performansı düşürebilir.