DETERMINISTIC, NO SQL 또는 READS SQL DATA의 선언 및 이진 로깅이 활성화 됨


107

mysql에서 데이터베이스를 가져 오는 동안 다음 오류가 발생했습니다.

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)

어떤 것을 변경해야하는지 모르겠습니다. 아무도 이것을 해결하는 방법을 도울 수 있습니까?

답변:


236

이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. MySQL 콘솔에서 다음을 실행합니다.

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 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으로 선언하면 사용 가능한 최적화가 사용되지 않도록하여 성능이 저하 될 수 있습니다.


배경에서 일어난 일을 설명해 주시겠습니까?
ASR

2
데이터베이스에 데이터를 수정하는 기능이 있다고 생각합니다 (업데이트, 삽입 또는 삭제 문이 있음). 자세한 내용은 여기를 참조하십시오 : dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Donal

1
항상 백업을해야합니다
Donal

그것은 슈퍼 권한이 필요합니다!
Felipe Morales

이것을 시도했지만 여전히 비 결정적 문제, 다른 제안이 있습니까? 감사
에드윈 베르 메조

40
  • 저장 함수를 만들 때 결정적이거나 데이터를 수정하지 않음을 선언해야합니다. 그렇지 않으면 데이터 복구 또는 복제에 안전하지 않을 수 있습니다.

  • 기본적으로 CREATE FUNCTION 문을 승인하려면 DETERMINISTIC, NO SQL 또는 READS SQL DATA 중 하나 이상을 명시 적으로 지정해야합니다. 그렇지 않으면 오류가 발생합니다.

이 문제를 해결하려면 After Return 및 Before Begin 문을 추가합니다.

READS SQL DATA
DETERMINISTIC

예 :

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

이 문제에 대한 자세한 내용은 여기를 참조하십시오.


설정 READS SQL DATA이 세 가지 중 가장 제한적 이기 때문에 작동합니다 . 함수가 NO SQL또는 DETERMINISTIC범주에 속하는 경우 함수 를 수정하여 성능을 향상시킬 수 있습니다. 반면 설정 READS SQL DATA은 오류가 가장 적습니다. 따라서 잘못 사용 NO SQL하거나 DETERMINISTIC잘못된 결과를 얻을 수 있습니다.
Jonathan

@ SunnyS.M, READS SQL DATA DETERMINISTIC과 같은 멋진 설명.이 문제를 해결하려면 After Return 및 Before Begin 문을 추가합니다.
Md Haidar Ali Khan

4

Donald의 의견에 따라 :

이 변수는 바이너리 로깅이 활성화 된 경우에 적용됩니다.

내가해야 할 일은 :

  1. my.cnf (#log_bin)에서 log_bin 비활성화
  2. mysql 다시 시작
  3. 수입 DB
  4. log_bin 활성화
  5. mysql 다시 시작

그것은 수입 문제를 해결합니다.

(그런 다음 프로그래머의 코드를 검토하여 개선 사항을 제안합니다)


3

함수가 결정적이면 결정적이라고 선언해도 안전합니다. "DETERMINISTIC"키워드의 위치는 다음과 같습니다.

여기에 이미지 설명 입력


2

Windows 10에서는

다음을 수행하여이 문제를 해결했습니다.

  1. my.ini로 이동하여 [mysqld] 아래에이 두 줄을 추가합니다 .

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. MySQL 서비스 다시 시작


이 작업을 수행 한 후 노예에 오류가 발생했습니다.Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Ramratan Gupta

0

함수에 대한 정의자를 설정해보십시오!

그래서 대신

CREATE FUNCTION get_pet_owner

당신은 비슷한 것을 쓸 것입니다

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

사용자 prodacmin 이 기능 / 절차를 생성 할 권한이있는 경우 작동해야 합니다.

필자의 경우 함수는 MySQL Workbench를 통해 생성 될 때 작동했지만 SQL 스크립트로 직접 실행할 때는 작동하지 않았습니다. 위의 변경으로 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.