이 문제를 해결하는 방법에는 두 가지가 있습니다.
MySQL 콘솔에서 다음을 실행합니다.
SET GLOBAL log_bin_trust_function_creators = 1;
mysql.ini 구성 파일에 다음을 추가합니다.
log_bin_trust_function_creators = 1;
이 설정은 비 결정적 기능에 대한 검사를 완화합니다. 비 결정적 함수는 데이터를 수정하는 함수입니다 (예 : update, insert 또는 delete 문 포함). 자세한 내용은 여기를 참조 하십시오 .
바이너리 로깅이 활성화되지 않은 경우이 설정은 적용되지 않습니다.
저장된 프로그램의 이진 로깅
바이너리 로깅이 활성화되지 않은 경우 log_bin_trust_function_creators가 적용되지 않습니다.
log_bin_trust_function_creators
이 변수는 바이너리 로깅이 활성화 된 경우에 적용됩니다.
가장 좋은 방법은 저장된 함수에 대한 결정적 선언을 더 잘 이해하고 사용하는 것입니다. 이러한 선언은 MySQL에서 복제를 최적화하는 데 사용되며 정상적인 복제를 위해 신중하게 선택하는 것이 좋습니다.
DETERMINISTIC
항상 그렇지 않으면 같은 입력 매개 변수 및 NOT DETERMINISTIC에 대해 동일한 결과를 생성 경우 루틴은 "결정"으로 간주됩니다. 이것은 주로 문자열 또는 수학 처리에 사용되지만 이에 국한되지는 않습니다.
NOT DETERMINISTIC
"DETERMINISTIC"의 반대입니다. " 루틴 정의에 DETERMINISTIC도 NOT DETERMINISTIC도 지정되지 않은 경우 기본값은 NOT DETERMINISTIC입니다. 함수가 결정적임을 선언하려면 명시 적으로 DETERMINISTIC을 지정해야합니다. ". 따라서 어떤 문장도 만들어지지 않으면 MySQl은 함수를 "NOT DETERMINISTIC"으로 취급합니다. 매뉴얼의이 진술은 다음과 같은 매뉴얼의 다른 영역의 다른 진술과 모순됩니다. "저장 함수를 만들 때 결정적이거나 데이터를 수정하지 않음을 선언해야합니다. 그렇지 않으면 데이터 복구 또는 복제에 안전하지 않을 수 있습니다. 기본적으로 CREATE FUNCTION 문을 승인하려면 DETERMINISTIC, NO SQL 또는 READS SQL DATA 중 하나 이상을 명시 적으로 지정해야합니다. 그렇지 않으면 오류가 발생합니다. "
선언이 없으면 개인적으로 MySQL 5.5에서 오류가 발생했습니다. 따라서 다른 선언에 관계없이 항상 "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL"또는 "READS SQL DATA"중 하나 이상의 선언을 넣습니다.
READS SQL DATA
이것은 함수가 데이터베이스에서 데이터 만 읽을 것임을 명시 적으로 MySQL에 알려줍니다. 따라서 데이터를 수정하는 명령어는 포함하지 않지만 데이터를 읽는 SQL 명령어는 포함합니다 (eq SELECT).
MODIFIES SQL DATA
이것은 루틴에 데이터를 쓸 수있는 명령문이 포함되어 있음을 나타냅니다 (예 : UPDATE, INSERT, DELETE 또는 ALTER 명령 포함).
NO SQL
루틴에 SQL 문이 없음을 나타냅니다.
CONTAINS SQL
이것은 루틴에 SQL 명령어가 포함되어 있지만 데이터를 읽거나 쓰는 명령문은 포함되어 있지 않음을 나타냅니다. 이러한 특성이 명시 적으로 지정되지 않은 경우 이것이 기본값입니다. 이러한 명령문의 예는 SELECT NOW (), SELECT 10 + @ b, SET @x = 1 또는 DO RELEASE_LOCK ( 'abc')이며 실행되지만 데이터를 읽거나 쓰지 않습니다.
NOW (), UUID () 등과 같이 결정적으로 안전하지 않은 MySQL 함수가 있습니다.이 함수는 다른 컴퓨터에서 다른 결과를 생성 할 가능성이 있으므로 이러한 명령어를 포함하는 사용자 함수는 NOT DETERMINISTIC으로 선언해야합니다. . 또한 복제되지 않은 스키마에서 데이터를 읽는 함수는 분명히 NONDETERMINISTIC입니다. *
루틴의 특성에 대한 평가는 작성자의 "정직"을 기반으로합니다. MySQL은 DETERMINISTIC으로 선언 된 루틴에 비 결정적 결과를 생성하는 문이 없는지 확인하지 않습니다. 그러나 루틴을 잘못 선언하면 결과에 영향을 미치거나 성능에 영향을 미칠 수 있습니다. 비 결정적 루틴을 DETERMINISTIC으로 선언하면 옵티마이 저가 잘못된 실행 계획을 선택하게되어 예기치 않은 결과가 발생할 수 있습니다. 결정적 루틴을 NONDETERMINISTIC으로 선언하면 사용 가능한 최적화가 사용되지 않도록하여 성능이 저하 될 수 있습니다.