Hay dos formas de solucionar este problema:
Ejecute lo siguiente en la consola MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
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.
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:
Por ejemplo :
Para obtener más detalles sobre este problema, lea aquí
fuente
READS SQL DATA
es la menos restrictiva de las tres. Si su función entra en la categoríaNO SQL
oDETERMINISTIC
, puede mejorar el rendimiento modificando sus funciones. Por otro lado, la configuraciónREADS SQL DATA
también es la menos propensa a errores. Entonces, si lo usa incorrectamenteNO SQL
oDETERMINISTIC
puede obtener resultados incorrectos.siguiendo el comentario de Donald:
Todo lo que tenía que hacer era:
Ese paso ese problema de importación.
(Luego revisaré el código del programador para sugerir una mejora)
fuente
Cuando su función es determinista, es seguro declararla determinista. La ubicación de la palabra clave "DETERMINISTIC" es la siguiente.
fuente
En Windows 10,
Acabo de resolver este problema haciendo lo siguiente.
Vaya a my.ini y agregue estas 2 líneas debajo de [mysqld]
reiniciar el servicio MySQL
fuente
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
¡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_ownerque 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.
fuente