Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

DETERMINISTIK, TANPA SQL, atau BACA DATA SQL dalam deklarasinya dan pencatatan biner diaktifkan

Ada dua cara untuk memperbaikinya:

  1. Jalankan yang berikut ini 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 untuk fungsi non-deterministik. Fungsi non-deterministik adalah fungsi yang memodifikasi data (yaitu memiliki pernyataan pembaruan, penyisipan, atau penghapusan). Untuk info lebih lanjut, lihat di sini .

Harap dicatat, jika logging biner TIDAK diaktifkan, pengaturan ini tidak berlaku.

Logging Biner untuk Program Tersimpan

log_bin_trust_function_creators

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 memiliki replikasi yang sehat.

DETERMINISTIK Rutin dianggap “deterministik” jika selalu menghasilkan hasil yang sama untuk parameter input yang sama dan TIDAK DETERMINISTIK sebaliknya. Rutin ini sebagian besar digunakan dengan pemrosesan string atau matematika, tetapi tidak terbatas pada itu.

TIDAK MENENTUKAN Berlawanan dengan "DETERMINISTIC"."Jika DETERMINISTIS maupun NOT DETERMINISTIK tidak diberikan dalam definisi rutin, defaultnya adalah NOT DETERMINISTIC. Untuk mendeklarasikan bahwa suatu fungsi bersifat deterministik, Anda harus menentukan DETERMINISTIK secara eksplisit. ".Jadi sepertinya jika tidak ada pernyataan yang dibuat, MySQl akan memperlakukan fungsinya sebagai "TIDAK MENENTUKAN". Pernyataan dari manual ini bertentangan dengan pernyataan lain dari area manual lain yang mengatakan bahwa:" Saat Anda membuat menyimpan fungsi, Anda harus mendeklarasikan apakah itu deterministik atau tidak mengubah data. Jika tidak, mungkin tidak aman untuk pemulihan atau replikasi data. Secara default, agar pernyataan CREATE FUNCTION dapat diterima, setidaknya salah satu DETERMINISTIC, NO SQL, atau READS SQL DATA harus ditentukan secara eksplisit. Jika tidak, terjadi kesalahan "

Saya pribadi mendapatkan 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.

BACA DATA SQL Ini secara eksplisit memberitahu MySQL bahwa fungsi HANYA akan membaca data dari database, sehingga tidak berisi instruksi yang mengubah data, tetapi berisi instruksi SQL yang membaca data (misalnya SELECT).

MEMODIFIKASI DATA SQL Ini menunjukkan bahwa rutin berisi pernyataan yang dapat menulis data (misalnya, berisi instruksi UPDATE, INSERT, DELETE atau ALTER).

TIDAK ADA SQL Ini menunjukkan bahwa rutin tidak berisi pernyataan SQL.

BERISI SQL Ini menunjukkan bahwa rutin berisi instruksi SQL, tetapi tidak berisi pernyataan yang membaca atau menulis data. Ini adalah default jika tidak ada karakteristik ini yang diberikan secara eksplisit. Contoh pernyataan tersebut adalah SELECT NOW(), SELECT [email protected] , SET @x =1 atau DO RELEASE_LOCK('abc'), yang mengeksekusi tetapi tidak membaca atau menulis data.

Perhatikan bahwa ada fungsi MySQL yang tidak deterministik aman, seperti:SEKARANG(), UUID(), dll, yang cenderung menghasilkan hasil yang berbeda pada mesin yang berbeda, sehingga fungsi pengguna yang berisi instruksi tersebut harus dideklarasikan sebagai NOT DETERMINISTIC .Juga, fungsi yang membaca data dari skema yang tidak direplikasi jelas NONDETERMINISTIC.*



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Terjadi masalah saat membuat kueri MySQL di Symfony yang berisi JOIN dan RAND()

  2. Bagaimana menemukan semua string huruf besar dalam tabel MySQL?

  3. apa itu java.io.EOFException, Pesan:Tidak dapat membaca respons dari server. Diharapkan untuk membaca 4 byte, membaca 0 byte

  4. Temukan datetime terdekat dengan datetime yang ditentukan dalam kueri mysql

  5. MySQL memilih baris acak dengan GABUNG dari dua tabel