Có hai cách để khắc phục điều này:
-
Thực thi những điều sau trong bảng điều khiển MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
-
Thêm phần sau vào tệp cấu hình mysql.ini:
log_bin_trust_function_creators = 1;
Cài đặt này giúp giảm bớt việc kiểm tra các hàm không xác định. Các hàm không xác định là các hàm sửa đổi dữ liệu (tức là có (các) câu lệnh cập nhật, chèn hoặc xóa). Để biết thêm thông tin, hãy xem tại đây .
Xin lưu ý, nếu ghi nhật ký nhị phân KHÔNG được bật, cài đặt này không áp dụng.
Ghi nhật ký nhị phân của các chương trình đã lưu trữ
log_bin_trust_ Chức năng_creators
Cách tiếp cận tốt nhất là hiểu rõ hơn và sử dụng các khai báo xác định cho các hàm được lưu trữ. Các khai báo này được sử dụng bởi MySQL để tối ưu hóa việc sao chép và tốt hơn hết là bạn nên chọn chúng cẩn thận để có một bản sao lành mạnh.
XÁC ĐỊNH Một quy trình được coi là "xác định" nếu nó luôn tạo ra cùng một kết quả cho cùng một tham số đầu vào và KHÔNG XÁC ĐỊNH nếu không.
KHÔNG XÁC ĐỊNH Đối lập với "DETERMINISTIC". " Nếu không đưa ra DETERMINISTIC hoặc NOT DETERMINISTIC trong định nghĩa thông thường, thì mặc định là NOT DETERMINISTIC. Để khai báo rằng một hàm là xác định, bạn phải chỉ định DETERMINISTIC một cách rõ ràng. ". Vì vậy, có vẻ như nếu không có câu lệnh nào được thực hiện, MySQl sẽ coi hàm là" KHÔNG ĐƯỢC XÁC ĐỊNH ". Câu lệnh này từ thủ công trái ngược với câu lệnh khác từ một khu vực thủ công khác cho biết rằng:" Khi bạn tạo một hàm được lưu trữ, bạn phải khai báo rằng nó là xác định hoặc nó không sửa đổi dữ liệu. Nếu không, nó có thể không an toàn cho việc khôi phục hoặc sao chép dữ liệu. Theo mặc định, để câu lệnh CREATE FUNCTION được chấp nhận, ít nhất một trong các DỮ LIỆU SQL DETERMINISTIC, NO SQL hoặc READS phải được chỉ định rõ ràng. Nếu không sẽ xảy ra lỗi "
Cá nhân tôi đã gặp lỗi trong MySQL 5.5 nếu không có khai báo, vì vậy tôi luôn đặt ít nhất một khai báo "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" hoặc "READS SQL DATA" bất kể các khai báo khác mà tôi có thể có.
ĐỌC DỮ LIỆU SQL Điều này nói rõ ràng với MySQL rằng hàm sẽ CHỈ đọc dữ liệu từ cơ sở dữ liệu, do đó, nó không chứa các lệnh sửa đổi dữ liệu, nhưng nó chứa các lệnh SQL đọc dữ liệu (e.q. SELECT).
CHẾ ĐỘ DỮ LIỆU SQL Điều này chỉ ra rằng quy trình chứa các câu lệnh có thể ghi dữ liệu (ví dụ:nó chứa các lệnh UPDATE, INSERT, DELETE hoặc ALTER).
KHÔNG SQL Điều này chỉ ra rằng quy trình không chứa câu lệnh SQL.
CHỨA SQL Điều này chỉ ra rằng quy trình chứa các lệnh SQL, nhưng không chứa các câu lệnh đọc hoặc ghi dữ liệu. Đây là mặc định nếu không có đặc điểm nào trong số này được đưa ra rõ ràng. Ví dụ về các câu lệnh như vậy là CHỌN NGAY BÂY GIỜ (), CHỌN [email protected] , SET @x =1 hoặc DO RELEASE_LOCK ('abc'), thực thi nhưng không đọc hoặc ghi dữ liệu.
Lưu ý rằng có các hàm MySQL không an toàn xác định, chẳng hạn như:NOW (), UUID (), v.v., có khả năng tạo ra các kết quả khác nhau trên các máy khác nhau, vì vậy hàm người dùng có chứa các hướng dẫn như vậy phải được khai báo là KHÔNG XÁC ĐỊNH .Ngoài ra, một hàm đọc dữ liệu từ một lược đồ không được giải thích rõ ràng là KHÔNG CHỨNG MINH. *