Mysql error 1418

While importing the database in mysql, I have got following error: 1418 (HY000) at line 10185: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logg...

There are two ways to fix this:

  1. Execute the following in the MySQL console:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Add the following to the mysql.ini configuration file:

    log_bin_trust_function_creators = 1;

The setting relaxes the checking for non-deterministic functions. Non-deterministic functions are functions that modify data (i.e. have update, insert or delete statement(s)). For more info, see here.

Please note, if binary logging is NOT enabled, this setting does not apply.

Binary Logging of Stored Programs

If binary logging is not enabled, log_bin_trust_function_creators does
not apply.

log_bin_trust_function_creators

This variable applies when binary logging is enabled.

The best approach is a better understanding and use of deterministic declarations for stored functions. These declarations are used by MySQL to optimize the replication and it is a good thing to choose them carefully to have a healthy replication.

DETERMINISTIC
A routine is considered “deterministic” if it always produces the same result for the same input parameters and NOT DETERMINISTIC otherwise.
This is mostly used with string or math processing, but not limited to that.

NOT DETERMINISTIC
Opposite of «DETERMINISTIC».
«If neither DETERMINISTIC nor NOT DETERMINISTIC is given in the routine definition, the default is NOT DETERMINISTIC. To declare that a function is deterministic, you must specify DETERMINISTIC explicitly.«.
So it seems that if no statement is made, MySQl will treat the function as «NOT DETERMINISTIC».
This statement from manual is in contradiction with other statement from another area of manual which tells that:
» When you create a stored function, you must declare either that it is deterministic or that it does not modify data. Otherwise, it may be unsafe for data recovery or replication.
By default, for a CREATE FUNCTION statement to be accepted, at least one of DETERMINISTIC, NO SQL, or READS SQL DATA must be specified explicitly. Otherwise an error occurs
«

I personally got error in MySQL 5.5 if there is no declaration, so i always put at least one declaration of «DETERMINISTIC», «NOT DETERMINISTIC», «NO SQL» or «READS SQL DATA» regardless other declarations i may have.

READS SQL DATA
This explicitly tells to MySQL that the function will ONLY read data from databases, thus, it does not contain instructions that modify data, but it contains SQL instructions that read data (e.q. SELECT).

MODIFIES SQL DATA
This indicates that the routine contains statements that may write data (for example, it contain UPDATE, INSERT, DELETE or ALTER instructions).

NO SQL
This indicates that the routine contains no SQL statements.

CONTAINS SQL
This indicates that the routine contains SQL instructions, but does not contain statements that read or write data. This is the default if none of these characteristics is given explicitly. Examples of such statements are SELECT NOW(), SELECT 10+@b, SET @x = 1 or DO RELEASE_LOCK(‘abc’), which execute but neither read nor write data.

Note that there are MySQL functions that are not deterministic safe, such as: NOW(), UUID(), etc, which are likely to produce different results on different machines, so a user function that contains such instructions must be declared as NOT DETERMINISTIC.
Also, a function that reads data from an unreplicated schema is clearly NONDETERMINISTIC.
*

Assessment of the nature of a routine is based on the “honesty” of the
creator: MySQL does not check that a routine declared DETERMINISTIC is
free of statements that produce nondeterministic results. However,
misdeclaring a routine might affect results or affect performance.
Declaring a nondeterministic routine as DETERMINISTIC might lead to
unexpected results by causing the optimizer to make incorrect
execution plan choices. Declaring a deterministic routine as
NONDETERMINISTIC might diminish performance by causing available
optimizations not to be used.

Конкретная ошибка:

При использовании mysql для создания и вызова хранимых процедур, функций и триггеров будет отображаться символ ошибки 1418.

ERROR 1418 (HY000): 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)

После некоторых Baidu сводка выглядит следующим образом:

Потому что CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE, ALTER FUNCTION, CALL, DROP PROCEDURE, DROP FUNCTION и другие операторы будут записаны в двоичный журнал и затем выполнены на подчиненном сервере. Однако неопределенная подпрограмма (хранимая процедура, функция, триггер), которая выполняет обновление, не может быть повторена.Выполнение на подчиненном сервере (относительно повторяющееся выполнение с главным сервером) может привести к тому, что восстановленные данные будут отличаться от исходных данных. Сервер отличается от основного сервера.

Чтобы решить эту проблему, MySQL требует:

На главном сервере, если подпрограмма не объявлена ​​детерминированной или не изменяет данные, создание или замена подпрограммы будет отклонена. Это означает, что при создании подпрограммы вы должны либо объявить, что она детерминирована, либо не изменять данные.

Объявить можно двумя способами:

Первый: является ли утверждение детерминированным

ДЕТЕРМИНИСТИЧЕСКИЙ и НЕ ДЕТЕРМИНИСТИЧЕСКИЙ указывают, всегда ли подпрограмма дает одинаковый результат для заданного ввода.

Если функция не указана, значение по умолчанию НЕ ДЕТЕРМИНИСТИЧЕСКОЕ, поэтому ДЕТЕРМИНИСТИЧЕСКОЕ должно быть явно указано, чтобы объявить, что подпрограмма детерминирована. к

