DETERMINISTIC, NO SQL, atau READS SQL DATA dalam deklarasi dan logging biner diaktifkan

107

Saat mengimpor database di mysql, saya mendapat kesalahan berikut:

1418 (HY000) at line 10185: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Saya tidak tahu hal mana yang perlu saya ubah. Adakah yang bisa membantu saya bagaimana menyelesaikan ini?

ASR
sumber

Jawaban:

237

Ada dua cara untuk memperbaikinya:

  1. Jalankan perintah berikut di konsol MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 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.

Donal
sumber
bisakah kamu menjelaskan padaku apa yang terjadi di latar belakang?
ASR
2
Saya menduga database memiliki fungsi yang mengubah data (memiliki pernyataan update, menyisipkan atau menghapus di dalamnya). Untuk info lebih lanjut, lihat di sini: dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Donal
1
Anda harus selalu membuat cadangan
Donal
itu membutuhkan hak istimewa super!
Felipe Morales
mencoba ini tetapi masih mendapat masalah non deterministik, ada saran lain? terima kasih
Edwin Bermejo
40
  • 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:

READS SQL DATA
DETERMINISTIC

Sebagai contoh :

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN

Untuk detail lebih lanjut tentang masalah ini silakan baca Di Sini

SM cerah
sumber
Ini berfungsi karena pengaturannya READS SQL DATApaling tidak ketat dari ketiganya. Jika fungsi Anda termasuk dalam NO SQLatau DETERMINISTICkategori, Anda dapat meningkatkan kinerja dengan memodifikasi fungsi Anda. Di sisi lain, pengaturan READS SQL DATAini juga paling rentan terhadap kesalahan. Jadi jika Anda salah menggunakan NO SQLatau DETERMINISTICAnda mungkin mendapatkan hasil yang salah.
Jonathan
@ SunnyS.M, Penjelasan luar biasa seperti BACA PENENTUAN DATA SQL. Untuk memperbaiki masalah ini tambahkan baris berikut pernyataan After Return dan Before Begin:
Md Haidar Ali Khan
4

mengikuti komentar Donald:

Variabel ini berlaku saat logging biner diaktifkan.

Yang harus saya lakukan adalah:

  1. nonaktifkan log_bin di my.cnf (#log_bin)
  2. restart mysql
  3. impor DB
  4. aktifkan log_bin
  5. restart mysql

Itu langkah mengatasi masalah impor itu.

(Kemudian saya akan meninjau kode programmer untuk menyarankan perbaikan)

Mayra Navarro
sumber
3

Jika fungsi Anda deterministik, Anda aman untuk mendeklarasikannya menjadi deterministik. Lokasi kata kunci "DETERMINISTIC" adalah sebagai berikut.

masukkan deskripsi gambar di sini

Park JongBum
sumber
2

Di Windows 10,

Saya baru saja menyelesaikan masalah ini dengan melakukan hal berikut.

  1. Goto my.ini dan tambahkan 2 baris ini di bawah [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
  2. restart layanan MySQL

Preetham
sumber
setelah melakukan ini, saya mendapat kesalahan pada budak -Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Ramratan Gupta
0

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_owner

yang 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.

DevKingKev
sumber