Existem duas maneiras de corrigir isso:
Execute o seguinte no console MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Adicione o seguinte ao arquivo de configuração mysql.ini:
log_bin_trust_function_creators = 1;
A configuração relaxa a verificação de funções não determinísticas. Funções não determinísticas são funções que modificam dados (isto é, atualizar, inserir ou deletar instrução (ões)). Para mais informações, veja aqui .
Observe que, se o log binário NÃO estiver habilitado, esta configuração não se aplica.
Registro Binário de Programas Armazenados
Se o log binário não estiver habilitado, log_bin_trust_function_creators não se aplica.
log_bin_trust_function_creators
Esta variável se aplica quando o log binário está habilitado.
A melhor abordagem é um melhor entendimento e uso de declarações determinísticas para funções armazenadas. Essas declarações são usadas pelo MySQL para otimizar a replicação e é bom escolhê-las com cuidado para ter uma replicação saudável.
DETERMINISTICO
Uma rotina é considerada “determinística” se sempre produzir o mesmo resultado para os mesmos parâmetros de entrada e NÃO DETERMINÍSTICA caso contrário. Isso é usado principalmente com processamento de string ou matemático, mas não se limita a isso.
NÃO DETERMINISTICO
Oposto de "DETERMINISTAS". " Se nem DETERMINISTIC nem NOT DETERMINISTIC forem fornecidos na definição da rotina, o padrão é NOT DETERMINISTIC. Para declarar que uma função é determinística, você deve especificar DETERMINISTIC explicitamente. ". Portanto, parece que, se nenhuma declaração for feita, o MySQL tratará a função como "NÃO DETERMINISTICA". Esta declaração do manual está em contradição com outra declaração de outra área do manual que diz que: "Ao criar uma função armazenada, você deve declarar que ela é determinística ou que não modifica os dados. Caso contrário, pode não ser seguro para recuperação ou replicação de dados. Por padrão, para que uma instrução CREATE FUNCTION seja aceita, pelo menos um DETERMINISTIC, NO SQL ou READS SQL DATA deve ser especificado explicitamente. Caso contrário, ocorre um erro "
Eu pessoalmente recebi um erro no MySQL 5.5 se não houver nenhuma declaração, então eu sempre coloco pelo menos uma declaração de "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" ou "READS SQL DATA" independente de outras declarações que eu possa ter.
READS SQL DATA
Isto diz explicitamente ao MySQL que a função irá SOMENTE ler dados de bancos de dados, portanto, não contém instruções que modificam os dados, mas contém instruções SQL que lêem os dados (eq SELECT).
MODIFIES SQL DATA
Indica que a rotina contém instruções que podem escrever dados (por exemplo, contém instruções UPDATE, INSERT, DELETE ou ALTER).
NO SQL
Isso indica que a rotina não contém instruções SQL.
CONTAINS SQL
Isso indica que a rotina contém instruções SQL, mas não contém instruções que leem ou gravem dados. Este é o padrão se nenhuma dessas características for fornecida explicitamente. Exemplos de tais instruções são SELECT NOW (), SELECT 10 + @ b, SET @x = 1 ou DO RELEASE_LOCK ('abc'), que executam, mas não lêem nem gravam dados.
Observe que há funções do MySQL que não são deterministicamente seguras, como: NOW (), UUID (), etc, que provavelmente produzirão resultados diferentes em máquinas diferentes, portanto, uma função de usuário que contém tais instruções deve ser declarada como NOT DETERMINISTIC . Além disso, uma função que lê dados de um esquema não replicado é claramente NONDETERMINISTIC. *
A avaliação da natureza de uma rotina é baseada na “honestidade” do criador: o MySQL não verifica se uma rotina declarada DETERMINISTICA está livre de declarações que produzem resultados não determinísticos. No entanto, declarar incorretamente uma rotina pode afetar os resultados ou afetar o desempenho. Declarar uma rotina não determinística como DETERMINISTIC pode levar a resultados inesperados, fazendo com que o otimizador faça escolhas incorretas de plano de execução. Declarar uma rotina determinística como NONDETERMINISTIC pode diminuir o desempenho, fazendo com que as otimizações disponíveis não sejam usadas.
Ao criar uma função armazenada, você deve declarar que ela é determinística ou que não modifica os dados. Caso contrário, pode não ser seguro para recuperação ou replicação de dados.
Por padrão, para que uma instrução CREATE FUNCTION seja aceita, pelo menos um DETERMINISTIC, NO SQL ou READS SQL DATA deve ser especificado explicitamente. Caso contrário, ocorre um erro:
Para corrigir esse problema, adicione as seguintes linhas após a declaração de retorno e antes de começar:
Por exemplo :
Para obter mais detalhes sobre este problema, leia aqui
fonte
READS SQL DATA
é a menos restritiva dos três. Se sua função se enquadrar na categoriaNO SQL
ouDETERMINISTIC
, você pode melhorar o desempenho modificando suas funções. Por outro lado, a configuraçãoREADS SQL DATA
também é a menos sujeita a erros. Portanto, se você usar incorretamenteNO SQL
ouDETERMINISTIC
poderá obter resultados incorretos.seguindo o comentário de Donald:
Tudo que eu tive que fazer foi:
Esse passo para fora desse problema de importação.
(Em seguida, revisarei o código do programador para sugerir uma melhoria)
fonte
Quando sua função é determinística, você pode declará-la com segurança como determinística. A localização da palavra-chave "DETERMINISTIC" é a seguinte.
fonte
No Windows 10,
Acabei de resolver esse problema fazendo o seguinte.
Vá para my.ini e adicione essas 2 linhas em [mysqld]
reinicie o serviço MySQL
fonte
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Experimente definir o definidor para a função!
Então, em vez de
CREATE FUNCTION get_pet_owner
você vai escrever algo semelhante a
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_ownerque deve funcionar se o usuário prodacmin tiver direitos para criar funções / procedimentos.
No meu caso, a função funcionou quando gerada através do MySQL Workbench, mas não funcionou quando executada diretamente como um script SQL. Fazer as alterações acima corrigiu o problema.
fonte