DETERMINISTIC, NO SQL, o READS SQL DATA en su declaración y el registro binario está habilitado

107

Al importar la base de datos en mysql, tengo el siguiente error:

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)

No sé qué cosas necesito cambiar. ¿Alguien puede ayudarme a resolver esto?

ASR
fuente

Respuestas:

236

Hay dos formas de solucionar este problema:

  1. Ejecute lo siguiente en la consola MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Agregue lo siguiente al archivo de configuración mysql.ini:

    log_bin_trust_function_creators = 1;

El ajuste relaja la comprobación de funciones no deterministas. Las funciones no deterministas son funciones que modifican datos (es decir, actualizan, insertan o eliminan declaraciones). Para obtener más información, consulte aquí .

Tenga en cuenta que si el registro binario NO está habilitado, esta configuración no se aplica.

Registro binario de programas almacenados

Si el registro binario no está habilitado, log_bin_trust_function_creators no se aplica.

log_bin_trust_function_creators

Esta variable se aplica cuando el registro binario está habilitado.

El mejor enfoque es una mejor comprensión y uso de declaraciones deterministas para funciones almacenadas. MySQL utiliza estas declaraciones para optimizar la replicación y es bueno elegirlas con cuidado para tener una replicación saludable.

DETERMINISTICA Una rutina se considera "determinista" si siempre produce el mismo resultado para los mismos parámetros de entrada y NO DETERMINISTICA en caso contrario. Esto se usa principalmente con procesamiento matemático o de cadenas, pero no se limita a eso.

NO DETERMINISTICO Opuesto a "DETERMINISTICO". " Si no se da DETERMINISTIC ni NOT DETERMINISTIC en la definición de rutina, el valor predeterminado es NOT DETERMINISTIC. Para declarar que una función es determinista, debe especificar DETERMINISTIC explícitamente ". Así que parece que si no se hace ninguna declaración, MySQl tratará la función como "NO DETERMINISTICA". Esta declaración del manual está en contradicción con otra declaración de otra área del manual que dice que: "Cuando crea una función almacenada, debe declarar que es determinista o que no modifica datos. De lo contrario, puede que no sea seguro para la recuperación o replicación de datos. De forma predeterminada, para que se acepte una sentencia CREATE FUNCTION, se debe especificar explícitamente al menos uno de DETERMINISTIC, NO SQL o READS SQL DATA. De lo contrario, se produce un error "

Personalmente recibí un error en MySQL 5.5 si no hay una declaración, así que siempre pongo al menos una declaración de "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" o "READS SQL DATA" independientemente de otras declaraciones que pueda tener.

LEE DATOS SQL Esto le dice explícitamente a MySQL que la función SÓLO leerá datos de bases de datos, por lo tanto, no contiene instrucciones que modifiquen datos, pero contiene instrucciones SQL que leen datos (eq SELECT).

MODIFICA DATOS SQL Esto indica que la rutina contiene sentencias que pueden escribir datos (por ejemplo, contiene instrucciones UPDATE, INSERT, DELETE o ALTER).

NO SQL Esto indica que la rutina no contiene sentencias SQL.

CONTIENE SQL Esto indica que la rutina contiene instrucciones SQL, pero no contiene sentencias que lean o escriban datos. Este es el valor predeterminado si ninguna de estas características se proporciona explícitamente. Ejemplos de tales declaraciones son SELECT NOW (), SELECT 10 + @ b, SET @x = 1 o DO RELEASE_LOCK ('abc'), que se ejecutan pero no leen ni escriben datos.

Tenga en cuenta que hay funciones de MySQL que no son deterministas seguras, como: NOW (), UUID (), etc., que es probable que produzcan resultados diferentes en diferentes máquinas, por lo que una función de usuario que contenga tales instrucciones debe declararse como NO DETERMINISTICA . Además, una función que lee datos de un esquema no replicado es claramente NOETERMINISTA. *

La evaluación de la naturaleza de una rutina se basa en la “honestidad” del creador: MySQL no verifica que una rutina declarada DETERMINISTIC esté libre de declaraciones que produzcan resultados no deterministas. Sin embargo, declarar incorrectamente una rutina puede afectar los resultados o afectar el rendimiento. Declarar una rutina no determinista como DETERMINISTIC puede generar resultados inesperados al hacer que el optimizador tome decisiones incorrectas en el plan de ejecución. Declarar una rutina determinista como NONDETERMINISTIC podría disminuir el rendimiento al hacer que las optimizaciones disponibles no se utilicen.

Donal
fuente
¿Puedes explicarme qué pasó en segundo plano?
ASR
2
Sospecho que la base de datos tiene una función que modifica datos (tiene una declaración de actualización, inserción o eliminación). Para obtener más información, consulte aquí: dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Donal
1
Siempre debe realizar copias de seguridad
Donal
¡Necesita super privilegios!
Felipe Morales
intenté esto pero todavía tengo el problema no determinista, ¿alguna otra sugerencia? gracias
Edwin Bermejo
40
  • Cuando crea una función almacenada, debe declarar que es determinista o que no modifica datos. De lo contrario, puede que no sea seguro para la recuperación o replicación de datos.

  • De forma predeterminada, para que se acepte una sentencia CREATE FUNCTION, se debe especificar explícitamente al menos uno de DETERMINISTIC, NO SQL o READS SQL DATA. De lo contrario, se produce un error:

Para solucionar este problema, agregue las siguientes líneas después de la devolución y antes de comenzar la declaración:

READS SQL DATA
DETERMINISTIC

Por ejemplo :

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

Para obtener más detalles sobre este problema, lea aquí

Soleado SM
fuente
Esto funciona porque la configuración READS SQL DATAes la menos restrictiva de las tres. Si su función entra en la categoría NO SQLo DETERMINISTIC, puede mejorar el rendimiento modificando sus funciones. Por otro lado, la configuración READS SQL DATAtambién es la menos propensa a errores. Entonces, si lo usa incorrectamente NO SQLo DETERMINISTICpuede obtener resultados incorrectos.
Jonathan
@ SunnyS.M, explicación impresionante como READS SQL DATA DETERMINISTIC.Para solucionar este problema, agregue las siguientes líneas después de la declaración de retorno y antes de comenzar:
Md Haidar Ali Khan
4

siguiendo el comentario de Donald:

Esta variable se aplica cuando el registro binario está habilitado.

Todo lo que tenía que hacer era:

  1. log_bin desactivado en my.cnf (#log_bin)
  2. reiniciar mysql
  3. importar DB
  4. habilitar log_bin
  5. reiniciar mysql

Ese paso ese problema de importación.

(Luego revisaré el código del programador para sugerir una mejora)

Mayra Navarro
fuente
3

Cuando su función es determinista, es seguro declararla determinista. La ubicación de la palabra clave "DETERMINISTIC" es la siguiente.

ingrese la descripción de la imagen aquí

Park JongBum
fuente
2

En Windows 10,

Acabo de resolver este problema haciendo lo siguiente.

  1. Vaya a my.ini y agregue estas 2 líneas debajo de [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. reiniciar el servicio MySQL

Preetham
fuente
después de hacer esto, recibí un error en el esclavo -Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Ramratan Gupta
0

¡Intente configurar el definidor de la función!

Entonces en lugar de

CREATE FUNCTION get_pet_owner

escribirás algo parecido a

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

que debería funcionar si el usuario prodacmin tiene derechos para crear funciones / procedimientos.

En mi caso, la función funcionó cuando se generó a través de MySQL Workbench, pero no funcionó cuando se ejecutó directamente como un script SQL. Hacer los cambios anteriores solucionó el problema.

DevKingKev
fuente