Ada dua cara untuk memperbaikinya:
Jalankan perintah berikut di konsol MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Tambahkan berikut ini ke file konfigurasi mysql.ini:
log_bin_trust_function_creators = 1;
Pengaturan melonggarkan pemeriksaan fungsi non-deterministik. Fungsi non-deterministik adalah fungsi yang mengubah data (yaitu memiliki pernyataan pembaruan, menyisipkan atau menghapus). Untuk info lebih lanjut, lihat di sini .
Harap dicatat, jika logging biner TIDAK diaktifkan, pengaturan ini tidak berlaku.
Pencatatan Biner Program Tersimpan
Jika logging biner tidak diaktifkan, log_bin_trust_function_creators tidak berlaku.
log_bin_trust_function_creators
Variabel ini berlaku saat logging biner diaktifkan.
Pendekatan terbaik adalah pemahaman yang lebih baik dan penggunaan deklarasi deterministik untuk fungsi yang disimpan. Deklarasi ini digunakan oleh MySQL untuk mengoptimalkan replikasi dan merupakan hal yang baik untuk memilihnya dengan hati-hati agar replikasi yang sehat.
DETERMINISTIC
Sebuah rutinitas dianggap “deterministik” jika selalu menghasilkan hasil yang sama untuk parameter input yang sama dan BUKAN DETERMINISTIK sebaliknya. Ini sebagian besar digunakan dengan string atau pemrosesan matematika, tetapi tidak terbatas pada itu.
NOT DETERMINISTIC
Berlawanan dengan "DETERMINISTIC". " Jika DETERMINISTIC atau NOT DETERMINISTIC tidak diberikan dalam definisi rutin, defaultnya adalah NOT DETERMINISTIC. Untuk menyatakan bahwa suatu fungsi bersifat deterministik, Anda harus menentukan DETERMINISTIC secara eksplisit. ". Jadi nampaknya jika tidak ada pernyataan yang dibuat, MySQl akan memperlakukan fungsi tersebut sebagai "NOT DETERMINISTIC". Pernyataan dari manual ini bertentangan dengan pernyataan lain dari area manual lain yang mengatakan bahwa: "Saat Anda membuat fungsi tersimpan, Anda harus menyatakan bahwa itu deterministik atau tidak mengubah data. Jika tidak, ini mungkin tidak aman untuk pemulihan atau replikasi data. Secara default, agar pernyataan CREATE FUNCTION diterima, setidaknya salah satu dari DETERMINISTIC, NO SQL, atau READS SQL DATA harus ditentukan secara eksplisit. Jika tidak, terjadi kesalahan "
Saya pribadi mendapat kesalahan di MySQL 5.5 jika tidak ada deklarasi, jadi saya selalu meletakkan setidaknya satu deklarasi "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" atau "READS SQL DATA" terlepas dari deklarasi lain yang mungkin saya miliki.
MEMBACA DATA SQL
Ini secara eksplisit memberitahu MySQL bahwa fungsi HANYA akan membaca data dari database, jadi, tidak berisi instruksi yang mengubah data, tetapi berisi instruksi SQL yang membaca data (eq SELECT).
MODIFIKASI DATA SQL
Ini menunjukkan bahwa rutinitas berisi pernyataan yang dapat menulis data (misalnya, berisi instruksi UPDATE, INSERT, DELETE atau ALTER).
NO SQL
Ini menunjukkan bahwa rutinitas tidak berisi pernyataan SQL.
BERISI SQL
Ini menunjukkan bahwa rutinitas berisi instruksi SQL, tetapi tidak berisi pernyataan yang membaca atau menulis data. Ini adalah default jika tidak ada dari karakteristik ini yang diberikan secara eksplisit. Contoh pernyataan tersebut adalah SELECT NOW (), SELECT 10 + @ b, SET @x = 1 or DO RELEASE_LOCK ('abc'), yang mengeksekusi tetapi tidak membaca atau menulis data.
Perhatikan bahwa ada fungsi MySQL yang tidak deterministik safe, seperti: NOW (), UUID (), dll, yang kemungkinan besar akan menghasilkan hasil yang berbeda pada mesin yang berbeda, sehingga fungsi pengguna yang berisi instruksi tersebut harus dinyatakan TIDAK MENENTUKAN . Selain itu, fungsi yang membaca data dari skema yang tidak direplikasi jelas-jelas NONDETERMINISTIC. *
Penilaian sifat rutinitas didasarkan pada "kejujuran" penciptanya: MySQL tidak memeriksa bahwa rutin yang dinyatakan DETERMINISTIC bebas dari pernyataan yang menghasilkan hasil nondeterministik. Namun, salah menyatakan rutinitas dapat memengaruhi hasil atau memengaruhi kinerja. Menyatakan rutinitas nondeterministik sebagai DETERMINISTIC dapat menyebabkan hasil yang tidak diharapkan karena menyebabkan pengoptimal membuat pilihan rencana eksekusi yang salah. Menyatakan rutinitas deterministik sebagai NONDETERMINISTIC dapat mengurangi kinerja dengan menyebabkan pengoptimalan yang tersedia tidak digunakan.
Saat Anda membuat fungsi tersimpan, Anda harus menyatakan bahwa itu deterministik atau tidak mengubah data. Jika tidak, ini mungkin tidak aman untuk pemulihan atau replikasi data.
Secara default, agar pernyataan CREATE FUNCTION diterima, setidaknya salah satu dari DETERMINISTIC, NO SQL, atau READS SQL DATA harus ditentukan secara eksplisit. Jika tidak, kesalahan terjadi:
Untuk memperbaiki masalah ini tambahkan baris berikut Setelah Kembali dan Pernyataan Sebelum Mulai:
Sebagai contoh :
Untuk detail lebih lanjut tentang masalah ini silakan baca Di Sini
sumber
READS SQL DATA
paling tidak ketat dari ketiganya. Jika fungsi Anda termasuk dalamNO SQL
atauDETERMINISTIC
kategori, Anda dapat meningkatkan kinerja dengan memodifikasi fungsi Anda. Di sisi lain, pengaturanREADS SQL DATA
ini juga paling rentan terhadap kesalahan. Jadi jika Anda salah menggunakanNO SQL
atauDETERMINISTIC
Anda mungkin mendapatkan hasil yang salah.mengikuti komentar Donald:
Yang harus saya lakukan adalah:
Itu langkah mengatasi masalah impor itu.
(Kemudian saya akan meninjau kode programmer untuk menyarankan perbaikan)
sumber
Jika fungsi Anda deterministik, Anda aman untuk mendeklarasikannya menjadi deterministik. Lokasi kata kunci "DETERMINISTIC" adalah sebagai berikut.
sumber
Di Windows 10,
Saya baru saja menyelesaikan masalah ini dengan melakukan hal berikut.
Goto my.ini dan tambahkan 2 baris ini di bawah [mysqld]
restart layanan MySQL
sumber
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Coba tetapkan definisi untuk fungsi tersebut!
Jadi, bukan
CREATE FUNCTION get_pet_owner
Anda akan menulis sesuatu yang mirip dengan
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_owneryang seharusnya berfungsi jika pengguna prodacmin memiliki hak untuk membuat fungsi / prosedur.
Dalam kasus saya, fungsi tersebut berfungsi ketika dihasilkan melalui MySQL Workbench tetapi tidak berfungsi ketika dijalankan secara langsung sebagai skrip SQL. Membuat perubahan di atas memperbaiki masalah.
sumber