Здесь необходимо объяснить следующее: использование функции NOW () (или ее синонима) или функции RAND () не сделает подпрограмму недетерминированной. Для NOW () двоичный журнал включает метку времени и будет выполняться правильно. RAND () можно правильно скопировать, если он вызывается один раз в подпрограмме. Следовательно, можно считать, что отметка времени и начальное значение случайного числа являются детерминированными входными данными подпрограммы, и они одинаковы на главном и подчиненном серверах.

Второй тип: изменит ли оператор данные

СОДЕРЖИТ SQL, НЕТ SQL, ЧТЕНИЕ ДАННЫХ SQL, МОДИФИКАЦИЯ SQL используется для указания того, читает ли подпрограмма данные или записывает их.

Независимо от того, NO SQL или READS SQL DATA, следует отметить, что подпрограмма не изменяет данные, но одна из них должна быть указана явно, потому что, если таковая указана, спецификация по умолчанию — CONTAINS SQL.

По умолчанию, если разрешено принимать операторы CREATE PROCEDURE или CREATE FUNCTION, одно из DETERMINISTIC или NO SQL и READS SQL DATA должно быть указано явно, иначе возникнет ошибка 1418.

Решение:

Также есть два решения:

Первый — объявить одно из DETERMINISTIC или NO SQL и READS SQL DATA при создании подпрограммы (хранимой процедуры, функции, триггера), например:

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()
    DETERMINISTIC
BEGIN
 #Routine body goes here...
END;

Второй — доверять создателю подпрограммы. Запрещается создавать или изменять подпрограмму в соответствии с требованиями разрешений SUPER. Установите глобальную системную переменную log_bin_trust_routine_creators в 1. Есть три способа настройки:

1. Выполните команду SET GLOBAL log_bin_trust_function_creators = 1 на клиенте.

2. При запуске MySQL добавьте —log-bin-trust-function-creators, чтобы выбрать таланты, и установите для параметра значение 1.

3. Добавьте log-bin-trust-function-creators = 1 в раздел [mysqld] файла конфигурации MySQL my.ini или my.cnf.

Источник статьи:http://blog.sina.com.cn/s/blog_6f68845001013k8a.html

Cause analysis and solution of mysql error 1418

Specific error:

Use mysql to create and call stored procedures,Functions and triggers will have an error symbol of 1418.

error 1418 (hy000):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)

After some Baidu,Summarized as follows:

Because create procedure, create function, alter procedure, alter function, call, drop procedure, drop function and other statements will be written into the binary log,Then execute it on the slave.However, an indeterminate subroutine (stored procedure, function, trigger) that performs an update is non-repeatable,Execution on the slave server (relative to the master server is repeated) may cause the recovered data to be different from the original data,The slave server is different from the master server.

To solve this problem,mysql mandatory requirements:

On the master server,Unless the subroutine is declared deterministic or does not change data,Otherwise, creating or replacing subroutines will be rejected.This means that when creating a subroutine,Must either declare it deterministic,Either it doesn’t change the data.

There are two ways to declare:

The first:whether the statement is deterministic

deterministic and not deterministic indicate whether a subroutine always produces the same result for a given input.

If no feature is given,The default is not deterministic, so deterministic must be explicitly specified to declare a subroutine to be deterministic.

The point here is that using the now () function (or its synonym) or the rand () function does not make a subroutine nondeterministic.For now (), the binary log includes a timestamp and will be executed correctly.rand () can be copied correctly as long as it is called once in a subroutine.Therefore, the timestamp and random number seed can be considered as the deterministic inputs of the subroutine.They are the same on the master and slave servers.

Second:whether the statement will change the data

contains sql, no sql, reads sql data, modifies sql to indicate whether the subroutine reads or writes data.

Both no sql and reads sql data indicate that the subroutine has not changed the data.But one must be explicitly specified,Because if anyThe default designation is contains sql.

by default,If create procedure or create function statements are allowed,You must explicitly specify one of deterministic or no sql and reads sql data,Otherwise, a 1418 error will be generated.

Solution:

There are two solutions,

The first is when the subroutine (stored procedure, function, trigger) is created, declared as deterministic or no sql and reads sql data,

E.g:

create definer=current_user procedure `newproc` ()
  deterministic
begin
 #routine body goes here ...
end;

The second is the creator of the trusted subroutine, prohibit the requirement of super permissions when creating and modifying subroutines,Set the log_bin_trust_routine_creators global system variable to 1. There are three setting methods:

1.Execute set global log_bin_trust_function_creators=1 on the client;

2.When MySQL is started, add —log-bin-trust-function-creators to select the candidate and set the parameter to 1.

3. Add log-bin-trust-function-creators=1 to the [mysqld] section in the mysql configuration file my.ini or my.cnf

Like this post? Please share to your friends:
  • Mysql error 1273
  • Nastran error 4276
  • Nano error writing no such file or directory
  • Named entity expected got none как исправить
  • Mysql error 1045 28000 access denied for user odbc localhost using password no