programing

선언에 DEASTIC, NO SQL 또는 READS SQL 데이터가 포함되어 있으며 이진 로그가 활성화되어 있습니다.

newsource 2022. 11. 27. 21:18

선언에 DEASTIC, NO SQL 또는 READS SQL 데이터가 포함되어 있으며 이진 로그가 활성화되어 있습니다.

mysql에서 데이터베이스 Import 중 다음 오류가 발생하였습니다.

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)

어떤 것을 바꿔야 할지 모르겠어요.이 문제를 해결하는 방법을 도와줄 사람 있나요?

이 문제를 해결하려면 다음 두 가지 방법이 있습니다.

  1. MySQL 콘솔에서 다음 작업을 수행합니다.

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. mysql.ini 컨피규레이션파일에 다음 항목을 추가합니다.

    log_bin_trust_function_creators = 1;

이 설정은 비결정론적 함수에 대한 검사를 완화합니다.비결정론적 함수는 데이터를 수정하는 함수입니다(즉, 문을 업데이트, 삽입 또는 삭제하는 함수).상세한 것에 대하여는, 여기를 참조해 주세요.

이진 로그가 활성화되지 않은 경우 이 설정은 적용되지 않습니다.

저장된 프로그램의 바이너리 로깅

이진 로깅을 사용하도록 설정하지 않으면 log_bin_trust_function_creators가 적용되지 않습니다.

log_bin_trust_function_module

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

최선의 접근법은 저장된 함수에 대한 결정론적 선언을 더 잘 이해하고 사용하는 것이다.이러한 선언은 MySQL에서 복제를 최적화하기 위해 사용되므로 정상적인 복제를 위해 신중하게 선택하는 것이 좋습니다.

결정론적 루틴은 항상 동일한 입력 매개변수에 대해 동일한 결과를 생성하는 경우 "결정론적"으로 간주되며, 그렇지 않은 경우에는 결정론적(deterministic)이 아니다.이것은 주로 문자열 또는 산술 처리에서 사용되지만 이에 국한되지는 않습니다.

"결정론"과 반대되는 결정론 없음. "일상 정의에서 결정론 또는 결정론 중 어느 것도 제공되지 않는 경우 기본값은 결정론이 아닙니다. 함수가 결정론적임을 선언하려면 DEASTIC을 명시적으로 지정해야 합니다.따라서 문이 생성되지 않으면 MySQL은 함수를 "NOT DESTINISTIC"으로 취급할 것으로 보입니다.매뉴얼의 이 문장은 매뉴얼의 다른 영역에 있는 다른 문장과 모순됩니다.이 문장은 다음과 같이 기술되어 있습니다.저장된 함수를 만들 결정론적이거나 데이터를 수정하지 않음을 선언해야 합니다. 그렇지 않으면 데이터 복구 또는 복제에 안전하지 않을 수 있습니다. 기본적으로 CREATE FUNTION 문을 허용하려면 DEASTIC, NO SQL 또는 READS SQL DATA 중 하나 이상을 명시적으로 지정해야 합니다. 그렇지 않으면 오류가 발생합니다.

선언이 없는 경우 MySQL 5.5에서 오류가 발생하므로 다른 선언에 관계없이 항상 "DEFOMITINISTIC", "NOT DESTINISTIC", "NOT DESTINISTIC", "NO SQL" 또는 "READS SQL DATA" 중 하나 이상의 선언을 넣었습니다.

SQL 데이터 읽기 이 기능은 데이터베이스에서 데이터만 읽도록 MySQL에 명시적으로 알립니다. 따라서 이 함수는 데이터를 수정하는 명령을 포함하지 않지만 데이터를 읽는 SQL 명령(예: q. SELECT)을 포함합니다.

SQL 데이터 수정 루틴에 데이터를 쓸 수 있는 문(예: UPDATE, INSERT, DELETE 또는 ALTER 명령)이 포함되어 있음을 나타냅니다.

[NO SQL] : 루틴에 SQL 문이 없습니다.

SQL 포함 루틴에 SQL 명령이 포함되어 있지만 데이터를 읽거나 쓰는 문은 포함되어 있지 않음을 나타냅니다.이러한 특성을 명시적으로 지정하지 않으면 이 값이 기본값이 됩니다.이러한 문의 예로는 SELECT NOW(), SELECT 10+@b, SET @x = 1 또는 DO RELEASE_LOCK('abc')가 있으며, 실행은 하지만 데이터를 읽거나 쓰지는 않습니다.

NOW()나 UUID()와 같이 결정론적 안전성이 없는 MySQL 함수가 있으며, 이러한 명령어를 포함하는 사용자 함수는 NOT DEASTICIC으로 선언해야 합니다.또한 복제되지 않은 스키마에서 데이터를 읽는 함수는 분명히 NONERMINISTIC입니다.*

루틴의 성질에 대한 평가는 창작자의 "성실성"에 기초합니다.MySQL은 DESTINISTIC으로 선언된 루틴에 비결정론적 결과를 생성하는 문이 없는지 확인하지 않습니다.그러나 루틴을 잘못 위반하면 결과나 성능에 영향을 줄 수 있습니다.비결정론적 루틴을 DESTINISTIC으로 선언하면 옵티마이저가 실행 계획을 잘못 선택하게 되어 예기치 않은 결과가 발생할 수 있습니다.결정론적 루틴을 NONDEMINISTIC으로 선언하면 사용 가능한 최적화가 사용되지 않아 성능이 저하될 수 있습니다.

  • 저장된 함수를 생성할 때는 결정론적 함수인지 또는 데이터를 수정하지 않음을 선언해야 합니다.그렇지 않으면 데이터 복구 또는 복제에 안전하지 않을 수 있습니다.

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

이 문제를 해결하려면 반환 후 및 시작 전 문장을 다음 행 추가합니다.

READS SQL DATA
DETERMINISTIC

예:

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

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

ubuntu에서 다음 명령을 사용합니다.

mysql -u root -p

mysql server error를 입력하고 mysql에서 다음 명령을 수행합니다.

SET GLOBAL log_bin_trust_function_creators = 1;

함수가 결정론적인 경우에는 결정론적인 함수로 선언해도 무방합니다."DEFINITIC" 키워드의 위치는 다음과 같습니다.

여기에 이미지 설명 입력

도날드의 코멘트에 따라:

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

내가 해야 할 일은 다음과 같았다.

  1. my.cnf(#log_bin)에서 log_bin을 비활성화했습니다.
  2. restart mysql
  3. DB 가져오기
  4. 이네이블 log_bin
  5. restart mysql

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

(그러면 프로그래머 코드를 검토하여 개선을 제안합니다.)

Windows 10 에서는,

저는 이 문제를 다음과 같이 해결했습니다.

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

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

MySQL 구성 자동 읽기 위치conf.d그리고.mysql.conf.d디렉토리로 이동합니다.작성하다custom.cnf전화번호부에/etc/mysql/conf.d/다음 설정을 추가합니다.

[mysqld]
log_bin_trust_function_creators=1

파일을 만들고 저장하려면 루트 사용자 권한이 필요합니다.그런 다음 MySQL 서버를 재시작합니다.

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

그래서 대신

CREATE FUNCTION get_pet_owner

당신은 다음과 같은 것을 쓸 것이다.

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

이는 사용자 prodacmin이 기능/구조 작성 권한을 가지고 있다면 작동해야 합니다.

내 경우 MySQL Workbench를 통해 생성되었을 때는 기능이 작동했지만 SQL 스크립트로 직접 실행되었을 때는 작동하지 않았습니다.위의 변경으로 문제가 해결되었습니다.

언급URL : https://stackoverflow.com/questions/26015160/deterministic-no-sql-or-reads-sql-data-in-its-declaration-and-binary-logging-i